api_diff / tests /test_utility.py
kumudraj01's picture
Add application file
2d9b352
Raw
History Blame Contribute Delete
4.31 kB
"""Unit tests for utility functions used in API comparison."""
from unittest.mock import AsyncMock, patch
import aiohttp
import pytest
from utils.utility import (
validate_urls,
validate_json_inputs,
parse_json_input,
compare_responses,
json_line_diff,
highlight_json_diff,
fetch_api_responses
)
def test_validate_urls():
"""Test URL validation including valid, invalid, and duplicate cases."""
validate_urls("http://example.com", "http://api.example.com")
with pytest.raises(ValueError):
validate_urls("not-a-url", "http://example.com")
with pytest.raises(ValueError):
validate_urls("http://example.com", "http://example.com")
def test_validate_json_inputs():
"""Test validation of JSON inputs, including valid and invalid cases."""
validate_json_inputs(
('{"key": "value"}', "Test 1"),
('[]', "Test 2")
)
with pytest.raises(ValueError):
validate_json_inputs(
('{invalid}', "Test Invalid"),
('{}', "Test Valid")
)
def test_parse_json_input():
"""Test parsing of valid and invalid JSON strings."""
assert parse_json_input('{"test": "data"}', "Test") == {"test": "data"}
assert parse_json_input('[]', "Test") == []
assert parse_json_input('{}', "Test") == {}
with pytest.raises(ValueError):
parse_json_input('{invalid}', "Test Invalid")
def test_compare_responses():
"""Test comparison of two JSON responses in tree and text views."""
json1 = {"key1": "val1", "key2": "val2"}
json2 = {"key1": "val1", "key3": "val3"}
tree_diff = compare_responses(json1, json2, view="tree")
assert isinstance(tree_diff, dict)
assert "dictionary_item_removed" in str(tree_diff)
assert "dictionary_item_added" in str(tree_diff)
text_diff = compare_responses(json1, json2, view="text")
assert isinstance(text_diff, str)
assert "key2" in text_diff
assert "key3" in text_diff
def test_json_line_diff():
"""Test line-by-line difference between two JSON objects."""
json1 = {"test": "data1"}
json2 = {"test": "data2"}
diff = json_line_diff(json1, json2)
assert isinstance(diff, str)
assert "data1" in diff
assert "data2" in diff
def test_highlight_json_diff():
"""Test HTML highlighting of differences between two JSON objects."""
json1 = {"test": "data1"}
json2 = {"test": "data2"}
html1, html2 = highlight_json_diff(json1, json2)
assert isinstance(html1, str)
assert isinstance(html2, str)
assert "data1" in html1
assert "data2" in html2
@pytest.mark.asyncio
async def test_fetch_api_responses():
"""Test the fetch_api_responses function with proper async mocks, including SSL."""
mock_data = {"test": "data"}
# Mock a single response
mock_response = AsyncMock()
mock_response.json.return_value = mock_data
mock_response.status = 200
mock_response.__aenter__.return_value = mock_response
# Create session mock
mock_session = AsyncMock(spec=aiohttp.ClientSession)
mock_session.__aenter__.return_value = mock_session
mock_session.request.side_effect = [mock_response, mock_response]
with patch('aiohttp.ClientSession', return_value=mock_session):
responses = await fetch_api_responses(
"http://api1.example.com", "GET", {}, {},
"http://api2.example.com", "GET", {}, {}
)
assert len(responses) == 2
response1, time1 = responses[0]
response2, time2 = responses[1]
assert response1['data'] == mock_data
assert response2['data'] == mock_data
assert response1['status'] == 200
assert response2['status'] == 200
assert isinstance(time1, float)
assert isinstance(time2, float)
assert mock_session.request.call_count == 2
expected_kwargs = {
'method': 'GET',
'json': None,
'params': {},
'headers': {},
'timeout': 30,
'ssl': None
}
mock_session.request.assert_any_call(
url="http://api1.example.com",
**expected_kwargs
)
mock_session.request.assert_any_call(
url="http://api2.example.com",
**expected_kwargs
)