Add backend and endpoints for Feed Tokens
Closes #19 #86 #87 Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -24,7 +24,7 @@ defmodule MobilizonWeb.FeedControllerTest do
|
||||
|
||||
{:ok, feed} = ElixirFeedParser.parse(conn.resp_body)
|
||||
|
||||
assert feed.title == actor.preferred_username <> "'s public events feed"
|
||||
assert feed.title == actor.preferred_username <> "'s public events feed on Mobilizon"
|
||||
|
||||
[entry1, entry2] = entries = feed.entries
|
||||
|
||||
@@ -139,4 +139,151 @@ defmodule MobilizonWeb.FeedControllerTest do
|
||||
assert entry1.categories == [event1.category, tag1.slug, tag2.slug]
|
||||
end
|
||||
end
|
||||
|
||||
describe "/events/going/:token/atom" do
|
||||
test "it returns an atom feed of all events for all identities for an user token", %{
|
||||
conn: conn
|
||||
} do
|
||||
user = insert(:user)
|
||||
actor1 = insert(:actor, user: user)
|
||||
actor2 = insert(:actor, user: user)
|
||||
event1 = insert(:event)
|
||||
event2 = insert(:event)
|
||||
insert(:participant, event: event1, actor: actor1)
|
||||
insert(:participant, event: event2, actor: actor2)
|
||||
feed_token = insert(:feed_token, user: user, actor: nil)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> get(
|
||||
Routes.feed_url(Endpoint, :going, feed_token.token, "atom")
|
||||
|> URI.decode()
|
||||
)
|
||||
|
||||
assert response(conn, 200) =~ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
||||
assert response_content_type(conn, :xml) =~ "charset=utf-8"
|
||||
|
||||
{:ok, feed} = ElixirFeedParser.parse(conn.resp_body)
|
||||
|
||||
assert feed.title == "Feed for #{user.email} on Mobilizon"
|
||||
|
||||
entries = feed.entries
|
||||
|
||||
Enum.each(entries, fn entry ->
|
||||
assert entry.title in [event1.title, event2.title]
|
||||
end)
|
||||
end
|
||||
|
||||
test "it returns an atom feed of all events a single identity for an actor token", %{
|
||||
conn: conn
|
||||
} do
|
||||
user = insert(:user)
|
||||
actor1 = insert(:actor, user: user)
|
||||
actor2 = insert(:actor, user: user)
|
||||
event1 = insert(:event)
|
||||
event2 = insert(:event)
|
||||
insert(:participant, event: event1, actor: actor1)
|
||||
insert(:participant, event: event2, actor: actor2)
|
||||
feed_token = insert(:feed_token, user: user, actor: actor1)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("accept", "application/atom+xml")
|
||||
|> get(
|
||||
Routes.feed_url(Endpoint, :going, feed_token.token, "atom")
|
||||
|> URI.decode()
|
||||
)
|
||||
|
||||
assert response(conn, 200) =~ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
||||
assert response_content_type(conn, :xml) =~ "charset=utf-8"
|
||||
|
||||
{:ok, feed} = ElixirFeedParser.parse(conn.resp_body)
|
||||
|
||||
assert feed.title == "#{actor1.preferred_username}'s private events feed on Mobilizon"
|
||||
|
||||
[entry] = feed.entries
|
||||
assert entry.title == event1.title
|
||||
end
|
||||
|
||||
test "it returns 404 for an not existing feed", %{conn: conn} do
|
||||
conn =
|
||||
conn
|
||||
|> get(
|
||||
Routes.feed_url(Endpoint, :going, "not existing", "atom")
|
||||
|> URI.decode()
|
||||
)
|
||||
|
||||
assert response(conn, 404)
|
||||
end
|
||||
end
|
||||
|
||||
describe "/events/going/:token/ics" do
|
||||
test "it returns an ical feed of all events for all identities for an user token", %{
|
||||
conn: conn
|
||||
} do
|
||||
user = insert(:user)
|
||||
actor1 = insert(:actor, user: user)
|
||||
actor2 = insert(:actor, user: user)
|
||||
event1 = insert(:event)
|
||||
event2 = insert(:event)
|
||||
insert(:participant, event: event1, actor: actor1)
|
||||
insert(:participant, event: event2, actor: actor2)
|
||||
feed_token = insert(:feed_token, user: user, actor: nil)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("accept", "text/calendar")
|
||||
|> get(
|
||||
Routes.feed_url(Endpoint, :going, feed_token.token, "ics")
|
||||
|> URI.decode()
|
||||
)
|
||||
|
||||
assert response(conn, 200) =~ "BEGIN:VCALENDAR"
|
||||
assert response_content_type(conn, :calendar) =~ "charset=utf-8"
|
||||
|
||||
entries = ExIcal.parse(conn.resp_body)
|
||||
|
||||
Enum.each(entries, fn entry ->
|
||||
assert entry.summary in [event1.title, event2.title]
|
||||
end)
|
||||
end
|
||||
|
||||
test "it returns an ical feed of all events a single identity for an actor token", %{
|
||||
conn: conn
|
||||
} do
|
||||
user = insert(:user)
|
||||
actor1 = insert(:actor, user: user)
|
||||
actor2 = insert(:actor, user: user)
|
||||
event1 = insert(:event)
|
||||
event2 = insert(:event)
|
||||
insert(:participant, event: event1, actor: actor1)
|
||||
insert(:participant, event: event2, actor: actor2)
|
||||
feed_token = insert(:feed_token, user: user, actor: actor1)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("accept", "text/calendar")
|
||||
|> get(
|
||||
Routes.feed_url(Endpoint, :going, feed_token.token, "ics")
|
||||
|> URI.decode()
|
||||
)
|
||||
|
||||
assert response(conn, 200) =~ "BEGIN:VCALENDAR"
|
||||
assert response_content_type(conn, :calendar) =~ "charset=utf-8"
|
||||
|
||||
[entry1] = ExIcal.parse(conn.resp_body)
|
||||
assert entry1.summary == event1.title
|
||||
end
|
||||
|
||||
test "it returns 404 for an not existing feed", %{conn: conn} do
|
||||
conn =
|
||||
conn
|
||||
|> get(
|
||||
Routes.feed_url(Endpoint, :going, "not existing", "ics")
|
||||
|> URI.decode()
|
||||
)
|
||||
|
||||
assert response(conn, 404)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -152,4 +152,14 @@ defmodule Mobilizon.Factory do
|
||||
role: :not_approved
|
||||
}
|
||||
end
|
||||
|
||||
def feed_token_factory do
|
||||
user = build(:user)
|
||||
|
||||
%Mobilizon.Events.FeedToken{
|
||||
user: user,
|
||||
actor: build(:actor, user: user),
|
||||
token: Ecto.UUID.generate()
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user