dotenv-parser/test/dotenv_parser_test.exs

107 lines
3.7 KiB
Elixir

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