96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
# tests/test_utils.py
|
|
import pytest
|
|
import os
|
|
import time
|
|
from unittest import mock
|
|
from selenium.webdriver.remote.webelement import WebElement
|
|
from src.utils import ensure_chrome_profile, is_scrollable, scroll_slow, chrome_browser_options, printred, printyellow
|
|
|
|
# Mocking logging to avoid actual file writing
|
|
@pytest.fixture(autouse=True)
|
|
def mock_logger(mocker):
|
|
mocker.patch("src.utils.logger")
|
|
|
|
# Test ensure_chrome_profile function
|
|
def test_ensure_chrome_profile(mocker):
|
|
mocker.patch("os.path.exists", return_value=False) # Pretend directory doesn't exist
|
|
mocker.patch("os.makedirs") # Mock making directories
|
|
|
|
# Call the function
|
|
profile_path = ensure_chrome_profile()
|
|
|
|
# Verify that os.makedirs was called twice to create the directory
|
|
assert profile_path.endswith("linkedin_profile")
|
|
assert os.path.exists.called
|
|
assert os.makedirs.called
|
|
|
|
# Test is_scrollable function
|
|
def test_is_scrollable(mocker):
|
|
mock_element = mocker.Mock(spec=WebElement)
|
|
mock_element.get_attribute.side_effect = lambda attr: "1000" if attr == "scrollHeight" else "500"
|
|
|
|
# Call the function
|
|
scrollable = is_scrollable(mock_element)
|
|
|
|
# Check the expected outcome
|
|
assert scrollable is True
|
|
mock_element.get_attribute.assert_any_call("scrollHeight")
|
|
mock_element.get_attribute.assert_any_call("clientHeight")
|
|
|
|
# Test scroll_slow function
|
|
def test_scroll_slow(mocker):
|
|
mock_driver = mocker.Mock()
|
|
mock_element = mocker.Mock(spec=WebElement)
|
|
|
|
# Mock element's attributes for scrolling
|
|
mock_element.get_attribute.side_effect = lambda attr: "2000" if attr == "scrollHeight" else "0"
|
|
mock_element.is_displayed.return_value = True
|
|
mocker.patch("time.sleep") # Mock time.sleep to avoid waiting
|
|
|
|
# Call the function
|
|
scroll_slow(mock_driver, mock_element, start=0, end=1000, step=100, reverse=False)
|
|
|
|
# Ensure that scrolling happened multiple times
|
|
assert mock_driver.execute_script.called
|
|
mock_element.is_displayed.assert_called_once()
|
|
|
|
def test_scroll_slow_element_not_scrollable(mocker):
|
|
mock_driver = mocker.Mock()
|
|
mock_element = mocker.Mock(spec=WebElement)
|
|
|
|
# Mock the attributes so the element is not scrollable
|
|
mock_element.get_attribute.side_effect = lambda attr: "1000" if attr == "scrollHeight" else "1000"
|
|
mock_element.is_displayed.return_value = True
|
|
|
|
scroll_slow(mock_driver, mock_element, start=0, end=1000, step=100)
|
|
|
|
# Ensure it detected non-scrollable element
|
|
mock_driver.execute_script.assert_not_called()
|
|
|
|
# Test chrome_browser_options function
|
|
def test_chrome_browser_options(mocker):
|
|
mocker.patch("src.utils.ensure_chrome_profile")
|
|
mocker.patch("os.path.dirname", return_value="/mocked/path")
|
|
mocker.patch("os.path.basename", return_value="profile_directory")
|
|
|
|
mock_options = mocker.Mock()
|
|
|
|
mocker.patch("selenium.webdriver.ChromeOptions", return_value=mock_options)
|
|
|
|
# Call the function
|
|
options = chrome_browser_options()
|
|
|
|
# Ensure options were set
|
|
assert mock_options.add_argument.called
|
|
assert options == mock_options
|
|
|
|
# Test printred and printyellow functions
|
|
def test_printred(mocker):
|
|
mocker.patch("builtins.print")
|
|
printred("Test")
|
|
print.assert_called_once_with("\033[91mTest\033[0m")
|
|
|
|
def test_printyellow(mocker):
|
|
mocker.patch("builtins.print")
|
|
printyellow("Test")
|
|
print.assert_called_once_with("\033[93mTest\033[0m")
|