ms32035 / trading212-rest

Rest API client for Trading212
Apache License 2.0
3 stars 3 forks source link

Please add unittest and / or unittest.mock #5

Open fransvanberckel opened 3 weeks ago

fransvanberckel commented 3 weeks ago

Please add unittest and / or unittest.mock.

This approach allows you to test all the functions in your API client without making any actual API calls. This ensures that your tests are fast and reliable.

This structure and scripts allow you to easily test the functionality of your Trading212 API client. Run the tests with the following command from the root directory (trading212-rest):

$ python -m unittest discover -s tests

This command searches for all test files in the tests directory and runs the tests

fransvanberckel commented 3 weeks ago

~/trading212_rest/init.py

import requests

class Trading212: def init(self, api_key): self.api_key = api_key self.base_url = "https://demo.trading212.com/api/v0"

def get_headers(self):
    return {
        "Authorization": f"Bearer {self.api_key}"
    }

def get_account_cash(self):
    url = f"{self.base_url}/equity/account/cash"
    response = requests.get(url, headers=self.get_headers())
    return response.json()

def get_account_info(self):
    url = f"{self.base_url}/equity/account/info"
    response = requests.get(url, headers=self.get_headers())
    return response.json()

def get_historical_orders(self):
    url = f"{self.base_url}/equity/history/orders"
    response = requests.get(url, headers=self.get_headers())
    return response.json()

def get_exchanges(self):
    url = f"{self.base_url}/equity/metadata/exchanges"
    response = requests.get(url, headers=self.get_headers())
    return response.json()

def get_instruments(self):
    url = f"{self.base_url}/equity/metadata/instruments"
    response = requests.get(url, headers=self.get_headers())
    return response.json()
fransvanberckel commented 3 weeks ago

~/tests/test_trading212.py

import unittest from unittest.mock import patch from trading212_rest import Trading212

class TestTrading212(unittest.TestCase): def setUp(self): self.api_key = 'test_api_key' self.client = Trading212(self.api_key)

@patch('requests.get')
def test_get_account_cash(self, mock_get):
    mock_response = mock_get.return_value
    mock_response.json.return_value = {'cash': 1000}

    response = self.client.get_account_cash()
    mock_get.assert_called_once_with(
        'https://demo.trading212.com/api/v0/equity/account/cash',
        headers={'Authorization': 'Bearer test_api_key'}
    )
    self.assertEqual(response, {'cash': 1000})

@patch('requests.get')
def test_get_account_info(self, mock_get):
    mock_response = mock_get.return_value
    mock_response.json.return_value = {'account': 'info'}

    response = self.client.get_account_info()
    mock_get.assert_called_once_with(
        'https://demo.trading212.com/api/v0/equity/account/info',
        headers={'Authorization': 'Bearer test_api_key'}
    )
    self.assertEqual(response, {'account': 'info'})

@patch('requests.get')
def test_get_historical_orders(self, mock_get):
    mock_response = mock_get.return_value
    mock_response.json.return_value = [{'order': 'details'}]

    response = self.client.get_historical_orders()
    mock_get.assert_called_once_with(
        'https://demo.trading212.com/api/v0/equity/history/orders',
        headers={'Authorization': 'Bearer test_api_key'}
    )
    self.assertEqual(response, [{'order': 'details'}])

@patch('requests.get')
def test_get_exchanges(self, mock_get):
    mock_response = mock_get.return_value
    mock_response.json.return_value = [{'exchange': 'details'}]

    response = self.client.get_exchanges()
    mock_get.assert_called_once_with(
        'https://demo.trading212.com/api/v0/equity/metadata/exchanges',
        headers={'Authorization': 'Bearer test_api_key'}
    )
    self.assertEqual(response, [{'exchange': 'details'}])

@patch('requests.get')
def test_get_instruments(self, mock_get):
    mock_response = mock_get.return_value
    mock_response.json.return_value = [{'instrument': 'details'}]

    response = self.client.get_instruments()
    mock_get.assert_called_once_with(
        'https://demo.trading212.com/api/v0/equity/metadata/instruments',
        headers={'Authorization': 'Bearer test_api_key'}
    )
    self.assertEqual(response, [{'instrument': 'details'}])

if name == 'main': unittest.main()

ms32035 commented 3 weeks ago

🙄 I was thinking about a PR, not a random script I'd have to adjust