diff options
author | Hadrien <26697460+ketsapiwiq@users.noreply.github.com> | 2020-11-11 16:42:35 +0100 |
---|---|---|
committer | Pierre de Lacroix <pierre@pdelacroix.com> | 2021-03-03 18:12:18 +0100 |
commit | b86e9271f1aec757b29a064fa25cd612b6c1d2b4 (patch) | |
tree | ac7aecd606f138171c2c6bddba0c6c8198fc6f63 | |
parent | temporarily fix create_room typespec (diff) |
add post register endpoint + tests
-rw-r--r-- | lib/polyjuice/client/endpoint/post_register.ex | 101 | ||||
-rw-r--r-- | test/polyjuice/client/endpoint/post_register_test.exs | 92 |
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 |