Improving the not found handling of preferences. adding a user preference test. addin...
authorShaun McDonald <shaun@shaunmcdonald.me.uk>
Fri, 12 Dec 2008 18:54:03 +0000 (18:54 +0000)
committerShaun McDonald <shaun@shaunmcdonald.me.uk>
Fri, 12 Dec 2008 18:54:03 +0000 (18:54 +0000)
app/controllers/user_preference_controller.rb
test/functional/node_controller_test.rb
test/functional/user_preference_controller_test.rb
test/test_helper.rb

index 5594799293a1c9f79d492c54f79e128225369c04..3b56c257be32b822864b08f984c959d8f549fc27 100644 (file)
@@ -5,11 +5,9 @@ class UserPreferenceController < ApplicationController
   def read_one
     pref = UserPreference.find(@user.id, params[:preference_key])
 
-    if pref
-      render :text => pref.v.to_s
-    else
-      render :text => 'OH NOES! PREF NOT FOUND!', :status => 404
-    end
+    render :text => pref.v.to_s
+  rescue ActiveRecord::RecordNotFound => ex
+    render :text => 'OH NOES! PREF NOT FOUND!', :status => :not_found
   end
 
   def update_one
@@ -32,6 +30,8 @@ class UserPreferenceController < ApplicationController
     UserPreference.delete(@user.id, params[:preference_key])
 
     render :nothing => true
+  rescue ActiveRecord::RecordNotFound => ex
+    render :text => "param: #{params[:preference_key]} not found", :status => :not_found
   end
 
   # print out all the preferences as a big xml block
@@ -52,49 +52,43 @@ class UserPreferenceController < ApplicationController
 
   # update the entire set of preferences
   def update
-    begin
-      p = XML::Parser.new
-      p.string = request.raw_post
-      doc = p.parse
-
-      prefs = []
-
-      keyhash = {}
+    p = XML::Parser.new
+    p.string = request.raw_post
+    doc = p.parse
 
-      doc.find('//preferences/preference').each do |pt|
-        pref = UserPreference.new
+    prefs = []
 
-        unless keyhash[pt['k']].nil? # already have that key
-          render :text => 'OH NOES! CAN HAS UNIQUE KEYS?', :status => :not_acceptable
-          return
-        end
+    keyhash = {}
 
-        keyhash[pt['k']] = 1
-
-        pref.k = pt['k']
-        pref.v = pt['v']
-        pref.user_id = @user.id
-        prefs << pref
-      end
+    doc.find('//preferences/preference').each do |pt|
+      pref = UserPreference.new
 
-      if prefs.size > 150
-        render :text => 'Too many preferences', :status => :request_entity_too_large
-        return
+      unless keyhash[pt['k']].nil? # already have that key
+        render :text => 'OH NOES! CAN HAS UNIQUE KEYS?', :status => :not_acceptable
       end
 
-      # kill the existing ones
-      UserPreference.delete_all(['user_id = ?', @user.id])
+      keyhash[pt['k']] = 1
 
-      # save the new ones
-      prefs.each do |pref|
-        pref.save!
-      end
+      pref.k = pt['k']
+      pref.v = pt['v']
+      pref.user_id = @user.id
+      prefs << pref
+    end
 
-    rescue Exception => ex
-      render :text => 'OH NOES! FAIL!: ' + ex.to_s, :status => :internal_server_error
-      return
+    if prefs.size > 150
+      render :text => 'Too many preferences', :status => :request_entity_too_large
     end
 
+    # kill the existing ones
+    UserPreference.delete_all(['user_id = ?', @user.id])
+
+    # save the new ones
+    prefs.each do |pref|
+      pref.save!
+    end
     render :nothing => true
+
+  rescue Exception => ex
+    render :text => 'OH NOES! FAIL!: ' + ex.to_s, :status => :internal_server_error
   end
 end
index 2289953fe53c72ba0b3168d1c0d04bfbe6098601..bc9ffa489f1d1673bc297c67c191c6e60e29e708 100644 (file)
@@ -1,5 +1,4 @@
 require File.dirname(__FILE__) + '/../test_helper'
-require 'node_controller'
 
 class NodeControllerTest < ActionController::TestCase
   api_fixtures
index 7ff64b30ebb7a5150674b80ea335409bdd06e23d..ff44c1e36289ff9bbb938ed05770fff00806ab5e 100644 (file)
@@ -1,8 +1,26 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class UserPreferenceControllerTest < ActionController::TestCase
-  # Replace this with your real tests.
-  def test_truth
-    assert true
+  fixtures :users, :user_preferences
+  
+  def test_read
+    # first try without auth
+    get :read
+    assert_response :unauthorized, "should be authenticated"
+    
+    # now set the auth
+    basic_authorization("test@openstreetmap.org", "test")
+    
+    get :read
+    assert_response :success
+    print @response.body
+    assert_select "osm:root" do
+      assert_select "preferences", :count => 1 do
+        assert_select "preference", :count => 2
+        assert_select "preference[k=\"#{user_preferences(:a).k}\"][v=\"#{user_preferences(:a).v}\"]", :count => 1
+        assert_select "preference[k=\"#{user_preferences(:two).k}\"][v=\"#{user_preferences(:two).v}\"]", :count => 1
+      end
+    end
   end
+
 end
index ea6e91abe5ce25f79efb55892c8acea85cb9b468..88a6fbe4ac9ad139f549f5bb19c6d42bee7d083b 100644 (file)
@@ -106,5 +106,13 @@ class Test::Unit::TestCase
     assert_equal a.tags, b.tags, "tags on node #{a.id}"
   end
 
+  def basic_authorization(user, pass)
+    @request.env["HTTP_AUTHORIZATION"] = "Basic %s" % Base64.encode64("#{user}:#{pass}")
+  end
+
+  def content(c)
+    @request.env["RAW_POST_DATA"] = c.to_s
+  end
+
   # Add more helper methods to be used by all tests here...
 end