@@ -396,3 +396,54 @@ def test_dotenv_values_file_stream(dotenv_path):
396396 result = dotenv .dotenv_values (stream = f )
397397
398398 assert result == {"a" : "b" }
399+
400+
401+ @pytest .mark .parametrize (
402+ "header" ,
403+ [
404+ "" ,
405+ " " ,
406+ None ,
407+ ],
408+ )
409+ def test_set_header_empty (dotenv_path , header ):
410+ logger = logging .getLogger ("dotenv.main" )
411+
412+ with mock .patch .object (logger , "info" ) as mock_info :
413+ result , * _ = dotenv .set_header (dotenv_path , header )
414+ assert not result
415+
416+ mock_info .assert_called ()
417+
418+
419+ @pytest .mark .parametrize (
420+ "new_header, expected, expected_header, old_header, content" ,
421+ [
422+ ("# header only" , True , "# header only" , "" , "" ),
423+ ("# single-line header" , True , "# single-line header" , "" , "a=b\n c=d" ),
424+ ("# multi-line\n # header" , True , "# multi-line\n # header" , "" , "a=b\n c=d" ),
425+ (
426+ "Single-line, no comment header" ,
427+ True ,
428+ "# Single-line, no comment header" ,
429+ "" ,
430+ "a=b" ,
431+ ),
432+ ("# New header" , True , "# New header" , "# Old header" , "a=b\n c=d" ),
433+ ],
434+ )
435+ def test_set_header (
436+ dotenv_path , new_header , expected , expected_header , old_header , content
437+ ):
438+ logger = logging .getLogger ("dotenv.main" )
439+ dotenv_path .write_text (f"{ old_header } \n { content } " )
440+
441+ with mock .patch .object (logger , "warning" ) as mock_warning :
442+ result , written = dotenv .set_header (dotenv_path , new_header )
443+ assert result == expected
444+ assert written == expected_header
445+
446+ text = dotenv_path .read_text ()
447+ assert content in text
448+ assert expected_header in text
449+ mock_warning .assert_not_called ()
0 commit comments