"""Tests for ENV converter.""" import pytest import tempfile import os from config_convert.converters import ENVConverter class TestENVConverter: @pytest.fixture def converter(self): return ENVConverter() def test_loads_valid_env(self, converter): data = "NAME=test\nVALUE=123" result = converter.loads(data) assert result == {"NAME": "test", "VALUE": 123} def test_loads_with_spaces(self, converter): data = "NAME = test" result = converter.loads(data) assert result == {"NAME": "test"} def test_loads_boolean_strings(self, converter): data = "ENABLED=true\nDISABLED=false" result = converter.loads(data) assert result == {"ENABLED": True, "DISABLED": False} def test_loads_integer_strings(self, converter): data = "COUNT=42\nNEGATIVE=-10" result = converter.loads(data) assert result == {"COUNT": 42, "NEGATIVE": -10} def test_loads_float_strings(self, converter): data = "RATE=3.14" result = converter.loads(data) assert result == {"RATE": 3.14} def test_loads_array_strings(self, converter): data = "TAGS=a,b,c" result = converter.loads(data) assert result["TAGS"] == "a,b,c" def test_loads_empty_value(self, converter): data = "EMPTY=" result = converter.loads(data) assert result["EMPTY"] == "" or result["EMPTY"] is None def test_loads_quoted_value(self, converter): data = 'NAME="quoted value"' result = converter.loads(data) assert result["NAME"] == "quoted value" def test_skips_comments(self, converter): data = "# This is a comment\nNAME=test" result = converter.loads(data) assert result == {"NAME": "test"} def test_skips_empty_lines(self, converter): data = "NAME=test\n\nVALUE=123" result = converter.loads(data) assert result == {"NAME": "test", "VALUE": 123} def test_dumps_basic_dict(self, converter): data = {"NAME": "test", "VALUE": 123} result = converter.dumps(data) assert "NAME=test" in result def test_dumps_boolean(self, converter): data = {"ENABLED": True, "DISABLED": False} result = converter.dumps(data) assert "ENABLED=true" in result assert "DISABLED=false" in result def test_dumps_list(self, converter): data = {"TAGS": ["a", "b", "c"]} result = converter.dumps(data) assert "TAGS=a,b,c" in result def test_roundtrip(self, converter): original = {"NAME": "test", "ENABLED": True, "COUNT": 42} dumped = converter.dumps(original) loaded = converter.loads(dumped) assert loaded["NAME"] == "test" assert loaded["ENABLED"] is True assert loaded["COUNT"] == 42 def test_load_file(self, converter, temp_file, sample_env): gen = temp_file(sample_env, suffix=".env") path = next(gen) try: result = converter.load(path) assert result["NAME"] == "test-project" finally: os.unlink(path) def test_dump_file(self, converter, temp_dir, sample_env): path = tempfile.mktemp(suffix=".env") try: data = converter.loads(sample_env) converter.dump(data, path) result = converter.load(path) assert result == data finally: if os.path.exists(path): os.unlink(path) def test_invalid_env_raises(self, converter): with pytest.raises(ValueError): converter.loads("invalid line without equals") def test_invalid_env_with_space(self, converter): with pytest.raises(ValueError): converter.loads("NAME test")