Python Qualis - Pytest Testing Framework

Rumman Ansari   Software Engineer   2024-04-05 02:14:15   435  Share
Subject Syllabus DetailsSubject Details
☰ TContent
☰Fullscreen

Table of Content:


import sys
import os
sys.path.append(os.getcwd())

from proj.inventory import MobileInventory, InsufficientException
import pytest

class TestingInventoryCreation:
    def test_creating_empty_inventory(self):
        x = MobileInventory()
        assert x.balance_inventory == {}

    def test_creating_specified_inventory(self):
        x = MobileInventory({'iPhone Model X': 100 , 'Xiaomi Model Y': 1000, 'Nokia Model Z': 25})
        assert x.balance_inventory == {'iPhone Model X': 100, 'Xiaomi Model Y': 1000, 'Nokia Model Z': 25}

    def test_creating_inventory_with_list(self):
        with pytest.raises(TypeError) as excinfo:
            MobileInventory(['iPhone Model X', 'Xiaomi Model Y', 'Nokia Model Z'])
        assert "Input inventory must be a dictionary" in str(excinfo.value)

    def test_creating_inventory_with_numeric_keys(self):
        with pytest.raises(ValueError) as excinfo:
            MobileInventory({1: 'iPhone Model X', 2: 'Xiaomi Model Y', 3: 'Nokia Model Z'})
        assert "Mobile model name must be a string" in str(excinfo.value)

    def test_creating_inventory_with_nonnumeric_values(self):
        with pytest.raises(ValueError) as excinfo:
            MobileInventory({'iPhone Model X': '100', 'Xiaomi Model Y': '1000', 'Nokia Model Z': '25'})
        assert "No. of mobiles must be a positive integer" in str(excinfo.value)

    def test_creating_inventory_with_negative_value(self):
        with pytest.raises(ValueError) as excinfo:
            MobileInventory({'iPhone Model X': -45, 'Xiaomi Model Y': 200, 'Nokia Model Z': 25})
        assert "No. of mobiles must be a positive integer" in str(excinfo.value)


class TestInventoryAddStock:
    @classmethod
    def setup_class(cls):
        cls.inventory = MobileInventory({'iPhone Model X': 100, 'Xiaomi Model Y': 1000, 'Nokia Model Z': 25})

    def test_add_new_stock_as_dict(self):
        self.inventory.add_stock({"iPhone Model X": 50, "Xiaomi Model Y": 2000, "Nokia Model A": 10})
        assert self.inventory.balance_inventory == {'iPhone Model X': 150, 'Xiaomi Model Y': 3000, 'Nokia Model Z': 25, 'Nokia Model A': 10}

    def test_add_new_stock_as_list(self):
        with pytest.raises(TypeError) as excinfo:
            self.inventory.add_stock(['iPhone Model X', 'Xiaomi Model Y', 'Nokia Model Z'])
        assert "Input stock must be a dictionary" in str(excinfo.value)

    def test_add_new_stock_with_numeric_keys(self):
        with pytest.raises(ValueError) as excinfo:
            self.inventory.add_stock({1: 'iPhone Model A', 2: 'Xiaomi Model B', 3: 'Nokia Model C'})
        assert "Mobile model name must be a string" in str(excinfo.value)

    def test_add_new_stock_with_nonnumeric_values(self):
        with pytest.raises(ValueError) as excinfo:
            self.inventory.add_stock({'iPhone Model A': '50', 'Xiaomi Model B': '2000', 'Nokia Model C': '25'})
        assert "No. of mobiles must be a positive integer" in str(excinfo.value)

    def test_add_new_stock_with_float_values(self):
        with pytest.raises(ValueError) as excinfo:
            self.inventory.add_stock({'iPhone Model A': 50.5, 'Xiaomi Model B': 2000.3, 'Nokia Model C': 25})
        assert "No. of mobiles must be a positive integer" in str(excinfo.value)


class TestInventorySellStock:
    @classmethod
    def setup_class(cls):
        cls.inventory = MobileInventory({'iPhone Model A': 50, 'Xiaomi Model B': 2000, 'Nokia Model C': 10, 'Sony Model D': 1})

    def test_sell_stock_as_dict(self):
        self.inventory.sell_stock({'iPhone Model A': 2, 'Xiaomi Model B': 20, 'Sony Model D': 1})
        assert self.inventory.balance_inventory == {'iPhone Model A': 48, 'Xiaomi Model B': 1980, 'Nokia Model C': 10, 'Sony Model D': 0}

    def test_sell_stock_as_list(self):
        with pytest.raises(TypeError) as excinfo:
            self.inventory.sell_stock(['iPhone Model A', 'Xiaomi Model B', 'Nokia Model C'])
        assert "Requested stock must be a dictionary" in str(excinfo.value)

    def test_sell_stock_with_numeric_keys(self):
        with pytest.raises(ValueError) as excinfo:
            self.inventory.sell_stock({1: 'iPhone Model A', 2: 'Xiaomi Model B', 3: 'Nokia Model C'})
        assert "Mobile model name must be a string" in str(excinfo.value)

    def test_sell_stock_with_nonnumeric_values(self):
        with pytest.raises(ValueError) as excinfo:
            self.inventory.sell_stock({'iPhone Model A': '2', 'Xiaomi Model B': '3', 'Nokia Model C': '4'})
        assert "No. of mobiles must be a positive integer" in str(excinfo.value)

    def test_sell_stock_with_float_values(self):
        with pytest.raises(ValueError) as excinfo:
            self.inventory.sell_stock({'iPhone Model A': 2.5, 'Xiaomi Model B': 3.1, 'Nokia Model C': 4})
        assert "No. of mobiles must be a positive integer" in str(excinfo.value)

    def test_sell_stock_of_nonexisting_model(self):
        with pytest.raises(InsufficientException) as excinfo:
            self.inventory.sell_stock({'iPhone Model B': 2, 'Xiaomi Model B': 5})
        assert "No Stock. New Model Request" in str(excinfo.value)

    def test_sell_stock_of_insufficient_stock(self):
        with pytest.raises(InsufficientException) as excinfo:
            self.inventory.sell_stock({'iPhone Model A': 2, 'Xiaomi Model B': 5, 'Nokia Model C': 15})
        assert "Insufficient Stock" in str(excinfo.value)



Stay Ahead of the Curve! Check out these trending topics and sharpen your skills.