mirror of
				https://github.com/Akkudoktor-EOS/EOS.git
				synced 2025-11-04 00:36:21 +00:00 
			
		
		
		
	
		
			
	
	
		
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from typing import List, Literal, Optional, no_type_check
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import pytest
							 | 
						||
| 
								 | 
							
								from pydantic import Field, ValidationError
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from akkudoktoreos.config.configabc import SettingsBaseModel
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SettingsModel(SettingsBaseModel):
							 | 
						||
| 
								 | 
							
								    name: str = "Default Name"
							 | 
						||
| 
								 | 
							
								    age: int = 18
							 | 
						||
| 
								 | 
							
								    tags: List[str] = Field(default_factory=list)
							 | 
						||
| 
								 | 
							
								    readonly_field: Literal["ReadOnly"] = "ReadOnly"  # Use Literal instead of const
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def test_reset_to_defaults():
							 | 
						||
| 
								 | 
							
								    """Test resetting to default values."""
							 | 
						||
| 
								 | 
							
								    instance = SettingsModel(name="Custom Name", age=25, tags=["tag1", "tag2"])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Modify the instance
							 | 
						||
| 
								 | 
							
								    instance.name = "Modified Name"
							 | 
						||
| 
								 | 
							
								    instance.age = 30
							 | 
						||
| 
								 | 
							
								    instance.tags.append("tag3")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Ensure the instance is modified
							 | 
						||
| 
								 | 
							
								    assert instance.name == "Modified Name"
							 | 
						||
| 
								 | 
							
								    assert instance.age == 30
							 | 
						||
| 
								 | 
							
								    assert instance.tags == ["tag1", "tag2", "tag3"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Reset to defaults
							 | 
						||
| 
								 | 
							
								    instance.reset_to_defaults()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Verify default values
							 | 
						||
| 
								 | 
							
								    assert instance.name == "Default Name"
							 | 
						||
| 
								 | 
							
								    assert instance.age == 18
							 | 
						||
| 
								 | 
							
								    assert instance.tags == []
							 | 
						||
| 
								 | 
							
								    assert instance.readonly_field == "ReadOnly"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@no_type_check
							 | 
						||
| 
								 | 
							
								def test_reset_to_defaults_readonly_field():
							 | 
						||
| 
								 | 
							
								    """Ensure read-only fields remain unchanged."""
							 | 
						||
| 
								 | 
							
								    instance = SettingsModel()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Attempt to modify readonly_field (should raise an error)
							 | 
						||
| 
								 | 
							
								    with pytest.raises(ValidationError):
							 | 
						||
| 
								 | 
							
								        instance.readonly_field = "New Value"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Reset to defaults
							 | 
						||
| 
								 | 
							
								    instance.reset_to_defaults()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Ensure readonly_field is still at its default value
							 | 
						||
| 
								 | 
							
								    assert instance.readonly_field == "ReadOnly"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def test_reset_to_defaults_with_default_factory():
							 | 
						||
| 
								 | 
							
								    """Test reset with fields having default_factory."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    class FactoryModel(SettingsBaseModel):
							 | 
						||
| 
								 | 
							
								        items: List[int] = Field(default_factory=lambda: [1, 2, 3])
							 | 
						||
| 
								 | 
							
								        value: Optional[int] = None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    instance = FactoryModel(items=[4, 5, 6], value=10)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Ensure instance has custom values
							 | 
						||
| 
								 | 
							
								    assert instance.items == [4, 5, 6]
							 | 
						||
| 
								 | 
							
								    assert instance.value == 10
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Reset to defaults
							 | 
						||
| 
								 | 
							
								    instance.reset_to_defaults()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Verify reset values
							 | 
						||
| 
								 | 
							
								    assert instance.items == [1, 2, 3]
							 | 
						||
| 
								 | 
							
								    assert instance.value is None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@no_type_check
							 | 
						||
| 
								 | 
							
								def test_reset_to_defaults_error_handling():
							 | 
						||
| 
								 | 
							
								    """Ensure reset_to_defaults skips fields that cannot be set."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    class ReadOnlyModel(SettingsBaseModel):
							 | 
						||
| 
								 | 
							
								        readonly_field: Literal["ReadOnly"] = "ReadOnly"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    instance = ReadOnlyModel()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Attempt to modify readonly_field (should raise an error)
							 | 
						||
| 
								 | 
							
								    with pytest.raises(ValidationError):
							 | 
						||
| 
								 | 
							
								        instance.readonly_field = "New Value"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Reset to defaults
							 | 
						||
| 
								 | 
							
								    instance.reset_to_defaults()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Ensure readonly_field is unaffected
							 | 
						||
| 
								 | 
							
								    assert instance.readonly_field == "ReadOnly"
							 |