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