| defmodule PlausibleWeb.CaptchaTest do |
| use Plausible.DataCase |
|
|
| import Mox |
| setup :verify_on_exit! |
|
|
| alias PlausibleWeb.Captcha |
|
|
| describe "mocked payloads" do |
| @failure Jason.decode!(~s/{"success":false,"error-codes":["invalid-input-response"]}/) |
| @success Jason.decode!(~s/{"success":true}/) |
|
|
| test "returns false for non-success response" do |
| expect( |
| Plausible.HTTPClient.Mock, |
| :post, |
| fn "https://hcaptcha.com/siteverify", |
| [{"content-type", "application/x-www-form-urlencoded"}], |
| %{response: "bad", secret: "scottiger"} -> |
| {:ok, |
| %Finch.Response{ |
| status: 200, |
| headers: [{"content-type", "application/json"}], |
| body: @failure |
| }} |
| end |
| ) |
|
|
| refute Captcha.verify("bad") |
| end |
|
|
| test "returns true for successful response" do |
| expect( |
| Plausible.HTTPClient.Mock, |
| :post, |
| fn "https://hcaptcha.com/siteverify", |
| [{"content-type", "application/x-www-form-urlencoded"}], |
| %{response: "good", secret: "scottiger"} -> |
| {:ok, |
| %Finch.Response{ |
| status: 200, |
| headers: [{"content-type", "application/json"}], |
| body: @success |
| }} |
| end |
| ) |
|
|
| assert Captcha.verify("good") |
| end |
| end |
|
|
| describe "with patched application env" do |
| setup_patch_env(:hcaptcha, sitekey: nil) |
|
|
| test "returns true when disabled" do |
| assert Captcha.verify("disabled") |
| end |
| end |
| end |
|
|