Back to Repositories

Testing UploadButton Component Functionality in gradio-app/gradio

This test suite validates the functionality of the UploadButton component in the Gradio framework, focusing on file handling, preprocessing, and validation. The tests ensure proper handling of single and multiple file uploads while maintaining type safety and backward compatibility.

Test Coverage Overview

The test suite provides comprehensive coverage of the UploadButton component’s core functionality.

  • File preprocessing and path handling validation
  • Multiple file upload support testing
  • Type validation for file_types parameter
  • Backward compatibility verification

Implementation Analysis

The testing approach utilizes pytest’s fixture-based testing patterns with specific focus on component-level validation. The implementation leverages Gradio’s data_classes for FileData and ListFiles, ensuring proper type handling and file processing verification.

  • Component-level unit testing methodology
  • Structured test cases for individual features
  • Error handling validation

Technical Details

  • Testing Framework: pytest
  • Key Dependencies: gradio, gradio_client
  • Test Data: media_data.BASE64_FILE
  • Component Classes: UploadButton, FileData, ListFiles

Best Practices Demonstrated

The test suite exemplifies several testing best practices in Python unit testing.

  • Clear test case isolation and organization
  • Proper exception testing using pytest.raises
  • Type safety validation
  • Comprehensive edge case coverage

gradio-app/gradio

test/components/test_upload_button.py

            
import pytest
from gradio_client import media_data

import gradio as gr
from gradio.data_classes import FileData, ListFiles


class TestUploadButton:
    def test_component_functions(self):
        """
        preprocess
        """
        x_file = FileData(path=media_data.BASE64_FILE["path"])
        upload_input = gr.UploadButton()
        input = upload_input.preprocess(x_file)
        assert isinstance(input, str)

        input1 = upload_input.preprocess(x_file)
        input2 = upload_input.preprocess(x_file)
        assert input1 == input1.name  # type: ignore # Testing backwards compatibility
        assert input1 == input2

    def test_raises_if_file_types_is_not_list(self):
        with pytest.raises(
            ValueError, match="Parameter file_types must be a list. Received int"
        ):
            gr.UploadButton(file_types=2)  # type: ignore

    def test_preprocess_with_multiple_files(self):
        file_data = FileData(path=media_data.BASE64_FILE["path"])
        list_file_data = ListFiles(root=[file_data, file_data])
        upload_input = gr.UploadButton(file_count="directory")
        output = upload_input.preprocess(list_file_data)
        assert isinstance(output, list)
        assert isinstance(output[0], str)