Add tests for domain controller
Signed-off-by: Marcin Mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
182e0b58da
commit
5a30fefb32
4 changed files with 191 additions and 20 deletions
|
@ -5,6 +5,7 @@ defmodule Pleroma.Domain do
|
||||||
use Ecto.Schema
|
use Ecto.Schema
|
||||||
|
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
|
||||||
|
@ -28,24 +29,24 @@ def update_changeset(%__MODULE__{} = domain, params \\ %{}) do
|
||||||
|> cast(params, [:public])
|
|> cast(params, [:public])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def list do
|
||||||
|
__MODULE__
|
||||||
|
|> order_by(asc: :id)
|
||||||
|
|> Repo.all()
|
||||||
|
end
|
||||||
|
|
||||||
def get(id), do: Repo.get(__MODULE__, id)
|
def get(id), do: Repo.get(__MODULE__, id)
|
||||||
|
|
||||||
def create(params) do
|
def create(params) do
|
||||||
{:ok, domain} =
|
%__MODULE__{}
|
||||||
%__MODULE__{}
|
|> changeset(params)
|
||||||
|> changeset(params)
|
|> Repo.insert()
|
||||||
|> Repo.insert()
|
|
||||||
|
|
||||||
domain
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def update(params, id) do
|
def update(params, id) do
|
||||||
{:ok, domain} =
|
get(id)
|
||||||
get(id)
|
|> update_changeset(params)
|
||||||
|> update_changeset(params)
|
|> Repo.update()
|
||||||
|> Repo.update()
|
|
||||||
|
|
||||||
domain
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete(id) do
|
def delete(id) do
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
defmodule Pleroma.Web.AdminAPI.DomainController do
|
defmodule Pleroma.Web.AdminAPI.DomainController do
|
||||||
use Pleroma.Web, :controller
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
alias Pleroma.Repo
|
|
||||||
alias Pleroma.Domain
|
alias Pleroma.Domain
|
||||||
|
alias Pleroma.Web.AdminAPI
|
||||||
alias Pleroma.Web.Plugs.OAuthScopesPlug
|
alias Pleroma.Web.Plugs.OAuthScopesPlug
|
||||||
|
|
||||||
import Pleroma.Web.ControllerHelper,
|
import Pleroma.Web.ControllerHelper,
|
||||||
|
@ -29,9 +29,7 @@ defmodule Pleroma.Web.AdminAPI.DomainController do
|
||||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.DomainOperation
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.DomainOperation
|
||||||
|
|
||||||
def index(conn, _) do
|
def index(conn, _) do
|
||||||
domains =
|
domains = Domain.list()
|
||||||
Domain
|
|
||||||
|> Repo.all()
|
|
||||||
|
|
||||||
render(conn, "index.json", domains: domains)
|
render(conn, "index.json", domains: domains)
|
||||||
end
|
end
|
||||||
|
@ -39,15 +37,21 @@ def index(conn, _) do
|
||||||
def create(%{body_params: params} = conn, _) do
|
def create(%{body_params: params} = conn, _) do
|
||||||
with {:domain_not_used, true} <-
|
with {:domain_not_used, true} <-
|
||||||
{:domain_not_used, params[:domain] !== Pleroma.Web.WebFinger.domain()},
|
{:domain_not_used, params[:domain] !== Pleroma.Web.WebFinger.domain()},
|
||||||
{:domain, domain} <- Domain.create(params) do
|
{:ok, domain} <- Domain.create(params) do
|
||||||
render(conn, "show.json", domain: domain)
|
render(conn, "show.json", domain: domain)
|
||||||
else
|
else
|
||||||
{:domain_not_used, false} -> {:error, :invalid_domain}
|
{:domain_not_used, false} ->
|
||||||
|
{:error, :invalid_domain}
|
||||||
|
|
||||||
|
{:error, changeset} ->
|
||||||
|
errors = Map.new(changeset.errors, fn {key, {error, _}} -> {key, error} end)
|
||||||
|
|
||||||
|
{:errors, errors}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update(%{body_params: params} = conn, %{id: id}) do
|
def update(%{body_params: params} = conn, %{id: id}) do
|
||||||
domain =
|
{:ok, domain} =
|
||||||
params
|
params
|
||||||
|> Domain.update(id)
|
|> Domain.update(id)
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ def create_operation do
|
||||||
responses: %{
|
responses: %{
|
||||||
200 => Operation.response("Response", "application/json", domain()),
|
200 => Operation.response("Response", "application/json", domain()),
|
||||||
400 => Operation.response("Bad Request", "application/json", ApiError),
|
400 => Operation.response("Bad Request", "application/json", ApiError),
|
||||||
403 => Operation.response("Forbidden", "application/json", ApiError)
|
403 => Operation.response("Forbidden", "application/json", ApiError),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,166 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2023 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.AdminAPI.DomainControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
alias Pleroma.Domain
|
||||||
|
|
||||||
|
setup do
|
||||||
|
clear_config([Pleroma.Web.WebFinger, :domain], "example.com")
|
||||||
|
|
||||||
|
admin = insert(:user, is_admin: true)
|
||||||
|
token = insert(:oauth_admin_token, user: admin)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, admin)
|
||||||
|
|> assign(:token, token)
|
||||||
|
|
||||||
|
{:ok, %{admin: admin, token: token, conn: conn}}
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "GET /api/pleroma/admin/domains" do
|
||||||
|
test "list created domains", %{conn: conn} do
|
||||||
|
_domain =
|
||||||
|
Domain.create(%{
|
||||||
|
domain: "pleroma.mkljczk.pl",
|
||||||
|
public: true
|
||||||
|
})
|
||||||
|
|
||||||
|
_domain =
|
||||||
|
Domain.create(%{
|
||||||
|
domain: "pleroma2.mkljczk.pl"
|
||||||
|
})
|
||||||
|
|
||||||
|
conn = get(conn, "/api/pleroma/admin/domains")
|
||||||
|
|
||||||
|
[
|
||||||
|
%{
|
||||||
|
"id" => _id,
|
||||||
|
"domain" => "pleroma.mkljczk.pl",
|
||||||
|
"public" => true
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"id" => _id2,
|
||||||
|
"domain" => "pleroma2.mkljczk.pl",
|
||||||
|
"public" => false
|
||||||
|
}
|
||||||
|
] = json_response_and_validate_schema(conn, 200)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "POST /api/pleroma/admin/domains" do
|
||||||
|
test "create a valid domain", %{conn: conn} do
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_req_header("content-type", "application/json")
|
||||||
|
|> post("/api/pleroma/admin/domains", %{
|
||||||
|
domain: "pleroma.mkljczk.pl",
|
||||||
|
public: true
|
||||||
|
})
|
||||||
|
|
||||||
|
%{
|
||||||
|
"id" => _id,
|
||||||
|
"domain" => "pleroma.mkljczk.pl",
|
||||||
|
"public" => true
|
||||||
|
} = json_response_and_validate_schema(conn, 200)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "create a domain the same as host", %{conn: conn} do
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_req_header("content-type", "application/json")
|
||||||
|
|> post("/api/pleroma/admin/domains", %{
|
||||||
|
domain: "example.com",
|
||||||
|
public: false
|
||||||
|
})
|
||||||
|
|
||||||
|
%{"error" => "invalid_domain"} = json_response_and_validate_schema(conn, 400)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "create duplicate domains", %{conn: conn} do
|
||||||
|
Domain.create(%{
|
||||||
|
domain: "pleroma.mkljczk.pl",
|
||||||
|
public: true
|
||||||
|
})
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_req_header("content-type", "application/json")
|
||||||
|
|> post("/api/pleroma/admin/domains", %{
|
||||||
|
domain: "pleroma.mkljczk.pl",
|
||||||
|
public: false
|
||||||
|
})
|
||||||
|
|
||||||
|
assert json_response_and_validate_schema(conn, 400)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "PATCH /api/pleroma/admin/domains/:id" do
|
||||||
|
test "update domain privacy", %{conn: conn} do
|
||||||
|
{:ok, %{id: domain_id}} =
|
||||||
|
Domain.create(%{
|
||||||
|
domain: "pleroma.mkljczk.pl",
|
||||||
|
public: true
|
||||||
|
})
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_req_header("content-type", "application/json")
|
||||||
|
|> patch("/api/pleroma/admin/domains/#{domain_id}", %{
|
||||||
|
public: false
|
||||||
|
})
|
||||||
|
|
||||||
|
%{
|
||||||
|
"id" => _id,
|
||||||
|
"domain" => "pleroma.mkljczk.pl",
|
||||||
|
"public" => false
|
||||||
|
} = json_response_and_validate_schema(conn, 200)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "doesn't update domain name", %{conn: conn} do
|
||||||
|
{:ok, %{id: domain_id}} =
|
||||||
|
Domain.create(%{
|
||||||
|
domain: "plemora.mkljczk.pl",
|
||||||
|
public: true
|
||||||
|
})
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_req_header("content-type", "application/json")
|
||||||
|
|> patch("/api/pleroma/admin/domains/#{domain_id}", %{
|
||||||
|
domain: "pleroma.mkljczk.pl"
|
||||||
|
})
|
||||||
|
|
||||||
|
%{
|
||||||
|
"id" => _id,
|
||||||
|
"domain" => "plemora.mkljczk.pl",
|
||||||
|
"public" => true
|
||||||
|
} = json_response_and_validate_schema(conn, 200)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "DELETE /api/pleroma/admin/domains/:id" do
|
||||||
|
test "delete a domain", %{conn: conn} do
|
||||||
|
{:ok, %{id: domain_id}} =
|
||||||
|
Domain.create(%{
|
||||||
|
domain: "pleroma.mkljczk.pl",
|
||||||
|
public: true
|
||||||
|
})
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> delete("/api/pleroma/admin/domains/#{domain_id}")
|
||||||
|
|
||||||
|
%{} = json_response_and_validate_schema(conn, 200)
|
||||||
|
|
||||||
|
domains = Domain.list()
|
||||||
|
|
||||||
|
assert length(domains) == 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue