Skip to content
This repository was archived by the owner on Feb 16, 2023. It is now read-only.

Commit 3fc6c87

Browse files
roman-romanov-oJordan Scott
authored and
Jordan Scott
committed
🎉 Source Mixpanel: increase unit_test coverage up to 90% (airbytehq#13085)
Refactor tests, improve coverage up to 90%
1 parent 7a23932 commit 3fc6c87

File tree

3 files changed

+89
-17
lines changed

3 files changed

+89
-17
lines changed

airbyte-integrations/connectors/source-mixpanel/unit_tests/conftest.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,25 @@
22
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
33
#
44

5+
from datetime import timedelta
6+
57
import pendulum
68
import pytest
79

810

911
@pytest.fixture
10-
def config():
12+
def start_date():
13+
return pendulum.parse("2017-01-25T00:00:00Z").date()
14+
15+
16+
@pytest.fixture
17+
def config(start_date):
1118
return {
1219
"api_secret": "unexisting-secret",
1320
"attribution_window": 5,
1421
"project_timezone": "UTC",
1522
"select_properties_by_default": True,
16-
"start_date": pendulum.parse("2017-01-25T00:00:00Z").date(),
17-
"end_date": pendulum.parse("2017-02-25T00:00:00Z").date(),
23+
"start_date": start_date,
24+
"end_date": start_date + timedelta(days=31),
1825
"region": "US",
1926
}

airbyte-integrations/connectors/source-mixpanel/unit_tests/test_source.py

+23-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
33
#
44

5+
import copy
6+
57
import pytest
68
from airbyte_cdk import AirbyteLogger
79
from source_mixpanel.source import FunnelsList, SourceMixpanel, TokenAuthenticatorBase64
@@ -18,11 +20,21 @@ def check_connection_url(config):
1820
return get_url_to_mock(funnel_list)
1921

2022

21-
@pytest.mark.parametrize("response_code,expect_success", [(200, True), (400, False)])
22-
def test_check_connection(requests_mock, check_connection_url, config, response_code, expect_success):
23-
requests_mock.register_uri("GET", check_connection_url, setup_response(response_code, {}))
23+
@pytest.mark.parametrize(
24+
"response_code,expect_success,response_json",
25+
[
26+
(200, True, {}),
27+
(400, False, {"error": "Request error"}),
28+
(500, False, {"error": "Server error"}),
29+
],
30+
)
31+
def test_check_connection(requests_mock, check_connection_url, config, response_code, expect_success, response_json):
32+
requests_mock.register_uri("GET", check_connection_url, setup_response(response_code, response_json))
2433
ok, error = SourceMixpanel().check_connection(logger, config)
2534
assert ok == expect_success and error != expect_success
35+
expected_error = response_json.get("error")
36+
if expected_error:
37+
assert error == expected_error
2638

2739

2840
def test_check_connection_bad_config():
@@ -40,3 +52,11 @@ def test_check_connection_incomplete(config):
4052
def test_streams(config):
4153
streams = SourceMixpanel().streams(config)
4254
assert len(streams) == 7
55+
56+
57+
def test_streams_string_date(config):
58+
config = copy.deepcopy(config)
59+
config["start_date"] = "2020-01-01"
60+
config["end_date"] = "2020-01-02"
61+
streams = SourceMixpanel().streams(config)
62+
assert len(streams) == 7

airbyte-integrations/connectors/source-mixpanel/unit_tests/test_streams.py

+56-11
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
33
#
44

5+
from datetime import timedelta
56
from unittest.mock import MagicMock
67

8+
import pendulum
79
import pytest
810
from airbyte_cdk import AirbyteLogger
911
from airbyte_cdk.models import SyncMode
@@ -157,24 +159,27 @@ def test_engage_stream_incremental(requests_mock, engage_response):
157159

158160
stream = Engage(authenticator=MagicMock())
159161

160-
records = stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["created"], stream_state={"created": "2008-12-12T11:20:47"})
162+
stream_state = {"created": "2008-12-12T11:20:47"}
163+
records = stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["created"], stream_state=stream_state)
161164

162-
records_length = sum(1 for _ in records)
163-
assert records_length == 1
165+
records = [item for item in records]
166+
assert len(records) == 1
167+
assert stream.get_updated_state(current_stream_state=stream_state, latest_record=records[-1]) == {"created": "2008-12-12T11:20:47"}
164168

165169

166170
def test_cohort_members_stream_incremental(requests_mock, engage_response, cohorts_response):
167171
requests_mock.register_uri("POST", MIXPANEL_BASE_URL + "engage?page_size=1000", engage_response)
168172
requests_mock.register_uri("GET", MIXPANEL_BASE_URL + "cohorts/list", cohorts_response)
169173

170174
stream = CohortMembers(authenticator=MagicMock())
171-
175+
stream_state = {"created": "2008-12-12T11:20:47"}
172176
records = stream.read_records(
173-
sync_mode=SyncMode.incremental, cursor_field=["created"], stream_state={"created": "2008-12-12T11:20:47"}, stream_slice={"id": 1000}
177+
sync_mode=SyncMode.incremental, cursor_field=["created"], stream_state=stream_state, stream_slice={"id": 1000}
174178
)
175179

176-
records_length = sum(1 for _ in records)
177-
assert records_length == 1
180+
records = [item for item in records]
181+
assert len(records) == 1
182+
assert stream.get_updated_state(current_stream_state=stream_state, latest_record=records[-1]) == {"created": "2008-12-12T11:20:47"}
178183

179184

180185
@pytest.fixture
@@ -199,13 +204,15 @@ def funnels_list_url(config):
199204

200205

201206
@pytest.fixture
202-
def funnels_response():
207+
def funnels_response(start_date):
208+
first_date = start_date + timedelta(days=1)
209+
second_date = start_date + timedelta(days=10)
203210
return setup_response(
204211
200,
205212
{
206-
"meta": {"dates": ["2016-09-12" "2016-09-19" "2016-09-26"]},
213+
"meta": {"dates": [str(first_date), str(second_date)]},
207214
"data": {
208-
"2016-09-12": {
215+
str(first_date): {
209216
"steps": [],
210217
"analysis": {
211218
"completion": 20524,
@@ -214,7 +221,7 @@ def funnels_response():
214221
"worst": 1,
215222
},
216223
},
217-
"2016-09-19": {
224+
str(second_date): {
218225
"steps": [],
219226
"analysis": {
220227
"completion": 20500,
@@ -242,6 +249,25 @@ def test_funnels_stream(requests_mock, config, funnels_response, funnels_list_re
242249
records_arr.append(record)
243250

244251
assert len(records_arr) == 4
252+
last_record = records_arr[-1]
253+
# Test without current state date
254+
new_state = stream.get_updated_state(current_stream_state={}, latest_record=records_arr[-1])
255+
assert new_state == {str(last_record["funnel_id"]): {"date": last_record["date"]}}
256+
257+
# Test with current state, that lesser than last record date
258+
last_record_date = pendulum.parse(last_record["date"]).date()
259+
new_state = stream.get_updated_state(
260+
current_stream_state={str(last_record["funnel_id"]): {"date": str(last_record_date - timedelta(days=1))}},
261+
latest_record=records_arr[-1],
262+
)
263+
assert new_state == {str(last_record["funnel_id"]): {"date": last_record["date"]}}
264+
265+
# Test with current state, that is greater, than last record date
266+
new_state = stream.get_updated_state(
267+
current_stream_state={str(last_record["funnel_id"]): {"date": str(last_record_date + timedelta(days=1))}},
268+
latest_record=records_arr[-1],
269+
)
270+
assert new_state == {str(last_record["funnel_id"]): {"date": str(last_record_date + timedelta(days=1))}}
245271

246272

247273
@pytest.fixture
@@ -269,6 +295,25 @@ def test_engage_schema(requests_mock, engage_schema_response):
269295
assert records_length == 3
270296

271297

298+
def test_update_engage_schema(requests_mock):
299+
stream = EngageSchema(authenticator=MagicMock())
300+
requests_mock.register_uri(
301+
"GET",
302+
get_url_to_mock(stream),
303+
setup_response(
304+
200,
305+
{
306+
"results": {
307+
"$someNewSchemaField": {"count": 124, "type": "string"},
308+
}
309+
},
310+
),
311+
)
312+
engage_stream = Engage(authenticator=MagicMock())
313+
engage_schema = engage_stream.get_json_schema()
314+
assert "someNewSchemaField" in engage_schema["properties"]
315+
316+
272317
@pytest.fixture
273318
def annotations_response():
274319
return setup_response(

0 commit comments

Comments
 (0)