Skip to content

EXAMPLES parametrize, fixture and mock

import datetime  


def outdated_products(products: list) -> list:  
    return [product["name"] for product in products  
            if product["expiration_date"] < datetime.date.today()]

Tests:

from datetime import date  
from unittest import mock  
from unittest.mock import MagicMock  

import pytest  

from app.main import outdated_products  


class TestOutdatedProducts:  

    @pytest.fixture()  
    def outdated_products_fixture(self) -> None:  
        list_of_products_dicts = [  
            {  
                "name": "salmon",  
                "expiration_date": date(2022, 2, 10),  
                "price": 600  
            },  
            {  
                "name": "chicken",  
                "expiration_date": date(2022, 2, 5),  
                "price": 120  
            },  
            {  
                "name": "duck",  
                "expiration_date": date(2022, 2, 1),  
                "price": 160  
            }  
        ]  
        return list_of_products_dicts  

    @pytest.mark.parametrize(  
        "today_date,expected_outdated_products",  
        [  
            pytest.param(  
                date(2022, 2, 1),  
                [],  
                id="No expired products by this day"  
            ),  
            pytest.param(  
                date(2022, 2, 2),  
                ["duck"],  
                id="Have expired product by this day"  
            ),  
            pytest.param(  
                date(2022, 2, 6),  
                ["chicken", "duck"],  
                id="Have expired product by this day"  
            ),  
            pytest.param(  
                date(2022, 2, 9),  
                ["chicken", "duck"],  
                id="Have expired product by this day"  
            ),  
            pytest.param(  
                date(2022, 2, 11),  
                ["salmon", "chicken", "duck"],  
                id="Have expired product by this day"  
            )  
        ]  
    )  
    @mock.patch("app.main.datetime.date")  
    def test_outdated_products(self,  
                               mocked_date_function: MagicMock,  
                               today_date: date,  
                               expected_outdated_products: list,  
                               outdated_products_fixture: list[dict]  
                               ) -> None:  

        mocked_date_function.today.return_value = today_date  
        assert outdated_products(outdated_products_fixture) == expected_outdated_products

P.S After @mock.patch in def test_outdated_products first (after self) parameter MUST be mocked function name!!!! Then parameters from parametrize, and last - fixtures

EXAMPLE 2 (mock.patch, mark.parametrize, pytest.param):

Main:

import datetime  
import requests  


def valid_google_url(url: str) -> bool:  
    response = requests.get(url)  
    return True if response.status_code == 200 else False  


def has_internet_connection() -> bool:  
    current_time = datetime.datetime.now()  
    return True if current_time.hour in range(6, 23) else False  


def can_access_google_page(url: str) -> str:  
    if has_internet_connection() and valid_google_url(url):  
        return "Accessible"  
    else:  
        return "Not accessible"

Tests:

from unittest import mock  
from unittest.mock import MagicMock  

from app.main import can_access_google_page  

import pytest  


class TestCanAccessGooglePage:  
    @pytest.mark.parametrize(  
        "input_url,url_is_valid,has_internet,expected_result",  
        [  
            (  
                "https://anyurl.com/",  
                True,  
                True,  
                "Accessible"  
            ),  
            (  
                "https://anyurl.com/",  
                False,  
                True,  
                "Not accessible"  
            ),  
            (  
                "https://anyurl.com/",  
                True,  
                False,  
                "Not accessible"  
            ),  
            (  
                "https://anyurl.com/",  
                False,  
                False,  
                "Not accessible"  
            )  
        ],  
        ids=[  
            "Accessible when url is valid \  
and Internet connection exists",  
            "Not accessible when url is invalid \  
and Internet connection exists",  
            "Not accessible when url is valid \  
and Internet connection does not exist",  
            "Test when url is not valid and \  
Internet connection does not exist"  
        ]  
    )  
    @mock.patch("app.main.valid_google_url")  
    @mock.patch("app.main.has_internet_connection")  
    def test_can_access_google_paged(self,  
                                     mocked_valid_google_url: MagicMock,  
                                     mocked_has_internet: MagicMock,  
                                     input_url: str,  
                                     url_is_valid: bool,  
                                     has_internet: bool,  
                                     expected_result: str) -> None:  
        mocked_valid_google_url.return_value = url_is_valid  
        mocked_has_internet.return_value = has_internet  
        assert can_access_google_page(input_url) == expected_result