File: parser_test.exs

package info (click to toggle)
erlang-hex 2.0.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,204 kB
  • sloc: erlang: 2,950; sh: 203; makefile: 10
file content (146 lines) | stat: -rw-r--r-- 3,084 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
defmodule Hex.Netrc.ParserTest do
  use HexTest.Case, async: false

  alias Hex.Netrc.Parser

  test "parse/1 fails on non-existent file" do
    in_tmp(fn ->
      assert {:error, :enoent} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 fails on unreadable file" do
    in_tmp(fn ->
      File.write!(".netrc", "")
      File.chmod!(".netrc", 0o000)
      assert {:error, :eacces} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 fails on empty file" do
    in_tmp(fn ->
      File.write!(".netrc", "")
      assert {:error, :parse} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 succeeds on simple file" do
    in_tmp(fn ->
      data = """
      machine foo.example.com
        login john
        password bar
      """

      parsed = %{
        "foo.example.com" => %{
          username: "john",
          password: "bar"
        }
      }

      File.write!(".netrc", data)
      assert {:ok, ^parsed} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 succeeds on file with multiple records" do
    in_tmp(fn ->
      data = """
      machine foo.example.com
        login john
        password bar
      machine bar.example.com
        login yoyo
        password dyne
      """

      parsed = %{
        "foo.example.com" => %{
          username: "john",
          password: "bar"
        },
        "bar.example.com" => %{
          username: "yoyo",
          password: "dyne"
        }
      }

      File.write!(".netrc", data)
      assert {:ok, ^parsed} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 ignores excessive whitespace" do
    in_tmp(fn ->
      data = "\n\n\t\nmachine foo.example.com\n\n     login\t\tjohn\npassword\t\tbar\n\n"

      parsed = %{
        "foo.example.com" => %{
          username: "john",
          password: "bar"
        }
      }

      File.write!(".netrc", data)
      assert {:ok, ^parsed} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 missing machine line is a parse error" do
    in_tmp(fn ->
      data = """
      login foo
      password bar
      """

      File.write!(".netrc", data)
      assert {:error, :parse} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 missing login line is a parse error" do
    in_tmp(fn ->
      data = """
      machine foo.example.com
      password bar
      """

      File.write!(".netrc", data)
      assert {:error, :parse} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 missing password line is a parse error" do
    in_tmp(fn ->
      data = """
      machine foo.example.com
      login foo
      """

      File.write!(".netrc", data)
      assert {:error, :parse} = Parser.parse(".netrc")
    end)
  end

  test "parse/1 username can be overridden" do
    in_tmp(fn ->
      data = """
      machine foo.example.com
      login foo
      login foo2
      password bar
      """

      parsed = %{
        "foo.example.com" => %{
          username: "foo2",
          password: "bar"
        }
      }

      File.write!(".netrc", data)
      assert {:ok, ^parsed} = Parser.parse(".netrc")
    end)
  end
end