defmodule DotenvParserTest do use ExUnit.Case doctest DotenvParser setup do [ "BASIC", "AFTER_LINE", "EMPTY", "SINGLE_QUOTES", "SINGLE_QUOTES_SPACED", "DOUBLE_QUOTES", "DOUBLE_QUOTES_SPACED", "EXPAND_NEWLINES", "EXPAND_MANY_SLASHES", "EXPAND_UNICODE", "INVALID_UNICODE", "DONT_EXPAND_UNQUOTED", "DONT_EXPAND_SQUOTED", "EQUAL_SIGNS", "RETAIN_INNER_QUOTES", "RETAIN_LEADING_DQUOTE", "RETAIN_LEADING_SQUOTE", "RETAIN_TRAILING_DQUOTE", "RETAIN_TRAILING_SQUOTE", "RETAIN_INNER_QUOTES_AS_STRING", "TRIM_SPACE_FROM_UNQUOTED", "USERNAME", "SPACED_KEY", "INLINE_COMMENT", "INLINE_COMMENT_PLAIN", "END_BACKSLASH", "lowercased_var", "FOO" ] |> Enum.each(&System.delete_env/1) end test "parses correctly" do assert DotenvParser.parse_file("test/data/.env") == [ {"BASIC", "basic"}, {"AFTER_LINE", "after_line"}, {"EMPTY", ""}, {"SINGLE_QUOTES", "single_quotes"}, {"SINGLE_QUOTES_SPACED", " single quotes "}, {"DOUBLE_QUOTES", "double_quotes"}, {"DOUBLE_QUOTES_SPACED", " double quotes "}, {"EXPAND_NEWLINES", "expand\nnew\nlines"}, {"EXPAND_MANY_SLASHES", "expand\\\\nmany \tslashes"}, {"EXPAND_UNICODE", "expand ሴ"}, {"INVALID_UNICODE", "not valid \\uarf1"}, {"DONT_EXPAND_UNQUOTED", "dontexpand\\nnewlines\\u1234"}, {"DONT_EXPAND_SQUOTED", "dontexpand\\nnewlines"}, {"EQUAL_SIGNS", "equals=="}, {"RETAIN_INNER_QUOTES", "{\"foo\": \"bar\"}"}, {"RETAIN_INNER_QUOTES_AS_STRING", "{\"foo\": \"bar\"}"}, {"TRIM_SPACE_FROM_UNQUOTED", "some spaced out string"}, {"USERNAME", "therealnerdybeast@example.tld"}, {"SPACED_KEY", "parsed"}, {"INLINE_COMMENT", "foo#bar"}, {"INLINE_COMMENT_PLAIN", "foo bar"}, {"END_BACKSLASH", "something\" # Comment"}, {"END_DOUBLE_BACKSLASH", "foo\\"}, {"lowercased_var", "foo"}, {"FOO", "exports are supported"}, {"MULTILINE", "There are\nmanyሴlines\nin this var!"}, {"SPACED_MULTILINE", " \n <-- Note: Indentation preserved"}, {"MULTILINE_SINGLE_QUOTE", "Now also\nwith single quotes! \"_\""}, {"MULTILINE_ESCAPED_QUOTE", "Not stopping here --> \\\\\\\"\nbut \"\" here"}, {"MULTILINE_ESCAPED_LINEFEED", "No linefeed --> nope"}, {"MULTILINE_NON_ESCAPED_LINEFEED", "Linefeed not escaped in single quotes \\\n"}, {"RETAIN_TRAILING_DQUOTE", "retained\""}, {"RETAIN_TRAILING_SQUOTE", "retained'"} ] end test "loads env" do DotenvParser.load_file("test/data/.env") assert System.get_env("INLINE_COMMENT") == "foo#bar" assert System.get_env("lowercased_var") == "foo" end test "fails with invalid env and no env is loaded" do assert_raise(DotenvParser.ParseError, fn -> DotenvParser.load_file("test/data/.invalid_env") end) assert is_nil(System.get_env("FOO")) end test "fails with invalid variable names" do assert_raise(DotenvParser.ParseError, fn -> DotenvParser.parse_file("test/data/.invalid_var_name_start") end) assert_raise(DotenvParser.ParseError, fn -> DotenvParser.parse_file("test/data/.invalid_var_name_chars") end) end test "fails with invalid multiline variable" do assert_raise(DotenvParser.ParseError, fn -> DotenvParser.parse_file("test/data/.invalid_multiline_end") end) end end