Backend settings sync (#226)
[akkoma] / test / pleroma / web / akkoma_api / frontend_settings_controller_test.exs
1 defmodule Pleroma.Web.AkkomaAPI.FrontendSettingsControllerTest do
2 use Pleroma.Web.ConnCase, async: true
3
4 import Pleroma.Factory
5 alias Pleroma.Akkoma.FrontendSettingsProfile
6
7 describe "GET /api/v1/akkoma/frontend_settings/:frontend_name" do
8 test "it returns a list of profiles" do
9 %{conn: conn, user: user} = oauth_access(["read"])
10
11 insert(:frontend_setting_profile, user: user, frontend_name: "test", profile_name: "test1")
12 insert(:frontend_setting_profile, user: user, frontend_name: "test", profile_name: "test2")
13
14 response =
15 conn
16 |> get("/api/v1/akkoma/frontend_settings/test")
17 |> json_response_and_validate_schema(200)
18
19 assert response == [
20 %{"name" => "test1", "version" => 1},
21 %{"name" => "test2", "version" => 1}
22 ]
23 end
24 end
25
26 describe "GET /api/v1/akkoma/frontend_settings/:frontend_name/:profile_name" do
27 test "it returns 404 if not found" do
28 %{conn: conn} = oauth_access(["read"])
29
30 conn
31 |> get("/api/v1/akkoma/frontend_settings/unknown_frontend/unknown_profile")
32 |> json_response_and_validate_schema(404)
33 end
34
35 test "it returns 200 if found" do
36 %{conn: conn, user: user} = oauth_access(["read"])
37
38 insert(:frontend_setting_profile,
39 user: user,
40 frontend_name: "test",
41 profile_name: "test1",
42 settings: %{"test" => "test"}
43 )
44
45 response =
46 conn
47 |> get("/api/v1/akkoma/frontend_settings/test/test1")
48 |> json_response_and_validate_schema(200)
49
50 assert response == %{"settings" => %{"test" => "test"}, "version" => 1}
51 end
52 end
53
54 describe "PUT /api/v1/akkoma/frontend_settings/:frontend_name/:profile_name" do
55 test "puts a config" do
56 %{conn: conn, user: user} = oauth_access(["write"])
57 settings = %{"test" => "test2"}
58
59 response =
60 conn
61 |> put_req_header("content-type", "application/json")
62 |> put("/api/v1/akkoma/frontend_settings/test/test1", %{
63 "settings" => settings,
64 "version" => 1
65 })
66 |> json_response_and_validate_schema(200)
67
68 assert response == settings
69
70 assert %FrontendSettingsProfile{settings: ^settings} =
71 FrontendSettingsProfile.get_by_user_and_frontend_name_and_profile_name(
72 user,
73 "test",
74 "test1"
75 )
76 end
77
78 test "refuses to overwrite a newer config" do
79 %{conn: conn, user: user} = oauth_access(["write"])
80
81 insert(:frontend_setting_profile,
82 user: user,
83 frontend_name: "test",
84 profile_name: "test1",
85 settings: %{"test" => "test"},
86 version: 2
87 )
88
89 conn
90 |> put_req_header("content-type", "application/json")
91 |> put("/api/v1/akkoma/frontend_settings/test/test1", %{
92 "settings" => %{"test" => "test2"},
93 "version" => 1
94 })
95 |> json_response_and_validate_schema(422)
96 end
97 end
98
99 describe "DELETE /api/v1/akkoma/frontend_settings/:frontend_name/:profile_name" do
100 test "deletes a config" do
101 %{conn: conn, user: user} = oauth_access(["write"])
102
103 insert(:frontend_setting_profile,
104 user: user,
105 frontend_name: "test",
106 profile_name: "test1",
107 settings: %{"test" => "test"},
108 version: 2
109 )
110
111 conn
112 |> delete("/api/v1/akkoma/frontend_settings/test/test1")
113 |> json_response_and_validate_schema(200)
114
115 assert FrontendSettingsProfile.get_by_user_and_frontend_name_and_profile_name(
116 user,
117 "test",
118 "test1"
119 ) == nil
120 end
121 end
122 end