Пример #1
0
class TestConnectAPI:
    def setup_method(self, method):

        batched = defaultdict(list)
        for e in MULTI_EVENT_DATA:
            e = Event(COLLECTION_NAME, e)
            batched[COLLECTION_NAME].append(e.body)

        self.multi_events = batched

        self.single_event = Event(COLLECTION_NAME, SINGLE_EVENT_DATA)
        self.connect = ConnectApi(project_id=PROJECT_ID, api_key=API_PUSH_KEY)

    def test_init(self, post):
        assert PROJECT_ID == self.connect._project_id
        assert API_PUSH_KEY == self.connect._api_key
        assert "https://api.getconnect.io" == self.connect._base_url
        assert 60 == self.connect._get_timeout
        assert 60 == self.connect._post_timeout
        assert isinstance(self.connect._session, Session)

        connect = ConnectApi(
            project_id=PROJECT_ID, api_key=API_PUSH_KEY, base_url="myurl", post_timeout=10, get_timeout=5
        )
        assert connect._base_url == "myurl"
        assert connect._post_timeout == 10
        assert connect._get_timeout == 5

    def test_post_event(self, post):
        # 200 - empty response
        mocked_response = mocked_connect_response(200, None)
        post.return_value = mocked_response
        result = self.connect.post_event(self.single_event)
        assert isinstance(result, responses.PushResponse)
        post.reset_mock()

        with patch("connect.api.ConnectApi._build_response") as build_response:
            self.connect.post_event(self.single_event)
            url = "{0}/events/{1}".format(BASE_URL, COLLECTION_NAME)
            data = json.dumps(self.single_event.body)
            post.assert_called_once_with(url=url, data=data, timeout=60)
            build_response.assert_called_once_with(
                response_body=None, raw_event=self.single_event.body, status_code=200
            )
            build_response.reset_mock()

            # Non-empty response (!= 200)
            body = {"errorMessage": "Maximum event size of 64kb exceeded."}
            mocked_response = mocked_connect_response(413, body)
            post.return_value = mocked_response
            self.connect.post_event(self.single_event)
            build_response.assert_called_once_with(
                response_body=body, raw_event=self.single_event.body, status_code=413
            )

    def test_post_events(self, post):

        events = []
        expected_events = defaultdict(list)
        for e in MULTI_EVENT_DATA:
            events.append(Event(COLLECTION_NAME, e))
            expected_events[COLLECTION_NAME].append(e)

        body = {
            COLLECTION_NAME: [
                {"event": events[0].body, "success": True},
                {
                    "event": events[1].body,
                    "success": False,
                    "message": "An error occured inserting the event please try again.",
                },
            ]
        }
        mocked_response = mocked_connect_response(200, body)
        post.return_value = mocked_response

        result = self.connect.post_events(self.multi_events)
        url = "{0}/events".format(BASE_URL)
        data = json.dumps(self.multi_events)
        post.assert_called_with(url=url, data=data, timeout=60)
        assert isinstance(result, responses.PushBatchResponse)

        with patch("connect.api.ConnectApi._build_batch_response") as build_batch_response:
            self.connect.post_events(self.multi_events)
            build_batch_response.assert_called_once_with(
                response_body=body, events_by_collection=self.multi_events, status_code=200
            )

    def test__build_response(self, post):
        single_event = Event(COLLECTION_NAME, SINGLE_EVENT_DATA)

        r = self.connect._build_response(None, single_event.body, 200)
        assert isinstance(r, responses.PushResponse)
        assert r.error_message is None
        assert r.http_status_code == 200
        assert r.event == single_event.body

        r = self.connect._build_response(None, single_event.body, 401)
        assert isinstance(r, responses.PushResponse)
        assert r.error_message == "Unauthorised. Please check your Project Id and API Key"
        assert r.event == single_event.body
        assert r.http_status_code == 401

        response_body = {"errors": [{"field": "fieldName", "description": "There was an error with this field."}]}

        r = self.connect._build_response(response_body, single_event.body, 422)
        assert isinstance(r, responses.PushResponse)
        assert r.error_message == [{"field": "fieldName", "description": "There was an error with this field."}]
        assert r.event == single_event.body
        assert r.http_status_code == 422

        response_body = {"errorMessage": "Maximum event size of 64kb exceeded."}

        r = self.connect._build_response(response_body, single_event.body, 413)
        assert isinstance(r, responses.PushResponse)
        assert r.error_message == "Maximum event size of 64kb exceeded."
        assert r.event == single_event.body
        assert r.http_status_code == 413

    def test__build_batch_response(self, post):
        response_body = {
            COLLECTION_NAME: [
                {"success": True},
                {"success": False, "message": "An error occurred inserting the event please try again."},
            ],
            "my_collection2": [{"success": True}],
        }
        events = defaultdict(list)
        events["my_collection2"].append(SINGLE_EVENT_DATA)
        events[COLLECTION_NAME] = [e for e in MULTI_EVENT_DATA]
        r = self.connect._build_batch_response(response_body, events, 200)

        assert isinstance(r, responses.PushBatchResponse)
        assert r.http_status_code == 200
        assert r.error_message is None

        # to do: assert event body

        for collection in r.results:
            collection_results = r.results[collection]

            for i in range(0, len(collection_results)):
                assert isinstance(collection_results[i], responses.PushResponse)
                assert collection_results[i].http_status_code is None

                if i == 1:
                    assert collection_results[i].success == False
                    assert (
                        collection_results[i].error_message == "An error occurred inserting the event please try again."
                    )
                    assert collection_results[i].event == MULTI_EVENT_DATA[1]
                else:
                    assert collection_results[i].success == True
                    assert collection_results[i].error_message is None

        response_body = {"errorMessage": "An error occurred while processing your request"}
        r = self.connect._build_batch_response(response_body, events, 500)

        assert r.http_status_code == 500
        assert r.error_message == "An error occurred while processing your request"
        assert r.results == {}

    def test_create_session(self, post):
        s = self.connect._create_session()
        assert isinstance(s, Session)
        assert s.headers["Content-Type"] == "application/json"
        assert s.headers["X-Api-Key"] == API_PUSH_KEY
        assert s.headers["X-Project-Id"] == PROJECT_ID