diff --git a/app/controllers/contexts_controller.rb b/app/controllers/contexts_controller.rb index f99e1715..47f1e33d 100644 --- a/app/controllers/contexts_controller.rb +++ b/app/controllers/contexts_controller.rb @@ -25,16 +25,21 @@ class ContextsController < ApplicationController format.html &render_contexts_html format.m &render_contexts_mobile format.xml { render :xml => @all_contexts.to_xml( :except => :user_id ) } - format.rss &render_contexts_rss_feed - format.atom &render_contexts_atom_feed + format.rss do + @feed_title = 'Tracks Contexts' + @feed_description = "Lists all the contexts for #{current_user.display_name}" + end + format.atom do + @feed_title = 'Tracks Contexts' + @feed_description = "Lists all the contexts for #{current_user.display_name}" + end format.text do - @all_contexts = current_user.contexts.all render :action => 'index', :layout => false, :content_type => Mime::TEXT end format.autocomplete &render_autocomplete end end - + def show @contexts = current_user.contexts(true) if @context.nil? @@ -60,15 +65,10 @@ class ContextsController < ApplicationController # def create if params[:format] == 'application/xml' && params['exception'] - render_failure "Expected post format is valid xml like so: context name.", 400 + render_failure "Expected post format is valid xml like so: context name.", 400 return end - @context = current_user.contexts.build - params_are_invalid = true - if (params['context'] || (params['request'] && params['request']['context'])) - @context.attributes = params['context'] || params['request']['context'] - params_are_invalid = false - end + @context = current_user.contexts.build(params['context']) @saved = @context.save @context_not_done_counts = { @context.id => 0 } respond_to do |format| @@ -76,9 +76,7 @@ class ContextsController < ApplicationController @down_count = current_user.contexts.size end format.xml do - if @context.new_record? && params_are_invalid - render_failure "Expected post format is valid xml like so: context name.", 400 - elsif @context.new_record? + if @context.new_record? render_failure @context.errors.to_xml, 409 else head :created, :location => context_url(@context) @@ -233,21 +231,6 @@ class ContextsController < ApplicationController render :action => 'mobile_show_context' end end - - def render_contexts_rss_feed - lambda do - render_rss_feed_for current_user.contexts.all, :feed => feed_options, - :item => { :description => lambda { |c| @template.summary(c, count_undone_todos_phrase(c)) } } - end - end - - def render_contexts_atom_feed - lambda do - render_atom_feed_for current_user.contexts.all, :feed => feed_options, - :item => { :description => lambda { |c| @template.summary(c, count_undone_todos_phrase(c)) }, - :author => lambda { |c| nil } } - end - end def render_autocomplete lambda do diff --git a/app/helpers/contexts_helper.rb b/app/helpers/contexts_helper.rb index 10d9d9e8..423d18ad 100644 --- a/app/helpers/contexts_helper.rb +++ b/app/helpers/contexts_helper.rb @@ -29,10 +29,8 @@ module ContextsHelper }) end - - def summary(context, undone_todo_count) - content_tag(:p, "#{undone_todo_count}. Context is #{context.hidden? ? 'Hidden' : 'Active'}.") + def context_summary(context, undone_todo_count) + content_tag(:p, "#{undone_todo_count}. Context is #{context.hidden? ? 'Hidden' : 'Active'}.".html_safe) end - end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 638bfba0..89b403c9 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -71,7 +71,7 @@ module ProjectsHelper }) end - def summary(project) + def project_summary(project) project_description = '' project_description += Tracks::Utils.render_text( project.description ) unless project.description.blank? project_description += content_tag(:p, diff --git a/app/models/context.rb b/app/models/context.rb index 35adab3e..d5e5be00 100644 --- a/app/models/context.rb +++ b/app/models/context.rb @@ -16,14 +16,6 @@ class Context < ActiveRecord::Base validates_length_of :name, :maximum => 255, :message => "context name must be less than 256 characters" validates_uniqueness_of :name, :message => "already exists", :scope => "user_id" - def self.feed_options(user) - # TODO: move to view or helper - { - :title => 'Tracks Contexts', - :description => "Lists all the contexts for #{user.display_name}" - } - end - def self.null_object NullContext.new end diff --git a/app/views/contexts/index.atom.builder b/app/views/contexts/index.atom.builder new file mode 100644 index 00000000..5a6cabc9 --- /dev/null +++ b/app/views/contexts/index.atom.builder @@ -0,0 +1,12 @@ +atom_feed do |feed| + feed.title(@feed_title) + feed.subtitle(@feed_description) + feed.updated(@all_contexts.last.updated_at) + + @all_contexts.each do |context| + feed.entry(context) do |entry| + entry.title(h(context.name)) + entry.content(context_summary(context, count_undone_todos_phrase(context)), :type => :html) + end + end +end \ No newline at end of file diff --git a/app/views/contexts/index.rss.builder b/app/views/contexts/index.rss.builder new file mode 100644 index 00000000..5459d1f1 --- /dev/null +++ b/app/views/contexts/index.rss.builder @@ -0,0 +1,20 @@ +xml.instruct! :xml, :version => "1.0" +xml.rss :version => "2.0" do + xml.channel do + xml.title @feed_title + xml.description @feed_description + xml.link contexts_url + xml.language 'en-us' + xml.ttl 40 + + @all_contexts.each do |context| + xml.item do + xml.title h(context.title) + xml.description context_summary(context, count_undone_todos_phrase(context)) + xml.pubDate context.created_at.to_s(:rfc822) + xml.link context_url(context) + xml.guid context_url(context) + end + end + end +end diff --git a/lib/tracks/config.rb b/lib/tracks/config.rb new file mode 100644 index 00000000..0ca04f97 --- /dev/null +++ b/lib/tracks/config.rb @@ -0,0 +1,27 @@ +module Tracks + class Config + def self.salt + SITE_CONFIG['salt'] + end + + def self.auth_schemes + SITE_CONFIG['authentication_schemes'] || [] + end + + def self.openid_enabled? + auth_schemes.include?('open_id') + end + + def self.cas_enabled? + auth_schemes.include?('cas') + end + + def self.prefered_auth? + if SITE_CONFIG['prefered_auth'] + SITE_CONFIG['prefered_auth'] + else + auth_schemes.first + end + end + end +end \ No newline at end of file diff --git a/test/functional/contexts_controller_test.rb b/test/functional/contexts_controller_test.rb index d57558b3..3aaefdae 100644 --- a/test/functional/contexts_controller_test.rb +++ b/test/functional/contexts_controller_test.rb @@ -25,10 +25,143 @@ class ContextsControllerTest < ActionController::TestCase assert_ajax_create_increments_count '@newcontext' end - def test_create_via_ajax_with_comma_in_name_does_not_increment_number_of_contexts - login_as :other_user - assert_ajax_create_does_not_increment_count 'foo,bar' + # text feed + + def test_text_feed_content + login_as :admin_user + get :index, { :format => "txt" } + assert_equal 'text/plain', @response.content_type + assert !(/ /.match(@response.body)) + end + + def test_text_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "txt" } + assert_response 401 + end + + def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "txt", :token => 'foo' } + assert_response 401 + end + + def test_text_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "txt", :token => users(:admin_user).token } + assert_response :ok end + # REST xml + + def test_show_xml_renders_context_to_xml + login_as :admin_user + get :show, { :id => "1", :format => 'xml' } + assert_equal contexts(:agenda).to_xml( :except => :user_id ), @response.body + end + + def test_show_with_nil_context_returns_404 + login_as :admin_user + get :show, { :id => "0" } + assert_equal 'Context not found', @response.body + assert_response 404 + end + + def test_show_xml_with_nil_context_returns_404 + login_as :admin_user + get :show, { :id => "0", :format => 'xml' } + assert_response 404 + assert_xml_select 'error', 'Context not found' + end + + # RSS + def test_rss_feed_content + login_as :admin_user + get :index, { :format => "rss" } + assert_equal 'application/rss+xml', @response.content_type + #puts @response.body + + assert_xml_select 'rss[version="2.0"]' do + assert_select 'channel' do + assert_select '>title', 'Tracks Contexts' + assert_select '>description', "Lists all the contexts for #{users(:admin_user).display_name}" + assert_select 'language', 'en-us' + assert_select 'ttl', '40' + end + assert_select 'item', 10 do + assert_select 'title', /.+/ + assert_select 'description' do + assert_select_encoded do + assert_select 'p', /\d+ actions. Context is (Active|Hidden)./ + end + end + %w(guid link).each do |node| + assert_select node, /http:\/\/test.host\/contexts\/.+/ + end + assert_select 'pubDate', contexts(:agenda).created_at.to_s(:rfc822) + end + end + end + + def test_rss_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "rss" } + assert_response 401 + end + + def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "rss", :token => 'foo' } + assert_response 401 + end + + def test_rss_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "rss", :token => users(:admin_user).token } + assert_response :ok + end + + # ATOM + + def test_atom_feed_content + login_as :admin_user + get :index, { :format => "atom" } + assert_equal 'application/atom+xml', @response.content_type + #puts @response.body + + assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do + assert_select '>title', 'Tracks Contexts' + assert_select '>subtitle', "Lists all the contexts for #{users(:admin_user).display_name}" + assert_select 'entry', 10 do + assert_select 'title', /.+/ + assert_select 'content[type="html"]' do + assert_select_encoded do + assert_select 'p', /\d+ actions. Context is (Active|Hidden)./ + end + end + assert_select 'published', /(#{Regexp.escape(contexts(:agenda).created_at.xmlschema)}|#{Regexp.escape(contexts(:library).created_at.xmlschema)})/ + end + end + end + + def test_atom_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "atom" } + assert_response 401 + end + + def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "atom", :token => 'foo' } + assert_response 401 + end + + def test_atom_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "atom", :token => users(:admin_user).token } + assert_response :ok + end + + end diff --git a/test/functional/move_these_to_context_controller_test.rb b/test/functional/move_these_to_context_controller_test.rb deleted file mode 100644 index 0680276b..00000000 --- a/test/functional/move_these_to_context_controller_test.rb +++ /dev/null @@ -1,134 +0,0 @@ - - def test_rss_feed_content - login_as :admin_user - get :index, { :format => "rss" } - assert_equal 'application/rss+xml', @response.content_type - #puts @response.body - - assert_xml_select 'rss[version="2.0"]' do - assert_select 'channel' do - assert_select '>title', 'Tracks Contexts' - assert_select '>description', "Lists all the contexts for #{users(:admin_user).display_name}" - assert_select 'language', 'en-us' - assert_select 'ttl', '40' - end - assert_select 'item', 10 do - assert_select 'title', /.+/ - assert_select 'description' do - assert_select_encoded do - assert_select 'p', /\d+ actions. Context is (Active|Hidden)./ - end - end - %w(guid link).each do |node| - assert_select node, /http:\/\/test.host\/contexts\/.+/ - end - assert_select 'pubDate', contexts(:agenda).created_at.to_s(:rfc822) - end - end - end - - def test_rss_feed_not_accessible_to_anonymous_user_without_token - login_as nil - get :index, { :format => "rss" } - assert_response 401 - end - - def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token - login_as nil - get :index, { :format => "rss", :token => 'foo' } - assert_response 401 - end - - def test_rss_feed_accessible_to_anonymous_user_with_valid_token - login_as nil - get :index, { :format => "rss", :token => users(:admin_user).token } - assert_response :ok - end - - def test_atom_feed_content - login_as :admin_user - get :index, { :format => "atom" } - assert_equal 'application/atom+xml', @response.content_type - #puts @response.body - - assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do - assert_select '>title', 'Tracks Contexts' - assert_select '>subtitle', "Lists all the contexts for #{users(:admin_user).display_name}" - assert_select 'entry', 10 do - assert_select 'title', /.+/ - assert_select 'content[type="html"]' do - assert_select_encoded do - assert_select 'p', /\d+ actions. Context is (Active|Hidden)./ - end - end - assert_select 'published', /(#{Regexp.escape(contexts(:agenda).created_at.xmlschema)}|#{Regexp.escape(contexts(:library).created_at.xmlschema)})/ - end - end - end - - def test_atom_feed_not_accessible_to_anonymous_user_without_token - login_as nil - get :index, { :format => "atom" } - assert_response 401 - end - - def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token - login_as nil - get :index, { :format => "atom", :token => 'foo' } - assert_response 401 - end - - def test_atom_feed_accessible_to_anonymous_user_with_valid_token - login_as nil - get :index, { :format => "atom", :token => users(:admin_user).token } - assert_response :ok - end - - def test_text_feed_content - login_as :admin_user - get :index, { :format => "txt" } - assert_equal 'text/plain', @response.content_type - assert !(/ /.match(@response.body)) - end - - def test_text_feed_not_accessible_to_anonymous_user_without_token - login_as nil - get :index, { :format => "txt" } - assert_response 401 - end - - def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token - login_as nil - get :index, { :format => "txt", :token => 'foo' } - assert_response 401 - end - - def test_text_feed_accessible_to_anonymous_user_with_valid_token - login_as nil - get :index, { :format => "txt", :token => users(:admin_user).token } - assert_response :ok - end - - def test_show_xml_renders_context_to_xml - login_as :admin_user - get :show, { :id => "1", :format => 'xml' } - assert_equal contexts(:agenda).to_xml( :except => :user_id ), @response.body - end - - def test_show_with_nil_context_returns_404 - login_as :admin_user - get :show, { :id => "0" } - assert_equal 'Context not found', @response.body - assert_response 404 - end - - def test_show_xml_with_nil_context_returns_404 - login_as :admin_user - get :show, { :id => "0", :format => 'xml' } - assert_response 404 - assert_xml_select 'error', 'Context not found' - end - - def protect_against_forgery? - false - end diff --git a/test/test_helper.rb b/test/test_helper.rb index 4d9395b9..b4de452d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -47,14 +47,26 @@ class ActionController::TestCase end def ajax_create(name) - xhr :post, :create, @controller.class.name.downcase.to_sym => {:name => name} + xhr :post, :create, get_model_class.downcase => {:name => name} + end + + def assert_xml_select(*args, &block) + @html_document = xml_document + assert_select(*args, &block) end private + def xml_document + @xml_document ||= HTML::Document.new(@response.body, false, true) + end + + def get_model_class + @controller.class.to_s.tableize.split("_")[0].camelcase.singularize #don't ask... converts ContextsController to Context + end + def get_class_count - model = @controller.class.to_s.tableize.split("_")[0].camelcase.singularize #don't ask... converts ContextsController to Context - eval("#{model}.count") + eval("#{get_model_class}.count") end end