Unofficial asynchronous python wrapper for paystack payment.
asyncdefinitiate_transaction(
self, user_email: str, amount: int, reference: str=None
) ->Tuple[bool, Union[Dict, str]]:
""" This function initiates a transaction for a user :param user_email: The email of the user you want to initiate a transaction for :type user_email: str :param amount: The amount to be charged :type amount: int :param amount: The reference of the transaction :type reference: str :return::return: A tuple of the status and the data. """asyncwithhttpx.AsyncClient() asclient:
data= {"email": f"{user_email}", "amount": int(amount)}
url=self.base_url+"transaction/initialize"ifreference:
data["reference"] =referenceresponse=awaitclient.post(
url, headers=self.headers(), data=json.dumps(data)
)
ifresponse.status_code==200:
response_data=response.json()
returnresponse_data["status"], response_data["data"]
response_data=response.json()
returnresponse_data["status"], response_data["messsage"]To see the code in action, run the following to command to start your python shell:
pythonorpython -iif you are in the same directory of the codebase.Write the following codes inside the shell:
>>> import asyncio >>> from async_paystack.paystack.transactions import Transactions >>> >>> >>> trx = Transactions() >>> status, data = asyncio.run(trx.initiate_transaction("youremailaddress.com", 50000 * 100, "refrenceisdmik")) # we need to convert naira to kobo before sending to paystack >>> >>> >>> status True >>> data {'authorization_url': 'https://checkout.paystack.com/access_code', 'access_code': 'gibberish', 'reference': 'refrenceisdmik'}
It is important that when run this code in Django without the asynchronous support, be sure to call the it with the asyncio.run(...) method.
In the test_initiate_transaction example, I:
- Imported the necessary modules and defined the test function using the
@pytest.mark.asynciodecorator to indicate it's an asynchronous test case. - Created an instance of the class
(Transactions)that contains theinitiate_transactionmethod to be tested. - Mocked the
httpx.AsyncClientclass and its post method usingmock.AsyncMock()andmock.MagicMock(), respectively. I set the status_code of the response to200and define the JSON response to match the expected behavior. - Set the mocked client as the client used in the
Transactionsinstance by assigning it to the client attribute of the instance. - Call the
initiate_transactionmethod with test data (user_email and amount). - Asserted that the returned result matches the expected result.
- Finally, I asserted that the post method of the mocked client was called with the expected parameters.
Ensure that the necessary modules (pytest, pytest-asyncio, mock) are installed in your environment for running the test.
All contributions are welcome:
- Read the issues, Fork the project and do a Pull Request.
- Request a new topic creating a New issue with the enhancement tag.
- Find any kind of errors in the README and create a New issue with the details or fork the project and do a Pull Request.
- Suggest a better or more pythonic way for existing examples.