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