First
[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   # Relies on Cachex, needs to be synchronous
7   use Pleroma.DataCase
8
9   test "s3 signed url is parsed correct for expiration time" do
10     url = "https://pleroma.social/amz"
11
12     {:ok, timestamp} =
13       Timex.now()
14       |> DateTime.truncate(:second)
15       |> Timex.format("{ISO:Basic:Z}")
16
17     # in seconds
18     valid_till = 30
19
20     metadata = construct_metadata(timestamp, valid_till, url)
21
22     expire_time =
23       Timex.parse!(timestamp, "{ISO:Basic:Z}") |> Timex.to_unix() |> Kernel.+(valid_till)
24
25     assert {:ok, expire_time} == Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl.ttl(metadata, url)
26   end
27
28   test "s3 signed url is parsed and correct ttl is set for rich media" do
29     url = "https://pleroma.social/amz"
30
31     {:ok, timestamp} =
32       Timex.now()
33       |> DateTime.truncate(:second)
34       |> Timex.format("{ISO:Basic:Z}")
35
36     # in seconds
37     valid_till = 30
38
39     metadata = construct_metadata(timestamp, valid_till, url)
40
41     body = """
42     <meta name="twitter:card" content="Pleroma" />
43     <meta name="twitter:site" content="Pleroma" />
44     <meta name="twitter:title" content="Pleroma" />
45     <meta name="twitter:description" content="Pleroma" />
46     <meta name="twitter:image" content="#{Map.get(metadata, :image)}" />
47     """
48
49     Tesla.Mock.mock(fn
50       %{
51         method: :get,
52         url: "https://pleroma.social/amz"
53       } ->
54         %Tesla.Env{status: 200, body: body}
55     end)
56
57     Cachex.put(:rich_media_cache, url, metadata)
58
59     Pleroma.Web.RichMedia.Parser.set_ttl_based_on_image(metadata, url)
60
61     {:ok, cache_ttl} = Cachex.ttl(:rich_media_cache, url)
62
63     # as there is delay in setting and pulling the data from cache we ignore 1 second
64     # make it 2 seconds for flakyness
65     assert_in_delta(valid_till * 1000, cache_ttl, 2000)
66   end
67
68   defp construct_s3_url(timestamp, valid_till) do
69     "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"
70   end
71
72   defp construct_metadata(timestamp, valid_till, url) do
73     %{
74       image: construct_s3_url(timestamp, valid_till),
75       site: "Pleroma",
76       title: "Pleroma",
77       description: "Pleroma",
78       url: url
79     }
80   end
81 end