summaryrefslogtreecommitdiff
path: root/test/polyjuice/client/media_test.exs
blob: 4c545acdea47f8493d8b2e29552d91a8ee3e936c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Copyright 2019-2020 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.MediaTest do
  use ExUnit.Case
  doctest Polyjuice.Client.Room

  defmodule Httpd do
    def _matrix(session_id, env, input) do
      # FIXME: check authorization header
      # FIXME: check method
      [path | _] =
        Keyword.get(env, :path_info)
        |> to_string()
        |> String.split("?", parts: 2)

      case path do
        "media/r0/upload" ->
          handle_upload(session_id, env, input)

        "media/r0/download/example.org/foo" ->
          handle_download(session_id, env, input)

        _ ->
          :mod_esi.deliver(
            session_id,
            'Status: 404 Not Found\r\nContent-Type: application/json\r\n\r\n{"errcode":"M_NOT_FOUND","error":"Not found"}'
          )
      end
    end

    defp handle_upload(session_id, _env, {_, input}) do
      {:ok, file} = File.read("mix.exs")

      if to_string(input) == file do
        :mod_esi.deliver(
          session_id,
          'Content-Type: application/json\r\n\r\n{"content_uri":"mxc://example.org/abcdefg"}'
        )
      else
        :mod_esi.deliver(
          session_id,
          'Status: 400 Bad Request\r\nContent-Type: application/json\r\n\r\n{"errcode":"M_UNKNOWN","error":"Wrong contents"}'
        )
      end
    end

    defp handle_download(session_id, _env, _input) do
      :mod_esi.deliver(
        session_id,
        'Content-Type: text/plain\r\nContent-Disposition: attachment; filename="foo.txt"\r\n\r\nfoo'
      )
    end
  end

  test "upload" do
    {:ok, tmpdir} = TestUtil.mktmpdir("sync-")

    try do
      tmpdir_charlist = to_charlist(tmpdir)

      :inets.start()

      {:ok, httpd_pid} =
        :inets.start(
          :httpd,
          port: 0,
          server_name: 'sync.test',
          server_root: tmpdir_charlist,
          document_root: tmpdir_charlist,
          bind_address: {127, 0, 0, 1},
          modules: [:mod_esi],
          erl_script_alias: {'', [Polyjuice.Client.MediaTest.Httpd]}
        )

      port = :httpd.info(httpd_pid) |> Keyword.fetch!(:port)

      client =
        Polyjuice.Client.start_link(
          "http://127.0.0.1:#{port}/Elixir.Polyjuice.Client.MediaTest.Httpd",
          access_token: "an_access_token",
          user_id: "@alice:example.org",
          sync: false,
          test: true
        )

      {:ok, url} = Polyjuice.Client.Media.upload(client, {:file, "mix.exs"})

      assert url == "mxc://example.org/abcdefg"

      {:ok, filename, content_type, body} =
        Polyjuice.Client.Media.download(client, "mxc://example.org/foo")

      assert filename == "foo.txt"
      assert content_type == "text/plain"
      assert Enum.join(body) == "foo"

      Polyjuice.Client.stop(client)

      :inets.stop(:httpd, httpd_pid)
    after
      File.rm_rf(tmpdir)
    end
  end
end