+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