Merge remote-tracking branch 'upstream/pull/5517'

This commit is contained in:
Tom Hughes 2025-01-19 15:01:25 +00:00
commit fb7762feb9
10 changed files with 152 additions and 133 deletions

View file

@ -0,0 +1,109 @@
require "test_helper"
module Traces
class FeedsControllerTest < ActionDispatch::IntegrationTest
##
# test all routes which lead to this controller
def test_routes
assert_routing(
{ :path => "/traces/rss", :method => :get },
{ :controller => "traces/feeds", :action => "show", :format => :rss }
)
assert_routing(
{ :path => "/traces/tag/tagname/rss", :method => :get },
{ :controller => "traces/feeds", :action => "show", :tag => "tagname", :format => :rss }
)
assert_routing(
{ :path => "/user/username/traces/rss", :method => :get },
{ :controller => "traces/feeds", :action => "show", :display_name => "username", :format => :rss }
)
assert_routing(
{ :path => "/user/username/traces/tag/tagname/rss", :method => :get },
{ :controller => "traces/feeds", :action => "show", :display_name => "username", :tag => "tagname", :format => :rss }
)
end
def test_show
user = create(:user)
# The fourth test below is surprisingly sensitive to timestamp ordering when the timestamps are equal.
trace_a = create(:trace, :visibility => "public", :timestamp => 4.seconds.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "London")
end
trace_b = create(:trace, :visibility => "public", :timestamp => 3.seconds.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "Birmingham")
end
create(:trace, :visibility => "private", :user => user, :timestamp => 2.seconds.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "London")
end
create(:trace, :visibility => "private", :user => user, :timestamp => 1.second.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "Birmingham")
end
# First with the public feed
get traces_feed_path
check_trace_feed [trace_b, trace_a]
# Restrict traces to those with a given tag
get traces_feed_path(:tag => "London")
check_trace_feed [trace_a]
end
def test_show_user
user = create(:user)
second_user = create(:user)
create(:user)
create(:trace)
trace_b = create(:trace, :visibility => "public", :timestamp => 4.seconds.ago, :user => user)
trace_c = create(:trace, :visibility => "public", :timestamp => 3.seconds.ago, :user => user) do |trace|
create(:tracetag, :trace => trace, :tag => "London")
end
create(:trace, :visibility => "private")
# Test a user with no traces
get traces_feed_path(:display_name => second_user)
check_trace_feed []
# Test the user with the traces - should see only public ones
get traces_feed_path(:display_name => user)
check_trace_feed [trace_c, trace_b]
# Should only see traces with the correct tag when a tag is specified
get traces_feed_path(:display_name => user, :tag => "London")
check_trace_feed [trace_c]
# Should no traces if the user does not exist
get traces_feed_path(:display_name => "UnknownUser")
check_trace_feed []
end
private
def check_trace_feed(traces)
assert_response :success
assert_template "traces/feeds/show"
assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "title"
assert_select "description"
assert_select "link"
assert_select "image"
assert_select "item", :count => traces.length do |items|
traces.zip(items).each do |trace, item|
assert_select item, "title", trace.name
assert_select item, "link", "http://www.example.com/user/#{ERB::Util.u(trace.user.display_name)}/traces/#{trace.id}"
assert_select item, "guid", "http://www.example.com/user/#{ERB::Util.u(trace.user.display_name)}/traces/#{trace.id}"
assert_select item, "description" do
assert_dom_encoded do
assert_select "img[src='#{trace_icon_url trace.user, trace}']"
end
end
# assert_select item, "dc:creator", trace.user.display_name
assert_select item, "pubDate", trace.timestamp.rfc822
end
end
end
end
end
end
end

View file

@ -30,23 +30,6 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
{ :controller => "traces", :action => "mine", :tag => "tagname" }
)
assert_routing(
{ :path => "/traces/rss", :method => :get },
{ :controller => "traces", :action => "georss", :format => :rss }
)
assert_routing(
{ :path => "/traces/tag/tagname/rss", :method => :get },
{ :controller => "traces", :action => "georss", :tag => "tagname", :format => :rss }
)
assert_routing(
{ :path => "/user/username/traces/rss", :method => :get },
{ :controller => "traces", :action => "georss", :display_name => "username", :format => :rss }
)
assert_routing(
{ :path => "/user/username/traces/tag/tagname/rss", :method => :get },
{ :controller => "traces", :action => "georss", :display_name => "username", :tag => "tagname", :format => :rss }
)
assert_routing(
{ :path => "/user/username/traces/1", :method => :get },
{ :controller => "traces", :action => "show", :display_name => "username", :id => "1" }
@ -333,61 +316,6 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
end
end
# Check the RSS feed
def test_rss
user = create(:user)
# The fourth test below is surprisingly sensitive to timestamp ordering when the timestamps are equal.
trace_a = create(:trace, :visibility => "public", :timestamp => 4.seconds.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "London")
end
trace_b = create(:trace, :visibility => "public", :timestamp => 3.seconds.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "Birmingham")
end
create(:trace, :visibility => "private", :user => user, :timestamp => 2.seconds.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "London")
end
create(:trace, :visibility => "private", :user => user, :timestamp => 1.second.ago) do |trace|
create(:tracetag, :trace => trace, :tag => "Birmingham")
end
# First with the public feed
get traces_rss_path
check_trace_feed [trace_b, trace_a]
# Restrict traces to those with a given tag
get traces_rss_path(:tag => "London")
check_trace_feed [trace_a]
end
# Check the RSS feed for a specific user
def test_rss_user
user = create(:user)
second_user = create(:user)
create(:user)
create(:trace)
trace_b = create(:trace, :visibility => "public", :timestamp => 4.seconds.ago, :user => user)
trace_c = create(:trace, :visibility => "public", :timestamp => 3.seconds.ago, :user => user) do |trace|
create(:tracetag, :trace => trace, :tag => "London")
end
create(:trace, :visibility => "private")
# Test a user with no traces
get traces_rss_path(:display_name => second_user.display_name)
check_trace_feed []
# Test the user with the traces - should see only public ones
get traces_rss_path(:display_name => user.display_name)
check_trace_feed [trace_c, trace_b]
# Should only see traces with the correct tag when a tag is specified
get traces_rss_path(:display_name => user.display_name, :tag => "London")
check_trace_feed [trace_c]
# Should no traces if the user does not exist
get traces_rss_path(:display_name => "UnknownUser")
check_trace_feed []
end
# Test showing a trace
def test_show
public_trace_file = create(:trace, :visibility => "public")
@ -721,34 +649,6 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
private
def check_trace_feed(traces)
assert_response :success
assert_template "georss"
assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "title"
assert_select "description"
assert_select "link"
assert_select "image"
assert_select "item", :count => traces.length do |items|
traces.zip(items).each do |trace, item|
assert_select item, "title", trace.name
assert_select item, "link", "http://www.example.com/user/#{ERB::Util.u(trace.user.display_name)}/traces/#{trace.id}"
assert_select item, "guid", "http://www.example.com/user/#{ERB::Util.u(trace.user.display_name)}/traces/#{trace.id}"
assert_select item, "description" do
assert_dom_encoded do
assert_select "img[src='#{trace_icon_url trace.user, trace}']"
end
end
# assert_select item, "dc:creator", trace.user.display_name
assert_select item, "pubDate", trace.timestamp.rfc822
end
end
end
end
end
def check_trace_index(traces)
assert_response :success
assert_template "index"