# Pleroma: A lightweight social networking server # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrlTest do use Pleroma.DataCase test "s3 signed url is parsed correct for expiration time" do url = "https://pleroma.social/amz" {:ok, timestamp} = Timex.now() |> DateTime.truncate(:second) |> Timex.format("{ISO:Basic:Z}") # in seconds valid_till = 30 metadata = construct_metadata(timestamp, valid_till, url) expire_time = Timex.parse!(timestamp, "{ISO:Basic:Z}") |> Timex.to_unix() |> Kernel.+(valid_till) assert {:ok, expire_time} == Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl.ttl(metadata, url) end test "s3 signed url is parsed and correct ttl is set for rich media" do url = "https://pleroma.social/amz" {:ok, timestamp} = Timex.now() |> DateTime.truncate(:second) |> Timex.format("{ISO:Basic:Z}") # in seconds valid_till = 30 metadata = construct_metadata(timestamp, valid_till, url) body = """ """ Tesla.Mock.mock(fn %{ method: :get, url: "https://pleroma.social/amz" } -> %Tesla.Env{status: 200, body: body} end) Cachex.put(:rich_media_cache, url, metadata) Pleroma.Web.RichMedia.Parser.set_ttl_based_on_image(metadata, url) {:ok, cache_ttl} = Cachex.ttl(:rich_media_cache, url) # as there is delay in setting and pulling the data from cache we ignore 1 second # make it 2 seconds for flakyness assert_in_delta(valid_till * 1000, cache_ttl, 2000) end defp construct_s3_url(timestamp, valid_till) do "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" end defp construct_metadata(timestamp, valid_till, url) do %{ image: construct_s3_url(timestamp, valid_till), site: "Pleroma", title: "Pleroma", description: "Pleroma", url: url } end end