diff --git a/.credo.exs b/.credo.exs index dbf31d798..942e0ded3 100644 --- a/.credo.exs +++ b/.credo.exs @@ -22,7 +22,7 @@ # In the latter case `**/*.{ex,exs}` will be used. # included: ["lib/", "src/", "test/"], - excluded: [~r"/_build/", ~r"/deps/", ~r"/src/"] + excluded: [~r"/_build/", ~r"/deps/", ~r"/src/", ~r"test/service/export/feed_test.exs"] }, # # If you create your own checks, you must specify the source files for diff --git a/lib/service/export/feed.ex b/lib/service/export/feed.ex index 04f4fb3f6..6f646ed0f 100644 --- a/lib/service/export/feed.ex +++ b/lib/service/export/feed.ex @@ -163,6 +163,18 @@ defmodule Mobilizon.Service.Export.Feed do |> Entry.content({:cdata, description}, type: "html") |> Entry.published(event.publish_at || event.inserted_at) + entry = + if is_nil(event.picture) do + entry + else + entry + |> Entry.link(event.picture.file.url, + rel: "enclosure", + type: event.picture.file.content_type, + length: event.picture.file.size + ) + end + # Add tags entry = event.tags diff --git a/test/service/export/feed_test.exs b/test/service/export/feed_test.exs new file mode 100644 index 000000000..8cb199584 --- /dev/null +++ b/test/service/export/feed_test.exs @@ -0,0 +1,95 @@ +defmodule Mobilizon.Service.Feed do + use Mobilizon.DataCase + + import Mobilizon.Factory + + alias Mobilizon.Actors.Actor + alias Mobilizon.Events.{Event, FeedToken} + alias Mobilizon.Service.Export.Feed, as: FeedService + + describe "export the instance's public events" do + test "succeds" do + %Event{} = event1 = insert(:event, title: "I'm public") + %Event{} = event2 = insert(:event, visibility: :private, title: "I'm private") + %Event{} = event3 = insert(:event, title: "Another public", picture: nil) + %Event{} = event4 = insert(:event, title: "No description", description: nil) + + {:commit, rss} = FeedService.create_cache("instance") + assert rss =~ "#{String.replace(event1.title, "'", "'")}" + refute rss =~ "#{String.replace(event2.title, "'", "'")}" + assert rss =~ "#{String.replace(event3.title, "'", "'")}" + assert rss =~ "#{String.replace(event4.title, "'", "'")}" + + assert Enum.sort(Regex.scan(~r|\|, rss)) == + Enum.sort([ + [ + "" + ], + [ + "" + ] + ]) + end + + test "with 50 events" do + Enum.each(0..50, fn i -> + %Event{} = insert(:event, title: "Event #{i}") + end) + + {:commit, rss} = FeedService.create_cache("instance") + + Enum.each(0..50, fn i -> + assert rss =~ "Event #{i}" + end) + end + + test "an actor feedtoken" do + user = insert(:user) + actor = insert(:actor, user: user) + %FeedToken{token: token} = insert(:feed_token, user: user, actor: actor) + event = insert(:event) + insert(:participant, event: event, actor: actor, role: :participant) + + tags_maped = + Enum.map_join( + Enum.sort(event.tags, &(&1.slug >= &2.slug)), + "\n ", + &"" + ) + + # credo:disable-for-lines:30 CredoCodeClimate + expectedrss = """ + + + #{actor.banner.url} + #{actor.avatar.url} + Test instance + + + + #{Actor.display_name(actor)} + #{actor.url} + + http://mobilizon.test/@#{actor.preferred_username}/feed/atom + #{Actor.display_name(actor)}'s private events feed on Test instance + + + #{tags_maped} + + #{DateTime.to_iso8601(event.publish_at)} + + + #{event.url} + #{event.title} + + + + """ + + {:commit, rss} = FeedService.create_cache("token_#{ShortUUID.encode!(token)}") + rss = Regex.replace(~r|\.*\|, rss, "") + assert rss == String.replace(expectedrss, "\n", "") + end + end +end