1 # frozen_string_literal: true
6 class FeedsControllerTest < ActionDispatch::IntegrationTest
8 # test all routes which lead to this controller
11 { :path => "/traces/rss", :method => :get },
12 { :controller => "traces/feeds", :action => "show", :format => :rss }
15 { :path => "/traces/tag/tagname/rss", :method => :get },
16 { :controller => "traces/feeds", :action => "show", :tag => "tagname", :format => :rss }
19 { :path => "/user/username/traces/rss", :method => :get },
20 { :controller => "traces/feeds", :action => "show", :display_name => "username", :format => :rss }
23 { :path => "/user/username/traces/tag/tagname/rss", :method => :get },
24 { :controller => "traces/feeds", :action => "show", :display_name => "username", :tag => "tagname", :format => :rss }
30 # The fourth test below is surprisingly sensitive to timestamp ordering when the timestamps are equal.
31 trace_a = create(:trace, :visibility => "public", :timestamp => 4.seconds.ago) do |trace|
32 create(:tracetag, :trace => trace, :tag => "London")
34 trace_b = create(:trace, :visibility => "public", :timestamp => 3.seconds.ago) do |trace|
35 create(:tracetag, :trace => trace, :tag => "Birmingham")
37 create(:trace, :visibility => "private", :user => user, :timestamp => 2.seconds.ago) do |trace|
38 create(:tracetag, :trace => trace, :tag => "London")
40 create(:trace, :visibility => "private", :user => user, :timestamp => 1.second.ago) do |trace|
41 create(:tracetag, :trace => trace, :tag => "Birmingham")
44 # First with the public feed
46 check_trace_feed [trace_b, trace_a]
48 # Restrict traces to those with a given tag
49 get traces_feed_path(:tag => "London")
50 check_trace_feed [trace_a]
55 second_user = create(:user)
58 trace_b = create(:trace, :visibility => "public", :timestamp => 4.seconds.ago, :user => user)
59 trace_c = create(:trace, :visibility => "public", :timestamp => 3.seconds.ago, :user => user) do |trace|
60 create(:tracetag, :trace => trace, :tag => "London")
62 create(:trace, :visibility => "private")
64 # Test a user with no traces
65 get traces_feed_path(:display_name => second_user)
68 # Test the user with the traces - should see only public ones
69 get traces_feed_path(:display_name => user)
70 check_trace_feed [trace_c, trace_b]
72 # Should only see traces with the correct tag when a tag is specified
73 get traces_feed_path(:display_name => user, :tag => "London")
74 check_trace_feed [trace_c]
76 # Should no traces if the user does not exist
77 get traces_feed_path(:display_name => "UnknownUser")
81 def test_show_disabled
82 with_settings(:traces_disabled => true) do
83 get traces_feed_path(:format => :rss)
84 assert_response :not_found
90 def check_trace_feed(traces)
91 assert_response :success
92 assert_template "traces/feeds/show"
93 assert_equal "application/rss+xml", @response.media_type
94 assert_select "rss", :count => 1 do
95 assert_select "channel", :count => 1 do |channel|
97 assert_select "description"
100 assert_select "item", :count => traces.length
102 traces.zip(channel.css("item")).each do |trace, item|
103 assert_select item, "title", trace.name
104 assert_select item, "link", "http://www.example.com/user/#{ERB::Util.u(trace.user.display_name)}/traces/#{trace.id}"
105 assert_select item, "guid", "http://www.example.com/user/#{ERB::Util.u(trace.user.display_name)}/traces/#{trace.id}"
106 assert_select item, "description" do
107 assert_dom_encoded do
108 assert_select "img[src='#{trace_icon_url trace.user, trace}']"
111 # assert_select item, "dc:creator", trace.user.display_name
112 assert_select item, "pubDate", trace.timestamp.rfc822