In the process of implementing the connected social media in Open Event API server, there was a situation where we need to mock third party API services like Google OAuth, Facebook Graph API. In mocking, we try to run our tests on APIs Simulation instead of Original API such that it responds with dummy data similar to original APIs.
To implement this first we need the library support in our Orga Server to mock APIs, so the library that was used for this purpose is the httmock library for Python. One of my mentors @hongquan helped me to understand the approach that we will follow to get this implemented. So according to implementation, when we make a HTTP request to any API through tests then our implementation with httmock will be such that it
- stands in the middle of the request,
- Stops the request from going to the original API,
- and returns a dummy response as if the response is from original API.
The content of this response is written by us in the test case. We have to make sure that it is same type of object as we receive from original API.
Steps to follow ( on mocking Google OAuth API )
- Look for response object on two requests (OAuth and profile details).
- Create the dummy response using the sample response object.
- Creating endpoints using the httpmock library.
- During test run, calling the specific method with HTTMock
Sample object of OAuth Response from Google is:
{ "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"Bearer", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" }
and from the sample object of Google Profile API we needed the link of profile for our API-server:
{'link':'http://google.com/some_id'}
Creating the dummy response
Creating dummy response was easy. All I had to do is provide proper header and content in response and use @urlmatch decorator
# response for getting userinfo from google
@urlmatch(netloc='https://www.googleapis.com/userinfo/v2/me') def google_profile_mock(url, request): headers = {'content-type': 'application/json'} content = {'link':'http://google.com/some_id'} return response(200, content, headers, None, 5, request) @urlmatch(netloc=r'(.*\.)?google\.com$') def google_auth_mock(url, request): headers = {'content-type': 'application/json'} content = { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"Bearer", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" } return response(200, content, headers, None, 5, request)
So now we have the end points to mock the response. All we need to do is to use HTTMock inside the test case.
To use this setup all we need to do is:
with HTTMock(google_auth_mock, google_profile_mock): self.assertTrue('Open Event' in self.app.get('/gCallback/?state=dummy_state&code=dummy_code', follow_redirects=True).data) self.assertEqual(self.app.get('/gCallback/?state=dummy_state&code=dummy_code').status_code, 302) self.assertEqual(self.app.get('/gCallback/?state=dummy_state&code=dummy_code').status_code, 302)
And we were able to mock the Google APIs in our test case. Complete implementation in FOSSASIA API-Server can be seen here