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 test "an actor feedtoken simple" do user = insert(:user) actor = insert(:actor, user: user) %FeedToken{token: token} = insert(:feed_token, user: user, actor: actor) event1 = insert(:event, title: "event owner", description: "owner", organizer_actor: actor) event2 = insert(:event, title: "event particiated", description: "particiated", picture: nil) event3 = insert(:event, visibility: :private, title: "I'm private") event4 = insert(:event, title: "No description", description: nil) insert(:participant, event: event2, actor: actor, role: :participant) {:commit, ics} = FeedService.create_cache("token_#{ShortUUID.encode!(token)}") refute ics =~ event4.title refute ics =~ event3.title assert ics =~ event1.title assert ics =~ event2.title end test "by actor preferred_username simple" do user = insert(:user) actor = insert(:actor, user: user) event1 = insert(:event, title: "event owner", description: "owner", organizer_actor: actor) event2 = insert(:event, title: "event particiated", description: "particiated", picture: nil) event3 = insert(:event, visibility: :private, title: "I'm private") event4 = insert(:event, title: "No description", description: nil) insert(:participant, event: event2, actor: actor, role: :participant) {:commit, ics} = FeedService.create_cache("actor_#{actor.preferred_username}") refute ics =~ event4.title refute ics =~ event3.title assert ics =~ event1.title assert ics =~ event2.title end test "by actor feedtoken complexe" do user = insert(:user) actor = insert(:actor, user: user) %FeedToken{token: token} = insert(:feed_token, user: user, actor: actor) event1 = insert(:event, title: "event simple owner", description: "owner", organizer_actor: actor) event2 = insert(:event, title: "event particiated", description: "particiated", picture: nil) event3 = insert(:event, title: "event owner and particiated", description: "owner & particiated", picture: nil, organizer_actor: actor ) insert(:participant, event: event2, actor: actor, role: :participant) insert(:participant, event: event3, actor: actor, role: :participant) {:commit, ics} = FeedService.create_cache("token_#{ShortUUID.encode!(token)}") assert ics |> String.split(event1.title) |> length() == 2 assert ics |> String.split(event2.title) |> length() == 2 assert ics |> String.split(event3.title) |> length() == 2 end test "by actor preferred_username complexe" do user = insert(:user) actor = insert(:actor, user: user) event1 = insert(:event, title: "event simple owner", description: "owner", organizer_actor: actor) event2 = insert(:event, title: "event particiated", description: "particiated", picture: nil) event3 = insert(:event, title: "event owner and particiated", description: "owner & particiated", picture: nil, organizer_actor: actor ) insert(:participant, event: event2, actor: actor, role: :participant) insert(:participant, event: event3, actor: actor, role: :participant) {:commit, ics} = FeedService.create_cache("actor_#{actor.preferred_username}") assert ics |> String.split(event1.title) |> length() == 2 assert ics |> String.split(event2.title) |> length() == 2 assert ics |> String.split(event3.title) |> length() == 2 end end end