File size: 4,044 Bytes
c9c49ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
147
148
149
defmodule Plausible.Auth.UserTest do
  use Plausible.DataCase, async: true

  alias Plausible.Auth.User

  describe "settings_changeset/2" do
    test "fails for empty input and user" do
      changeset = User.settings_changeset(%User{}, %{})

      refute changeset.valid?
    end

    test "succeeds for non-empty user even if input is empty" do
      changeset =
        User.settings_changeset(
          %User{name: "Mary Jane", email: "mary@plausible.test", theme: "system"},
          %{}
        )

      assert changeset.valid?
    end

    test "succeeds for valid user details input" do
      changeset =
        User.settings_changeset(
          %User{name: "Mary Jane", email: "mary@plausible.test", theme: "system"},
          %{name: "Tony Mangle", email: "tony@plausible.test"}
        )

      assert changeset.valid?
      assert changeset.changes == %{name: "Tony Mangle", email: "tony@plausible.test"}
    end

    test "succeeds for valid theme input" do
      changeset =
        User.settings_changeset(
          %User{name: "Mary Jane", email: "mary@plausible.test", theme: "system"},
          %{theme: "dark"}
        )

      assert changeset.valid?
      assert changeset.changes == %{theme: :dark}
    end

    test "fails on invalid user details input" do
      changeset =
        User.settings_changeset(
          %User{name: "Mary Jane", email: "mary@plausible.test", theme: "system"},
          %{name: ""}
        )

      refute changeset.valid?
      assert changeset.errors[:name]
    end

    test "fails on invalid theme input" do
      changeset =
        User.settings_changeset(
          %User{name: "Mary Jane", email: "mary@plausible.test", theme: "system"},
          %{theme: "invalid"}
        )

      refute changeset.valid?
      assert changeset.errors[:theme]
    end
  end

  describe "password_strength/1" do
    test "scores password with all arguments in changes" do
      assert %{score: score, warning: warning, suggestions: suggestions} =
               %User{}
               |> change(
                 name: "Jane Doe",
                 email: "user@example.com",
                 password: "asd"
               )
               |> User.password_strength()

      assert score < 3
      assert warning != ""
      assert length(suggestions) > 0
    end

    test "checks for existing phrases using name and email from changes" do
      strength =
        %User{}
        |> change(
          name: "Clayman Sillywaggle",
          email: "clay@example.com",
          password: "claymansillywaggle"
        )
        |> User.password_strength()

      assert strength.score == 1
    end

    test "checks for existing phrases using name and email from source" do
      strength =
        %User{
          name: "Clayman Sillywaggle",
          email: "clay@example.com"
        }
        |> change(password: "claymansillywaggle")
        |> User.password_strength()

      assert strength.score == 1
    end

    test "treats passwords past 32 bytes as very strong" do
      strength =
        %User{
          name: "Clayman Sillywaggle",
          email: "clay@example.com"
        }
        |> change(password: String.duplicate("a", 33))
        |> User.password_strength()

      assert strength.score == 4
    end
  end

  describe "password strength validation" do
    test "succeeds for complex enough password" do
      changeset =
        User.new(%{
          name: "Jane Doe",
          email: "jane@example.com",
          password: "very-secret-and-very-long-123",
          password_confirmation: "very-secret-and-very-long-123"
        })

      assert changeset.valid?
    end

    test "fails for password not complex enough" do
      changeset =
        User.new(%{
          name: "Jane Doe",
          email: "jane@example.com",
          password: "asdasdasdasd",
          password_confirmation: "asdasdasdasd"
        })

      refute changeset.valid?
      assert {"is too weak", [validation: :strength]} = changeset.errors[:password]
    end
  end
end