total rebase
[anni] / test / pleroma / web / rich_media / parser / ttl / aws_signed_url_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.RichMedia.Parser.TTL.AwsSignedUrlTest do
6   use Pleroma.DataCase, async: false
7   use Oban.Testing, repo: Pleroma.Repo
8
9   import Mox
10
11   alias Pleroma.UnstubbedConfigMock, as: ConfigMock
12   alias Pleroma.Web.RichMedia.Card
13
14   setup do
15     ConfigMock
16     |> stub_with(Pleroma.Test.StaticConfig)
17
18     clear_config([:rich_media, :enabled], true)
19
20     :ok
21   end
22
23   test "s3 signed url is parsed correct for expiration time" do
24     url = "https://pleroma.social/amz"
25
26     {:ok, timestamp} =
27       Timex.now()
28       |> DateTime.truncate(:second)
29       |> Timex.format("{ISO:Basic:Z}")
30
31     # in seconds
32     valid_till = 30
33
34     metadata = construct_metadata(timestamp, valid_till, url)
35
36     expire_time =
37       Timex.parse!(timestamp, "{ISO:Basic:Z}") |> Timex.to_unix() |> Kernel.+(valid_till)
38
39     assert expire_time == Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl.ttl(metadata, url)
40   end
41
42   test "s3 signed url is parsed and correct ttl is set for rich media" do
43     url = "https://pleroma.social/amz"
44
45     {:ok, timestamp} =
46       Timex.now()
47       |> DateTime.truncate(:second)
48       |> Timex.format("{ISO:Basic:Z}")
49
50     # in seconds
51     valid_till = 30
52
53     metadata = construct_metadata(timestamp, valid_till, url)
54
55     body = """
56     <meta name="twitter:card" content="Pleroma" />
57     <meta name="twitter:site" content="Pleroma" />
58     <meta name="twitter:title" content="Pleroma" />
59     <meta name="twitter:description" content="Pleroma" />
60     <meta name="twitter:image" content="#{Map.get(metadata, "image")}" />
61     """
62
63     Tesla.Mock.mock(fn
64       %{
65         method: :get,
66         url: ^url
67       } ->
68         %Tesla.Env{status: 200, body: body}
69
70       %{method: :head} ->
71         %Tesla.Env{status: 200}
72     end)
73
74     Card.get_or_backfill_by_url(url)
75
76     assert_enqueued(worker: Pleroma.Workers.RichMediaExpirationWorker, args: %{"url" => url})
77
78     [%Oban.Job{scheduled_at: scheduled_at}] = all_enqueued()
79
80     timestamp_dt = Timex.parse!(timestamp, "{ISO:Basic:Z}")
81
82     assert DateTime.diff(scheduled_at, timestamp_dt) == valid_till
83   end
84
85   defp construct_s3_url(timestamp, valid_till) do
86     "https://pleroma.s3.ap-southeast-1.amazonaws.com/sachin%20%281%29%20_a%20-%25%2Aasdasd%20BNN%20bnnn%20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIBLWWK6RGDQXDLJQ%2F20190716%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=#{timestamp}&X-Amz-Expires=#{valid_till}&X-Amz-Signature=04ffd6b98634f4b1bbabc62e0fac4879093cd54a6eed24fe8eb38e8369526bbf&X-Amz-SignedHeaders=host"
87   end
88
89   defp construct_metadata(timestamp, valid_till, url) do
90     %{
91       "image" => construct_s3_url(timestamp, valid_till),
92       "site" => "Pleroma",
93       "title" => "Pleroma",
94       "description" => "Pleroma",
95       "url" => url
96     }
97   end
98 end