Create object for list tests, and assert the responses have the
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 16 Nov 2016 20:08:16 +0000 (20:08 +0000)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 16 Nov 2016 20:08:16 +0000 (20:08 +0000)
required number of results.

Previously, the tests would pass regardless of whether anything was
in the database.

test/controllers/trace_controller_test.rb

index d6159ae409d21550a64dce304b7ad9e28aeb83dd..2c47b42ec58f4db2e51db55ffaf4500da8fd8021 100644 (file)
@@ -166,27 +166,48 @@ class TraceControllerTest < ActionController::TestCase
     )
   end
 
     )
   end
 
-  # Check that the list of changesets is displayed
+  # Check that the list of traces is displayed
   def test_list
   def test_list
+    # The fourth test below is surpisingly sensitive to timestamp ordering when the timestamps are equal.
+    create(:trace, :visibility => "public", :timestamp => 4.seconds.ago) do |trace|
+      create(:tracetag, :trace => trace, :tag => "London")
+    end
+    create(:trace, :visibility => "public", :timestamp => 3.seconds.ago) do |trace|
+      create(:tracetag, :trace => trace, :tag => "Birmingham")
+    end
+    create(:trace, :visibility => "private", :user => users(:public_user), :timestamp => 2.seconds.ago) do |trace|
+      create(:tracetag, :trace => trace, :tag => "London")
+    end
+    create(:trace, :visibility => "private", :user => users(:public_user), :timestamp => 1.second.ago) do |trace|
+      create(:tracetag, :trace => trace, :tag => "Birmingham")
+    end
+
     # First with the public list
     get :list
     # First with the public list
     get :list
-    check_trace_list Trace.visible_to_all
+    check_trace_list Trace.visible_to_all, 2
 
     # Restrict traces to those with a given tag
     get :list, :tag => "London"
 
     # Restrict traces to those with a given tag
     get :list, :tag => "London"
-    check_trace_list Trace.tagged("London").visible_to_all
+    check_trace_list Trace.tagged("London").visible_to_all, 1
 
     # Should see more when we are logged in
     get :list, {}, { :user => users(:public_user).id }
 
     # Should see more when we are logged in
     get :list, {}, { :user => users(:public_user).id }
-    check_trace_list Trace.visible_to(users(:public_user).id)
+    check_trace_list Trace.visible_to(users(:public_user).id), 4
 
     # Again, we should see more when we are logged in
     get :list, { :tag => "London" }, { :user => users(:public_user).id }
 
     # Again, we should see more when we are logged in
     get :list, { :tag => "London" }, { :user => users(:public_user).id }
-    check_trace_list Trace.tagged("London").visible_to(users(:public_user).id)
+    check_trace_list Trace.visible_to(users(:public_user).id).tagged("London"), 2
   end
 
   # Check that I can get mine
   def test_list_mine
   end
 
   # Check that I can get mine
   def test_list_mine
+    create(:trace, :visibility => "public") do |trace|
+      create(:tracetag, :trace => trace, :tag => "Birmingham")
+    end
+    create(:trace, :visibility => "private", :user => users(:public_user)) do |trace|
+      create(:tracetag, :trace => trace, :tag => "London")
+    end
+
     # First try to get it when not logged in
     get :mine
     assert_redirected_to :controller => "user", :action => "login", :referer => "/traces/mine"
     # First try to get it when not logged in
     get :mine
     assert_redirected_to :controller => "user", :action => "login", :referer => "/traces/mine"
@@ -197,30 +218,36 @@ class TraceControllerTest < ActionController::TestCase
 
     # Fetch the actual list
     get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id }
 
     # Fetch the actual list
     get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id }
-    check_trace_list users(:public_user).traces
+    check_trace_list users(:public_user).traces, 1
   end
 
   end
 
-  # Check the list of changesets for a specific user
+  # Check the list of traces for a specific user
   def test_list_user
   def test_list_user
+    create(:trace)
+    create(:trace, :visibility => "public", :user => users(:public_user))
+    create(:trace, :visibility => "private", :user => users(:public_user)) do |trace|
+      create(:tracetag, :trace => trace, :tag => "London")
+    end
+
     # Test a user with no traces
     get :list, :display_name => users(:second_public_user).display_name
     # Test a user with no traces
     get :list, :display_name => users(:second_public_user).display_name
-    check_trace_list users(:second_public_user).traces.visible_to_all
+    check_trace_list users(:second_public_user).traces.visible_to_all, 0
 
     # Test a user with some traces - should see only public ones
     get :list, :display_name => users(:public_user).display_name
 
     # Test a user with some traces - should see only public ones
     get :list, :display_name => users(:public_user).display_name
-    check_trace_list users(:public_user).traces.visible_to_all
+    check_trace_list users(:public_user).traces.visible_to_all, 1
 
     # Should still see only public ones when authenticated as another user
     get :list, { :display_name => users(:public_user).display_name }, { :user => users(:normal_user).id }
 
     # Should still see only public ones when authenticated as another user
     get :list, { :display_name => users(:public_user).display_name }, { :user => users(:normal_user).id }
-    check_trace_list users(:public_user).traces.visible_to_all
+    check_trace_list users(:public_user).traces.visible_to_all, 1
 
     # Should see all traces when authenticated as the target user
     get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id }
 
     # Should see all traces when authenticated as the target user
     get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id }
-    check_trace_list users(:public_user).traces
+    check_trace_list users(:public_user).traces, 2
 
     # Should only see traces with the correct tag when a tag is specified
     get :list, { :display_name => users(:public_user).display_name, :tag => "London" }, { :user => users(:public_user).id }
 
     # Should only see traces with the correct tag when a tag is specified
     get :list, { :display_name => users(:public_user).display_name, :tag => "London" }, { :user => users(:public_user).id }
-    check_trace_list users(:public_user).traces.tagged("London")
+    check_trace_list users(:public_user).traces.tagged("London"), 1
 
     # Should get an error if the user does not exist
     get :list, :display_name => "UnknownUser"
 
     # Should get an error if the user does not exist
     get :list, :display_name => "UnknownUser"
@@ -932,11 +959,12 @@ class TraceControllerTest < ActionController::TestCase
     end
   end
 
     end
   end
 
-  def check_trace_list(traces)
+  def check_trace_list(traces, count)
     assert_response :success
     assert_template "list"
     assert_response :success
     assert_template "list"
+    assert_equal traces.count, count
 
 
-    if traces.count > 0
+    if count > 0
       assert_select "table#trace_list tbody", :count => 1 do
         assert_select "tr", :count => traces.visible.count do |rows|
           traces.visible.order("timestamp DESC").zip(rows).each do |trace, row|
       assert_select "table#trace_list tbody", :count => 1 do
         assert_select "tr", :count => traces.visible.count do |rows|
           traces.visible.order("timestamp DESC").zip(rows).each do |trace, row|