def test_invalid_click_tracking_view(setup_django): result_metadata = {} request_data = {} request_path = [] class TestClickView(tracking_django.ClickTrackingView): def notify_decoding_error(self, error, request): request_path.append(request.path) def notify_tracking_event(self, tracking_result): result_metadata.update(tracking_result.metadata) request_data.update(tracking_result.request_data) configuration = tracking_django.get_configuration_from_settings() url = get_click_tracking_url( "", metadata=DEFAULT_METADATA, configuration=configuration) path = get_click_tracking_url_path(url, configuration=configuration) request = FakeDjangoRequest() request.path = path + "bbb" with pytest.raises(Http404): TestClickView.as_view()(request, path + "bbb") # No tracking assert not result_metadata assert not request_data assert request_path[0].endswith("bbb")
def test_invalid_click_tracking_view(setup_django): result_metadata = {} request_data = {} request_path = [] class TestClickView(tracking_django.ClickTrackingView): def notify_decoding_error(self, error, request): request_path.append(request.path) def notify_tracking_event(self, tracking_result): result_metadata.update(tracking_result.metadata) request_data.update(tracking_result.request_data) configuration = tracking_django.get_configuration_from_settings() url = get_click_tracking_url("", metadata=DEFAULT_METADATA, configuration=configuration) path = get_click_tracking_url_path(url, configuration=configuration) request = FakeDjangoRequest() request.path = path + "bbb" with pytest.raises(Http404): TestClickView.as_view()(request, path + "bbb") # No tracking assert not result_metadata assert not request_data assert request_path[0].endswith("bbb")
def test_valid_click_tracking_view(setup_django): result_metadata = {} request_data = {} full_tracking_result = {} class TestClickView(tracking_django.ClickTrackingView): def notify_tracking_event(self, tracking_result): full_tracking_result.update( tracking_result.to_json_dict()._asdict()) result_metadata.update(tracking_result.metadata) request_data.update(tracking_result.request_data) configuration = tracking_django.get_configuration_from_settings() url = get_click_tracking_url(DEFAULT_URL_TO_TRACK, metadata=DEFAULT_METADATA, configuration=configuration) path = get_click_tracking_url_path(url, configuration=configuration) request = FakeDjangoRequest() request.META["HTTP_X_REAL_IP"] = "10.10.240.22" request.META["HTTP_USER_AGENT"] = "Firefox" response = TestClickView.as_view()(request, path) assert EXPECTED_METADATA == result_metadata assert request_data ==\ {"user_agent": "Firefox", "user_ip": "10.10.240.22"} assert response.status_code == 302 assert response["Location"] == DEFAULT_ENCODED_URL_TO_TRACK assert not full_tracking_result["is_open_tracking"] assert full_tracking_result["is_click_tracking"]
def test_empty_click_tracking_view(setup_django): result_metadata = {} request_data = {} class TestClickView(tracking_django.ClickTrackingView): def notify_tracking_event(self, tracking_result): result_metadata.update(tracking_result.metadata) request_data.update(tracking_result.request_data) configuration = tracking_django.get_configuration_from_settings() url = get_click_tracking_url( "", metadata=DEFAULT_METADATA, configuration=configuration) path = get_click_tracking_url_path(url, configuration=configuration) request = FakeDjangoRequest() with pytest.raises(Http404): TestClickView.as_view()(request, path) # No tracking assert not result_metadata assert not request_data
def test_embedded_click_tracking_url(): url = get_click_tracking_url( DEFAULT_URL_TO_TRACK, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL, webhook_url=DEFAULT_WEBHOOK_URL, include_webhook_url=True, default_metadata=DEFAULT_DEFAULT_METADATA, include_default_metadata=True, metadata=DEFAULT_METADATA, ) path = get_click_tracking_url_path( url, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL) tracking_result = get_click_tracking_result( path, request_data=DEFAULT_REQUEST_DATA, include_default_metadata=True, include_webhook_url=True) assert tracking_result.tracked_url == DEFAULT_URL_TO_TRACK assert tracking_result.webhook_url == DEFAULT_WEBHOOK_URL assert tracking_result.request_data == DEFAULT_REQUEST_DATA assert tracking_result.metadata == EXPECTED_METADATA assert tracking_result.is_click_tracking assert not tracking_result.is_open_tracking
def test_send_webhook_click(): url = get_click_tracking_url( DEFAULT_URL_TO_TRACK, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL, metadata=DEFAULT_METADATA) path = get_click_tracking_url_path( url, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL) tracking_result = get_click_tracking_result( path, webhook_url=DEFAULT_WEBHOOK_URL) payload = { "is_open_tracking": False, "is_click_tracking": True, "metadata": DEFAULT_METADATA, "request_data": None, "tracked_url": DEFAULT_URL_TO_TRACK, "timestamp": tracking_result.timestamp, } with patch("pytracking.webhook.requests.post") as mocked_post: pytracking.webhook.send_webhook(tracking_result) mocked_post.assert_called_once_with(DEFAULT_WEBHOOK_URL, json=payload, timeout=DEFAULT_TIMEOUT_SECONDS)
def test_minimal_encrypted_get_click_tracking_url(): url = get_click_tracking_url( DEFAULT_URL_TO_TRACK, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL, metadata=DEFAULT_METADATA, encryption_bytestring_key=DEFAULT_ENCRYPTION_KEY) path = get_click_tracking_url_path( url, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL) tracking_result = get_click_tracking_result( path, request_data=DEFAULT_REQUEST_DATA, default_metadata=DEFAULT_DEFAULT_METADATA, webhook_url=DEFAULT_WEBHOOK_URL, encryption_bytestring_key=DEFAULT_ENCRYPTION_KEY) expected_metadata = copy.copy(DEFAULT_DEFAULT_METADATA) expected_metadata.update(DEFAULT_METADATA) assert tracking_result.tracked_url == DEFAULT_URL_TO_TRACK assert tracking_result.webhook_url == DEFAULT_WEBHOOK_URL assert tracking_result.request_data == DEFAULT_REQUEST_DATA assert tracking_result.metadata == expected_metadata assert tracking_result.is_click_tracking assert not tracking_result.is_open_tracking
def test_valid_click_tracking_view(setup_django): result_metadata = {} request_data = {} full_tracking_result = {} class TestClickView(tracking_django.ClickTrackingView): def notify_tracking_event(self, tracking_result): full_tracking_result.update( tracking_result.to_json_dict()._asdict()) result_metadata.update(tracking_result.metadata) request_data.update(tracking_result.request_data) configuration = tracking_django.get_configuration_from_settings() url = get_click_tracking_url( DEFAULT_URL_TO_TRACK, metadata=DEFAULT_METADATA, configuration=configuration) path = get_click_tracking_url_path(url, configuration=configuration) request = FakeDjangoRequest() request.META["HTTP_X_REAL_IP"] = "10.10.240.22" request.META["HTTP_USER_AGENT"] = "Firefox" response = TestClickView.as_view()(request, path) assert EXPECTED_METADATA == result_metadata assert request_data ==\ {"user_agent": "Firefox", "user_ip": "10.10.240.22"} assert response.status_code == 302 assert response["Location"] == DEFAULT_ENCODED_URL_TO_TRACK assert not full_tracking_result["is_open_tracking"] assert full_tracking_result["is_click_tracking"]
def _test_click_tracking(tree): links = tree.xpath("//a") first_link_url_path = get_click_tracking_url_path(links[0].attrib["href"], **DEFAULT_SETTINGS) click_result = get_click_tracking_result(first_link_url_path, **DEFAULT_SETTINGS) assert click_result.metadata == EXPECTED_METADATA assert click_result.tracked_url == "http://www.example.com/foo/?question=response" assert links[1].attrib["href"] == "mailto:[email protected]" second_link_url_path = get_click_tracking_url_path(links[2].attrib["href"], **DEFAULT_SETTINGS) click_result = get_click_tracking_result(second_link_url_path, **DEFAULT_SETTINGS) assert click_result.metadata == EXPECTED_METADATA assert click_result.tracked_url == "http://www.domain2.com"
def _test_click_tracking(tree): links = tree.xpath("//a") first_link_url_path = get_click_tracking_url_path( links[0].attrib["href"], **DEFAULT_SETTINGS) click_result = get_click_tracking_result( first_link_url_path, **DEFAULT_SETTINGS) assert click_result.metadata == EXPECTED_METADATA assert click_result.tracked_url ==\ "http://www.example.com/foo/?question=response" assert links[1].attrib["href"] == "mailto:[email protected]" second_link_url_path = get_click_tracking_url_path( links[2].attrib["href"], **DEFAULT_SETTINGS) click_result = get_click_tracking_result( second_link_url_path, **DEFAULT_SETTINGS) assert click_result.metadata == EXPECTED_METADATA assert click_result.tracked_url == "http://www.domain2.com"
def test_basic_encrypted_get_click_tracking_url(): url = get_click_tracking_url( DEFAULT_URL_TO_TRACK, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL, encryption_bytestring_key=DEFAULT_ENCRYPTION_KEY) path = get_click_tracking_url_path( url, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL) key = Fernet(DEFAULT_ENCRYPTION_KEY) # Can decrypt without raising an exception value = key.decrypt(path.encode("utf-8")) # We can only assert if the value is truthy because the value is encrypted # with a different salt each time. assert value
def test_in_config_click_tracking_url(): url = get_click_tracking_url( DEFAULT_URL_TO_TRACK, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL, metadata=DEFAULT_METADATA) path = get_click_tracking_url_path( url, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL) tracking_result = get_click_tracking_result( path, webhook_url=DEFAULT_WEBHOOK_URL) assert tracking_result.tracked_url == DEFAULT_URL_TO_TRACK assert tracking_result.webhook_url == DEFAULT_WEBHOOK_URL assert tracking_result.request_data is None assert tracking_result.metadata == DEFAULT_METADATA assert tracking_result.is_click_tracking assert not tracking_result.is_open_tracking
def test_embedded_click_tracking_url(): url = get_click_tracking_url( DEFAULT_URL_TO_TRACK, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL, webhook_url=DEFAULT_WEBHOOK_URL, include_webhook_url=True, default_metadata=DEFAULT_DEFAULT_METADATA, include_default_metadata=True, metadata=DEFAULT_METADATA) path = get_click_tracking_url_path( url, base_click_tracking_url=DEFAULT_BASE_CLICK_TRACKING_URL) tracking_result = get_click_tracking_result( path, request_data=DEFAULT_REQUEST_DATA, include_default_metadata=True, include_webhook_url=True) assert tracking_result.tracked_url == DEFAULT_URL_TO_TRACK assert tracking_result.webhook_url == DEFAULT_WEBHOOK_URL assert tracking_result.request_data == DEFAULT_REQUEST_DATA assert tracking_result.metadata == EXPECTED_METADATA assert tracking_result.is_click_tracking assert not tracking_result.is_open_tracking
def test_empty_click_tracking_view(setup_django): result_metadata = {} request_data = {} class TestClickView(tracking_django.ClickTrackingView): def notify_tracking_event(self, tracking_result): result_metadata.update(tracking_result.metadata) request_data.update(tracking_result.request_data) configuration = tracking_django.get_configuration_from_settings() url = get_click_tracking_url("", metadata=DEFAULT_METADATA, configuration=configuration) path = get_click_tracking_url_path(url, configuration=configuration) request = FakeDjangoRequest() with pytest.raises(Http404): TestClickView.as_view()(request, path) # No tracking assert not result_metadata assert not request_data