move to 2.5.5
[anni] / test / pleroma / web / pleroma_api / controllers / settings_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.PleromaAPI.SettingsControllerTest do
6   use Pleroma.Web.ConnCase
7
8   import Pleroma.Factory
9
10   describe "GET /api/v1/pleroma/settings/:app" do
11     setup do
12       oauth_access(["read:accounts"])
13     end
14
15     test "it gets empty settings", %{conn: conn} do
16       response =
17         conn
18         |> get("/api/v1/pleroma/settings/pleroma-fe")
19         |> json_response_and_validate_schema(:ok)
20
21       assert response == %{}
22     end
23
24     test "it gets settings", %{conn: conn, user: user} do
25       response =
26         conn
27         |> assign(
28           :user,
29           struct(user,
30             pleroma_settings_store: %{
31               "pleroma-fe" => %{
32                 "foo" => "bar"
33               }
34             }
35           )
36         )
37         |> get("/api/v1/pleroma/settings/pleroma-fe")
38         |> json_response_and_validate_schema(:ok)
39
40       assert %{"foo" => "bar"} == response
41     end
42   end
43
44   describe "POST /api/v1/pleroma/settings/:app" do
45     setup do
46       settings = %{
47         "foo" => "bar",
48         "nested" => %{
49           "1" => "2"
50         }
51       }
52
53       user =
54         insert(
55           :user,
56           %{
57             pleroma_settings_store: %{
58               "pleroma-fe" => settings
59             }
60           }
61         )
62
63       %{conn: conn} = oauth_access(["write:accounts"], user: user)
64
65       %{conn: conn, user: user, settings: settings}
66     end
67
68     test "it adds keys", %{conn: conn} do
69       response =
70         conn
71         |> put_req_header("content-type", "application/json")
72         |> patch("/api/v1/pleroma/settings/pleroma-fe", %{
73           "foo" => "edited",
74           "bar" => "new",
75           "nested" => %{"3" => "4"}
76         })
77         |> json_response_and_validate_schema(:ok)
78
79       assert response == %{
80                "foo" => "edited",
81                "bar" => "new",
82                "nested" => %{
83                  "1" => "2",
84                  "3" => "4"
85                }
86              }
87     end
88
89     test "it removes keys", %{conn: conn} do
90       response =
91         conn
92         |> put_req_header("content-type", "application/json")
93         |> patch("/api/v1/pleroma/settings/pleroma-fe", %{
94           "foo" => nil,
95           "bar" => nil,
96           "nested" => %{
97             "1" => nil,
98             "3" => nil
99           }
100         })
101         |> json_response_and_validate_schema(:ok)
102
103       assert response == %{
104                "nested" => %{}
105              }
106     end
107
108     test "it does not override settings for other apps", %{
109       conn: conn,
110       user: user,
111       settings: settings
112     } do
113       conn
114       |> put_req_header("content-type", "application/json")
115       |> patch("/api/v1/pleroma/settings/admin-fe", %{"foo" => "bar"})
116       |> json_response_and_validate_schema(:ok)
117
118       user = Pleroma.User.get_by_id(user.id)
119
120       assert user.pleroma_settings_store == %{
121                "pleroma-fe" => settings,
122                "admin-fe" => %{"foo" => "bar"}
123              }
124     end
125   end
126 end