summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHadrien <26697460+ketsapiwiq@users.noreply.github.com>2020-11-11 16:42:35 +0100
committerPierre de Lacroix <pierre@pdelacroix.com>2021-03-03 18:12:18 +0100
commitb86e9271f1aec757b29a064fa25cd612b6c1d2b4 (patch)
treeac7aecd606f138171c2c6bddba0c6c8198fc6f63
parenttemporarily fix create_room typespec (diff)
add post register endpoint + tests
-rw-r--r--lib/polyjuice/client/endpoint/post_register.ex101
-rw-r--r--test/polyjuice/client/endpoint/post_register_test.exs92
2 files changed, 193 insertions, 0 deletions
diff --git a/lib/polyjuice/client/endpoint/post_register.ex b/lib/polyjuice/client/endpoint/post_register.ex
new file mode 100644
index 0000000..df10a8c
--- /dev/null
+++ b/lib/polyjuice/client/endpoint/post_register.ex
@@ -0,0 +1,101 @@
+# Copyright 2019 Hubert Chathi <hubert@uhoreg.ca>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+defmodule Polyjuice.Client.Endpoint.PostRegister do
+ @moduledoc """
+ Register a user
+
+ https://matrix.org/docs/spec/client_server/r0.6.1#post-matrix-client-r0-register
+ """
+
+ @type t :: %__MODULE__{
+ kind: :guest | :user,
+ auth: %{type: String.t(), session: String.t() | nil},
+ username: String.t() | nil,
+ password: String.t() | nil,
+ device_id: String.t() | nil,
+ initial_device_display_name: String.t() | nil,
+ inhibit_login: boolean()
+ }
+
+ @enforce_keys [:auth]
+ defstruct [
+ :kind,
+ :auth,
+ :username,
+ :password,
+ :device_id,
+ :initial_device_display_name,
+ :inhibit_login
+ ]
+
+ defimpl Polyjuice.Client.Endpoint.Proto do
+ def http_spec(%Polyjuice.Client.Endpoint.PostRegister{
+ kind: kind,
+ auth: auth,
+ username: username,
+ password: password,
+ device_id: device_id,
+ initial_device_display_name: initial_device_display_name,
+ inhibit_login: inhibit_login
+ }) do
+ body =
+ [
+ if(auth != nil, do: [{"auth", auth}], else: []),
+ if(username != nil, do: [{"username", username}], else: []),
+ if(password != nil, do: [{"password", password}], else: []),
+ if(device_id != nil, do: [{"device_id", device_id}], else: []),
+ if(inhibit_login != nil,
+ do: [{"inhibit_login", Atom.to_string(inhibit_login)}],
+ else: []
+ ),
+ if(initial_device_display_name != nil,
+ do: [{"initial_device_display_name", initial_device_display_name}],
+ else: []
+ )
+ ]
+ |> Enum.concat()
+ |> Map.new()
+ |> Jason.encode_to_iodata!()
+
+ query = [
+ kind:
+ if kind == nil do
+ "user"
+ else
+ Atom.to_string(kind)
+ end
+ ]
+
+ Polyjuice.Client.Endpoint.HttpSpec.post(
+ :r0,
+ "register",
+ body: body,
+ query: query,
+ auth_required: false
+ )
+ end
+
+ def transform_http_result(req, status_code, resp_headers, body) do
+ Polyjuice.Client.Endpoint.parse_response(req, status_code, resp_headers, body)
+ end
+ end
+
+ # defimpl Polyjuice.Client.Endpoint.BodyParser do
+ # def parse(_req, parsed) do
+ # {:ok, Map.get(parsed, "user_id"), Map.get(parsed, "access_token"),
+ # Map.get(parsed, "device_id")}
+ # end
+ # end
+end
diff --git a/test/polyjuice/client/endpoint/post_register_test.exs b/test/polyjuice/client/endpoint/post_register_test.exs
new file mode 100644
index 0000000..a7eda85
--- /dev/null
+++ b/test/polyjuice/client/endpoint/post_register_test.exs
@@ -0,0 +1,92 @@
+# Copyright 2019 Hubert Chathi <hubert@uhoreg.ca>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+defmodule Polyjuice.Client.Endpoint.PostRegisterTest do
+ use ExUnit.Case
+
+ test "POST register" do
+ endpoint = %Polyjuice.Client.Endpoint.PostRegister{
+ kind: :user,
+ auth: %{
+ "type" => "m.login.dummy"
+ },
+ username: "alice",
+ password: "12345",
+ device_id: "ABCDEF",
+ initial_device_display_name: "test_device",
+ inhibit_login: false
+ }
+
+ http_spec = Polyjuice.Client.Endpoint.Proto.http_spec(endpoint)
+
+ assert %{http_spec | body: nil} == %Polyjuice.Client.Endpoint.HttpSpec{
+ auth_required: false,
+ body: nil,
+ headers: [
+ {"Accept", "application/json"},
+ {"Accept-Encoding", "gzip, deflate"},
+ {"Content-Type", "application/json"}
+ ],
+ method: :post,
+ query: [kind: "user"],
+ path: "_matrix/client/r0/register"
+ }
+
+ assert Jason.decode!(http_spec.body) == %{
+ "password" => "12345",
+ "auth" => %{"type" => "m.login.dummy"},
+ "device_id" => "ABCDEF",
+ "inhibit_login" => "false",
+ "initial_device_display_name" => "test_device",
+ "username" => "alice"
+ }
+
+ assert Polyjuice.Client.Endpoint.Proto.transform_http_result(
+ endpoint,
+ 200,
+ [{"Content-Type", "application/json"}],
+ ~s(
+ {"user_id":"@alice:example.com",
+ "access_token":"1234567890",
+ "device_id":"ABCDEF",
+ "well_known":
+ {"m.homeserver":
+ {"base_url":"https://example.com"},
+ "m.identity_server":
+ {"base_url":"https://example.com"}
+ }
+ }
+ )
+ ) == {
+ :ok,
+ %{
+ "access_token" => "1234567890",
+ "device_id" => "ABCDEF",
+ "user_id" => "@alice:example.com",
+ "well_known" => %{
+ "m.homeserver" => %{"base_url" => "https://example.com"},
+ "m.identity_server" => %{"base_url" => "https://example.com"}
+ }
+ }
+ }
+
+ assert Polyjuice.Client.Endpoint.Proto.transform_http_result(
+ endpoint,
+ 500,
+ [],
+ "Aaah!"
+ ) ==
+ {:error, 500, %{"body" => "Aaah!", "errcode" => "CA_UHOREG_POLYJUICE_BAD_RESPONSE"}}
+ end
+end