Tests!
authorTom Hughes <tom@compton.nu>
Wed, 4 Mar 2015 21:49:43 +0000 (21:49 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 4 Mar 2015 21:49:43 +0000 (21:49 +0000)
12 files changed:
.rubocop_todo.yml
app/controllers/application_controller.rb
test/controllers/changeset_controller_test.rb
test/controllers/diary_entry_controller_test.rb
test/controllers/notes_controller_test.rb
test/controllers/site_controller_test.rb
test/fixtures/changesets_subscribers.yml
test/fixtures/users.yml
test/integration/locale_test.rb [new file with mode: 0644]
test/integration/oauth_test.rb
test/integration/user_terms_seen_test.rb
test/models/trace_test.rb

index 0251691..a993d5f 100644 (file)
@@ -28,7 +28,7 @@ Lint/ParenthesesAsGroupedExpression:
 
 # Offense count: 542
 Metrics/AbcSize:
-  Max: 194
+  Max: 270
 
 # Offense count: 12
 Metrics/BlockNesting:
@@ -37,7 +37,7 @@ Metrics/BlockNesting:
 # Offense count: 60
 # Configuration parameters: CountComments.
 Metrics/ClassLength:
-  Max: 1543
+  Max: 1552
 
 # Offense count: 68
 Metrics/CyclomaticComplexity:
index 8322201..618f08a 100644 (file)
@@ -389,12 +389,6 @@ class ApplicationController < ActionController::Base
     render :action => "timeout"
   end
 
-  ##
-  # is the requestor logged in?
-  def logged_in?
-    !@user.nil?
-  end
-
   ##
   # ensure that there is a "this_user" instance variable
   def lookup_this_user
index 6a44385..148e547 100644 (file)
@@ -1892,16 +1892,23 @@ EOF
     assert_response :success
 
     assert_difference "ChangesetComment.count", 1 do
-      assert_no_difference "ActionMailer::Base.deliveries.size" do
+      assert_difference "ActionMailer::Base.deliveries.size", 1 do
         post :comment, :id => changesets(:normal_user_subscribed_change).id, :text => "This is a comment"
       end
     end
     assert_response :success
 
+    email = ActionMailer::Base.deliveries.first
+    assert_equal 1, email.to.length
+    assert_equal "[OpenStreetMap] test2 has commented on one of your changesets", email.subject
+    assert_equal "test@openstreetmap.org", email.to.first
+
+    ActionMailer::Base.deliveries.clear
+
     basic_authorization(users(:second_public_user).email, "test")
 
     assert_difference "ChangesetComment.count", 1 do
-      assert_difference "ActionMailer::Base.deliveries.size", 1 do
+      assert_difference "ActionMailer::Base.deliveries.size", 2 do
         post :comment, :id => changesets(:normal_user_subscribed_change).id, :text => "This is a comment"
       end
     end
@@ -1909,6 +1916,11 @@ EOF
 
     email = ActionMailer::Base.deliveries.first
     assert_equal 1, email.to.length
+    assert_equal "[OpenStreetMap] pulibc_test2 has commented on one of your changesets", email.subject
+    assert_equal "test@openstreetmap.org", email.to.first
+
+    email = ActionMailer::Base.deliveries.second
+    assert_equal 1, email.to.length
     assert_equal "[OpenStreetMap] pulibc_test2 has commented on a changeset you are interested in", email.subject
     assert_equal "test@example.com", email.to.first
 
index aa90ecd..1e700da 100644 (file)
@@ -147,6 +147,32 @@ class DiaryEntryControllerTest < ActionController::TestCase
     assert_equal new_language_code, entry.language_code
   end
 
+  def test_new_spammy
+    # Generate some spammy content
+    spammy_title = "Spam Spam Spam Spam Spam"
+    spammy_body = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ")
+
+    # Try creating a spammy diary entry
+    assert_difference "DiaryEntry.count", 1 do
+      post :new, { :commit => "save",
+                   :diary_entry => { :title => spammy_title, :body => spammy_body, :language_code => "en" } },
+           { :user => users(:normal_user).id }
+    end
+    assert_response :redirect
+    assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name
+    entry = DiaryEntry.order(:id).last
+    assert_equal users(:normal_user).id, entry.user_id
+    assert_equal spammy_title, entry.title
+    assert_equal spammy_body, entry.body
+    assert_equal "en", entry.language_code
+    assert_equal "suspended", User.find(users(:normal_user).id).status
+
+    # Follow the redirect
+    get :list, { :display_name => users(:normal_user).display_name }, { :user => users(:normal_user).id }
+    assert_response :redirect
+    assert_redirected_to :controller => :user, :action => :suspended
+  end
+
   def test_edit
     entry = diary_entries(:normal_user_entry_1)
 
@@ -287,7 +313,7 @@ class DiaryEntryControllerTest < ActionController::TestCase
     assert_match /New comment/, email.text_part.decoded
     assert_match /New comment/, email.html_part.decoded
     ActionMailer::Base.deliveries.clear
-    comment = DiaryComment.find(5)
+    comment = DiaryComment.order(:id).last
     assert_equal entry.id, comment.diary_entry_id
     assert_equal users(:public_user).id, comment.user_id
     assert_equal "New comment", comment.body
@@ -296,13 +322,51 @@ class DiaryEntryControllerTest < ActionController::TestCase
     get :view, :display_name => entry.user.display_name, :id => entry.id
     assert_response :success
     assert_select ".diary-comment", :count => 1 do
-      assert_select "#comment5", :count => 1 do
+      assert_select "#comment#{comment.id}", :count => 1 do
         assert_select "a[href='/user/#{users(:public_user).display_name}']", :text => users(:public_user).display_name, :count => 1
       end
       assert_select ".richtext", :text => /New comment/, :count => 1
     end
   end
 
+  def test_comment_spammy
+    # Find the entry to comment on
+    entry = diary_entries(:normal_user_entry_1)
+
+    # Generate some spammy content
+    spammy_text = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ")
+
+    # Try creating a spammy comment
+    assert_difference "ActionMailer::Base.deliveries.size", 1 do
+      assert_difference "DiaryComment.count", 1 do
+        post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => spammy_text } }, { :user => users(:public_user).id }
+      end
+    end
+    assert_response :redirect
+    assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id
+    email = ActionMailer::Base.deliveries.first
+    assert_equal [users(:normal_user).email], email.to
+    assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on your diary entry", email.subject
+    assert_match %r{http://example.com/spam}, email.text_part.decoded
+    assert_match %r{http://example.com/spam}, email.html_part.decoded
+    ActionMailer::Base.deliveries.clear
+    comment = DiaryComment.order(:id).last
+    assert_equal entry.id, comment.diary_entry_id
+    assert_equal users(:public_user).id, comment.user_id
+    assert_equal spammy_text, comment.body
+    assert_equal "suspended", User.find(users(:public_user).id).status
+
+    # Follow the redirect
+    get :list, { :display_name => users(:normal_user).display_name }, { :user => users(:public_user).id }
+    assert_response :redirect
+    assert_redirected_to :controller => :user, :action => :suspended
+
+    # Now view the diary entry, and check the new comment is not present
+    get :view, :display_name => entry.user.display_name, :id => entry.id
+    assert_response :success
+    assert_select ".diary-comment", :count => 0
+  end
+
   def test_list_all
     # Try a list of all diary entries
     get :list
index 96f535e..16ad623 100644 (file)
@@ -281,6 +281,48 @@ class NotesControllerTest < ActionController::TestCase
     assert_nil js["properties"]["comments"].last["user"]
 
     ActionMailer::Base.deliveries.clear
+
+    basic_authorization(users(:public_user).email, "test")
+
+    assert_difference "NoteComment.count", 1 do
+      assert_difference "ActionMailer::Base.deliveries.size", 2 do
+        post :comment, :id => notes(:note_with_comments_by_users).id, :text => "This is an additional comment", :format => "json"
+      end
+    end
+    assert_response :success
+    js = ActiveSupport::JSON.decode(@response.body)
+    assert_not_nil js
+    assert_equal "Feature", js["type"]
+    assert_equal notes(:note_with_comments_by_users).id, js["properties"]["id"]
+    assert_equal "open", js["properties"]["status"]
+    assert_equal 4, js["properties"]["comments"].count
+    assert_equal "commented", js["properties"]["comments"].last["action"]
+    assert_equal "This is an additional comment", js["properties"]["comments"].last["text"]
+    assert_equal "test2", js["properties"]["comments"].last["user"]
+
+    email = ActionMailer::Base.deliveries.first
+    assert_equal 1, email.to.length
+    assert_equal "[OpenStreetMap] test2 has commented on one of your notes", email.subject
+    assert_equal "test@openstreetmap.org", email.to.first
+
+    email = ActionMailer::Base.deliveries.second
+    assert_equal 1, email.to.length
+    assert_equal "[OpenStreetMap] test2 has commented on a note you are interested in", email.subject
+    assert_equal "public@OpenStreetMap.org", email.to.first
+
+    get :show, :id => notes(:note_with_comments_by_users).id, :format => "json"
+    assert_response :success
+    js = ActiveSupport::JSON.decode(@response.body)
+    assert_not_nil js
+    assert_equal "Feature", js["type"]
+    assert_equal notes(:note_with_comments_by_users).id, js["properties"]["id"]
+    assert_equal "open", js["properties"]["status"]
+    assert_equal 4, js["properties"]["comments"].count
+    assert_equal "commented", js["properties"]["comments"].last["action"]
+    assert_equal "This is an additional comment", js["properties"]["comments"].last["text"]
+    assert_equal "test2", js["properties"]["comments"].last["user"]
+
+    ActionMailer::Base.deliveries.clear
   end
 
   def test_comment_fail
index 01c1f3a..7fa558e 100644 (file)
@@ -199,6 +199,28 @@ class SiteControllerTest < ActionController::TestCase
     assert_template "index"
   end
 
+  # Test the right editor gets used when the URL has an override
+  def test_edit_with_override
+    get :edit, { :editor => "id" }, { :user => users(:public_user).id }
+    assert_response :success
+    assert_template "edit"
+    assert_template :partial => "_id", :count => 1
+
+    get :edit, { :editor => "potlatch2" }, { :user => users(:public_user).id }
+    assert_response :success
+    assert_template "edit"
+    assert_template :partial => "_potlatch2", :count => 1
+
+    get :edit, { :editor => "potlatch" }, { :user => users(:public_user).id }
+    assert_response :success
+    assert_template "edit"
+    assert_template :partial => "_potlatch", :count => 1
+
+    get :edit, { :editor => "remote" }, { :user => users(:public_user).id }
+    assert_response :success
+    assert_template "index"
+  end
+
   # Test editing a specific node
   def test_edit_with_node
     user = users(:public_user)
index f46c688..d8bd5be 100644 (file)
@@ -1,3 +1,7 @@
 t1:
   changeset_id: 8
   subscriber_id: 2
+
+t2:
+  changeset_id: 8
+  subscriber_id: 1
index 1b95802..50e24d9 100644 (file)
@@ -63,7 +63,6 @@ second_public_user:
   home_zoom: 12
   terms_agreed: "2010-01-01 11:22:33"
   terms_seen: true
-  languages: en
 
 moderator_user:
   id: 5
diff --git a/test/integration/locale_test.rb b/test/integration/locale_test.rb
new file mode 100644 (file)
index 0000000..fbc2aff
--- /dev/null
@@ -0,0 +1,37 @@
+require "test_helper"
+
+class LocaleTest < ActionDispatch::IntegrationTest
+  fixtures :users
+
+  def test_defaulting
+    user = users(:second_public_user)
+
+    post_via_redirect "/login", :username => user.email, :password => "test"
+
+    get "/diary/new", {}
+    assert_equal [], User.find(user.id).languages
+    assert_select "html[lang=?]", "en"
+
+    get "/diary/new", {},  { "HTTP_ACCEPT_LANGUAGE" => "fr, en" }
+    assert_equal %w(fr en), User.find(user.id).languages
+    assert_select "html[lang=?]", "fr"
+  end
+
+  def test_override
+    user = users(:german_user)
+
+    get "/diary"
+    assert_select "html[lang=?]", "en"
+
+    get "/diary", :locale => "es"
+    assert_select "html[lang=?]", "es"
+
+    post_via_redirect "/login", :username => user.email, :password => "test"
+
+    get "/diary"
+    assert_select "html[lang=?]", "de"
+
+    get "/diary", :locale => "fr"
+    assert_select "html[lang=?]", "fr"
+  end
+end
index 4f0d0a8..0d6d300 100644 (file)
@@ -49,6 +49,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
     assert_response :success
 
+    signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
+    assert_response :forbidden
+
     post "/oauth/revoke", :token => token.token
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by_token(token.token)
@@ -94,6 +97,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
     signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
     assert_response :success
 
+    signed_get "/api/0.6/user/details", :consumer => client, :token => token
+    assert_response :forbidden
+
     post "/oauth/revoke", :token => token.token
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by_token(token.token)
@@ -146,6 +152,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
     assert_response :success
 
+    signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
+    assert_response :forbidden
+
     post "/oauth/revoke", :token => token.token
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by_token(token.token)
@@ -204,6 +213,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
     assert_response :success
 
+    signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
+    assert_response :forbidden
+
     post "/oauth/revoke", :token => token.token
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by_token(token.token)
@@ -255,6 +267,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
     signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
     assert_response :success
 
+    signed_get "/api/0.6/user/details", :consumer => client, :token => token
+    assert_response :forbidden
+
     post "/oauth/revoke", :token => token.token
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by_token(token.token)
@@ -315,6 +330,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
     assert_response :success
 
+    signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
+    assert_response :forbidden
+
     post "/oauth/revoke", :token => token.token
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by_token(token.token)
index 3a42aa6..678492f 100644 (file)
@@ -64,6 +64,8 @@ class UserTermsSeenTest < ActionDispatch::IntegrationTest
       # back to the terms page.
       get "/traces/mine"
       assert_redirected_to "controller" => "user", "action" => "terms", :referer => "/traces/mine"
+      get "/traces/mine", :referer => "/test"
+      assert_redirected_to "controller" => "user", "action" => "terms", :referer => "/test"
     end
   end
 
index 85b2587..524ec63 100644 (file)
@@ -7,11 +7,17 @@ class TraceTest < ActiveSupport::TestCase
   def setup
     @gpx_trace_dir = Object.send("remove_const", "GPX_TRACE_DIR")
     Object.const_set("GPX_TRACE_DIR", File.dirname(__FILE__) + "/../traces")
+
+    @gpx_image_dir = Object.send("remove_const", "GPX_IMAGE_DIR")
+    Object.const_set("GPX_IMAGE_DIR", File.dirname(__FILE__) + "/../traces")
   end
 
   def teardown
     Object.send("remove_const", "GPX_TRACE_DIR")
     Object.const_set("GPX_TRACE_DIR", @gpx_trace_dir)
+
+    Object.send("remove_const", "GPX_IMAGE_DIR")
+    Object.const_set("GPX_IMAGE_DIR", @gpx_image_dir)
   end
 
   def test_trace_count
@@ -142,6 +148,28 @@ class TraceTest < ActiveSupport::TestCase
     assert_equal "848caa72f2f456d1bd6a0fdf228aa1b9", md5sum(gpx_files(:tar_bzip_trace_file).xml_file)
   end
 
+  def test_large_picture
+    picture = gpx_files(:public_trace_file).large_picture
+    trace = Trace.create
+
+    trace.large_picture = picture
+    assert_equal "7c841749e084ee4a5d13f12cd3bef456", md5sum(File.new(trace.large_picture_name))
+    assert_equal picture, trace.large_picture
+
+    trace.destroy
+  end
+
+  def test_icon_picture
+    picture = gpx_files(:public_trace_file).icon_picture
+    trace = Trace.create
+
+    trace.icon_picture = picture
+    assert_equal "b47baf22ed0e85d77e808694fad0ee27", md5sum(File.new(trace.icon_picture_name))
+    assert_equal picture, trace.icon_picture
+
+    trace.destroy
+  end
+
   private
 
   def check_query(query, traces)