Back to Repositories

Testing Data Collection Consent Mechanism in gpt-engineer

This test suite validates the data collection consent mechanism in the GPT-Engineer CLI application, ensuring proper handling of user consent through file-based persistence and interactive prompts. The tests cover both the checking and asking of collection consent with comprehensive edge cases.

Test Coverage Overview

The test suite provides comprehensive coverage of the data collection consent functionality:

  • File existence and content validation scenarios
  • User interaction flows for consent collection
  • Edge cases including invalid inputs and retry logic
  • Integration with file system operations

Implementation Analysis

The testing approach utilizes pytest’s powerful fixtures and mocking capabilities to simulate user interactions and file operations. The implementation follows a systematic pattern of testing both the check_collection_consent() and ask_collection_consent() functions through various scenarios, leveraging unittest.mock.patch for input simulation.

Technical Details

  • Testing Framework: pytest
  • Mocking: unittest.mock.patch
  • File Operations: pathlib.Path
  • Fixture-based cleanup
  • Side effect simulation for user inputs

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Proper test isolation using fixtures
  • Comprehensive scenario coverage
  • Clear test case documentation
  • Effective mocking of external dependencies
  • Systematic cleanup of test artifacts

gpt-engineer-org/gpt-engineer

tests/applications/cli/test_collection_consent.py

            
"""
Tests for the revised data collection consent mechanism in the cli/learning module.
"""

from pathlib import Path
from unittest.mock import patch

import pytest

from gpt_engineer.applications.cli.learning import (
    ask_collection_consent,
    check_collection_consent,
)


# Use a fixture to clean up created files after each test
@pytest.fixture
def cleanup():
    yield
    if Path(".gpte_consent").exists():
        Path(".gpte_consent").unlink()


"""
Test the following 4 scenarios for check_collection_consent():
    * The .gpte_consent file exists and its content is "true".
    * The .gpte_consent file exists but its content is not "true".
    * The .gpte_consent file does not exist and the user gives consent when asked.
    * The .gpte_consent file does not exist and the user does not give consent when asked.
"""


def test_check_consent_file_exists_and_true(cleanup):
    Path(".gpte_consent").write_text("true")
    assert check_collection_consent() is True


def test_check_consent_file_exists_and_false(cleanup):
    Path(".gpte_consent").write_text("false")
    with patch("builtins.input", side_effect=["n"]):
        assert check_collection_consent() is False


def test_check_consent_file_not_exists_and_user_says_yes(cleanup):
    with patch("builtins.input", side_effect=["y"]):
        assert check_collection_consent() is True
    assert Path(".gpte_consent").exists()
    assert Path(".gpte_consent").read_text() == "true"


def test_check_consent_file_not_exists_and_user_says_no(cleanup):
    with patch("builtins.input", side_effect=["n"]):
        assert check_collection_consent() is False
    assert not Path(".gpte_consent").exists()


"""
Test the following 4 scenarios for ask_collection_consent():
    1. The user immediately gives consent with "y":
        * The .gpte_consent file is created with content "true".
        * The function returns True.
    2. The user immediately denies consent with "n":
        * The .gpte_consent file is not created.
        * The function returns False.
    3. The user first provides an invalid response, then gives consent with "y":
        * The user is re-prompted after the invalid input.
        * The .gpte_consent file is created with content "true".
        * The function returns True.
    4. The user first provides an invalid response, then denies consent with "n":
        * The user is re-prompted after the invalid input.
        * The .gpte_consent file is not created.
        * The function returns False.
"""


def test_ask_collection_consent_yes(cleanup):
    with patch("builtins.input", side_effect=["y"]):
        result = ask_collection_consent()
    assert Path(".gpte_consent").exists()
    assert Path(".gpte_consent").read_text() == "true"
    assert result is True


def test_ask_collection_consent_no(cleanup):
    with patch("builtins.input", side_effect=["n"]):
        result = ask_collection_consent()
    assert not Path(".gpte_consent").exists()
    assert result is False


def test_ask_collection_consent_invalid_then_yes(cleanup):
    with patch("builtins.input", side_effect=["invalid", "y"]):
        result = ask_collection_consent()
    assert Path(".gpte_consent").exists()
    assert Path(".gpte_consent").read_text() == "true"
    assert result is True


def test_ask_collection_consent_invalid_then_no(cleanup):
    with patch("builtins.input", side_effect=["invalid", "n"]):
        result = ask_collection_consent()
    assert not Path(".gpte_consent").exists()
    assert result is False