File size: 1,581 Bytes
6778ee0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
defmodule PlausibleWeb.AuthController.LogsTest do
  use PlausibleWeb.ConnCase
  import ExUnit.CaptureLog

  setup {PlausibleWeb.FirstLaunchPlug.Test, :skip}

  describe "POST /login" do
    setup do
      patch_env(:log_failed_login_attempts, true)
    end

    test "logs on missing user", %{conn: conn} do
      logs =
        capture_log(fn ->
          post(conn, "/login", email: "user@example.com", password: "password")
        end)

      assert logs =~ "[warning] [login] user not found for user@example.com"
    end

    test "logs on wrong password", %{conn: conn} do
      user = insert(:user, password: "password")

      logs =
        capture_log(fn ->
          post(conn, "/login", email: user.email, password: "wrong")
        end)

      assert logs =~ "[warning] [login] wrong password for #{user.email}"
    end

    test "logs on too many login attempts" do
      user = insert(:user, password: "password")

      conn =
        build_conn()
        |> put_req_header("x-forwarded-for", "1.1.1.1")

      logs =
        eventually(
          fn ->
            capture_log(fn ->
              Enum.each(1..5, fn _ ->
                post(conn, "/login", email: user.email, password: "wrong")
              end)
            end)

            {conn, logs} =
              with_log(fn ->
                post(conn, "/login", email: user.email, password: "wrong")
              end)

            {conn.status == 429, logs}
          end,
          500
        )

      assert logs =~ "[warning] [login] too many login attempts for #{user.email}"
    end
  end
end