Back to Repositories

Validating Textbox Component Integration in gradio-app/gradio

This test suite validates the Gradio Textbox component functionality through comprehensive unit testing. It covers core textbox operations, interface integration, and configuration handling to ensure reliable text input processing.

Test Coverage Overview

The test suite provides extensive coverage of the Gradio Textbox component’s core functionality.

  • Component function testing including preprocess, postprocess, and serialization
  • Interface integration testing for both input and output scenarios
  • Configuration validation and static value handling
  • Edge cases for different input types and error conditions

Implementation Analysis

The testing approach utilizes pytest’s powerful features for thorough component validation.

Key implementation patterns include:
  • Async testing with pytest.mark.asyncio for interface operations
  • Systematic validation of configuration parameters
  • Type handling verification across different input formats
  • Template override testing for customization scenarios

Technical Details

  • Testing Framework: pytest
  • Component: Gradio Textbox
  • Test Scope: Unit tests
  • Key Features Tested: Input processing, configuration, interface integration
  • Validation Methods: Assert statements, exception handling

Best Practices Demonstrated

The test suite exemplifies strong testing practices in Python component validation.

  • Comprehensive function-level documentation
  • Systematic test organization by functionality
  • Thorough edge case coverage
  • Clear test method naming conventions
  • Efficient use of pytest fixtures and decorators

gradio-app/gradio

test/components/test_textbox.py

            
import pytest

import gradio as gr


class TestTextbox:
    def test_component_functions(self):
        """
        Preprocess, postprocess, serialize, tokenize, get_config
        """
        text_input = gr.Textbox()
        assert text_input.preprocess("Hello World!") == "Hello World!"
        assert text_input.postprocess("Hello World!") == "Hello World!"
        assert text_input.postprocess(None) is None
        assert text_input.postprocess("Ali") == "Ali"
        assert text_input.postprocess(2) == "2"  # type: ignore
        assert text_input.postprocess(2.14) == "2.14"  # type: ignore
        assert text_input.get_config() == {
            "lines": 1,
            "max_lines": 20,
            "placeholder": None,
            "value": None,
            "name": "textbox",
            "show_copy_button": False,
            "show_label": True,
            "type": "text",
            "label": None,
            "container": True,
            "min_width": 160,
            "scale": None,
            "elem_id": None,
            "elem_classes": [],
            "visible": True,
            "interactive": None,
            "proxy_url": None,
            "rtl": False,
            "text_align": None,
            "autofocus": False,
            "_selectable": False,
            "key": None,
            "info": None,
            "autoscroll": True,
            "max_length": None,
            "submit_btn": False,
            "stop_btn": False,
        }

    @pytest.mark.asyncio
    async def test_in_interface_as_input(self):
        """
        Interface, process
        """
        iface = gr.Interface(lambda x: x[::-1], "textbox", "textbox")
        assert iface("Hello") == "olleH"

    def test_in_interface_as_output(self):
        """
        Interface, process

        """
        iface = gr.Interface(lambda x: x[-1], "textbox", gr.Textbox())
        assert iface("Hello") == "o"
        iface = gr.Interface(lambda x: x / 2, "number", gr.Textbox())
        assert iface(10) == "5.0"

    def test_static(self):
        """
        postprocess
        """
        component = gr.Textbox("abc")
        assert component.get_config().get("value") == "abc"

    def test_override_template(self):
        """
        override template
        """
        component = gr.TextArea(value="abc")
        assert component.get_config().get("value") == "abc"
        assert component.get_config().get("lines") == 7
        component = gr.TextArea(value="abc", lines=4)
        assert component.get_config().get("value") == "abc"
        assert component.get_config().get("lines") == 4

    def test_faulty_type(self):
        with pytest.raises(
            ValueError, match='`type` must be one of "text", "password", or "email".'
        ):
            gr.Textbox(type="boo")  # type: ignore

    def test_max_lines(self):
        assert gr.Textbox(type="password").get_config().get("max_lines") == 1
        assert gr.Textbox(type="email").get_config().get("max_lines") == 1
        assert gr.Textbox(type="text").get_config().get("max_lines") == 20
        assert gr.Textbox().get_config().get("max_lines") == 20