Python Testing With a Queue

Here is the Queue

class Queue:
    def __init__(self):
        self.items = []

    def is_empty(self):
        """Check if the queue is empty."""
        return len(self.items) == 0

    def enqueue(self, item):
        """Add an item to the back of the queue."""
        self.items.append(item)
        print(f"Added '{item}' to queue.")

    def dequeue(self):
        """Remove an item from the front of the queue."""
        if self.is_empty():
            print("Queue is empty. Nothing to remove.")
            return None
        removed = self.items.pop(0)
        print(f"Removed '{removed}' from queue.")
        return removed

    def change(self, index, new_value):
        """Change the value at a given position."""
        if 0 <= index < len(self.items):
            old_value = self.items[index]
            self.items[index] = new_value
            print(f"Changed item at index {index} from '{old_value}' to '{new_value}'.")
        else:
            print("Invalid index. No changes made.")

    def display(self):
        """Display all items in the queue."""
        if self.is_empty():
            print("Queue is empty.")
        else:
            print("Current queue:", self.items)

# Example usage
if __name__ == "__main__":
    q = Queue()
    q.enqueue("Task1")
    q.enqueue("Task2")
    q.enqueue("Task3")
    q.display()
    q.change(1, "UpdatedTask2")
    q.display()
    q.dequeue()
    q.display()

Here is the Python Test using unittest

import unittest
#import pytest
from python_queue import Queue


class TestQueue(unittest.TestCase):

    def setUp(self):
        """Run before each test — creates a fresh queue instance."""
        self.q = Queue()

    def test_enqueue(self):
        """Test adding items to the queue."""
        self.q.enqueue("A")
        self.q.enqueue("B")
        self.assertEqual(self.q.items, ["A", "B"])

    def test_dequeue(self):
        """Test removing items from the front of the queue."""
        self.q.enqueue("A")
        self.q.enqueue("B")
        removed = self.q.dequeue()
        self.assertEqual(removed, "A")          # first in, first out
        self.assertEqual(self.q.items, ["B"])   # remaining queue

    def test_dequeue_empty(self):
        """Test that dequeue returns None when queue is empty."""
        result = self.q.dequeue()
        self.assertIsNone(result)
        self.assertEqual(self.q.items, [])

    def test_change_valid_index(self):
        """Test changing an item at a valid index."""
        self.q.enqueue("Task1")
        self.q.enqueue("Task2")
        self.q.change(1, "UpdatedTask2")
        self.assertEqual(self.q.items, ["Task1", "UpdatedTask2"])

    def test_change_invalid_index(self):
        """Test changing with an invalid index does nothing."""
        self.q.enqueue("Task1")
        self.q.change(5, "Invalid")
        self.assertEqual(self.q.items, ["Task1"])  # no change expected

    def test_is_empty(self):
        """Test is_empty works correctly."""
        self.assertTrue(self.q.is_empty())
        self.q.enqueue("X")
        self.assertFalse(self.q.is_empty())

if __name__ == "__main__":
    unittest.main()