diff --git a/Gemfile b/Gemfile
index f6553fd1..f014403c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -12,6 +12,7 @@ gem "mysql2"
gem "highline", "~>1.5.0"
gem "RedCloth"
+gem "formatize"
gem "sanitize", "~>1.2.1"
gem "will_paginate"
gem "acts_as_list", "~>0.1.4"
diff --git a/Gemfile.lock b/Gemfile.lock
index 5059bc4c..39cfc5b8 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -33,6 +33,7 @@ GEM
acts_as_list (0.1.5)
arel (3.0.2)
bcrypt-ruby (3.0.1)
+ bluecloth (2.2.0)
builder (3.0.0)
coffee-rails (3.2.2)
coffee-script (>= 2.2.0)
@@ -45,6 +46,10 @@ GEM
erubis (2.7.0)
execjs (1.3.0)
multi_json (~> 1.0)
+ formatize (1.1.0)
+ RedCloth (~> 4.2)
+ actionpack (~> 3.0)
+ bluecloth (~> 2.2)
gem_plugin (0.2.3)
highline (1.5.2)
hike (1.2.1)
@@ -131,6 +136,7 @@ DEPENDENCIES
acts_as_list (~> 0.1.4)
bcrypt-ruby (~> 3.0.0)
coffee-rails (~> 3.2.1)
+ formatize
highline (~> 1.5.0)
htmlentities (~> 4.3.0)
jquery-rails
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index f898a16c..eec99129 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -9,7 +9,6 @@ class ApplicationController < ActionController::Base
protect_from_forgery
- helper :application
include LoginSystem
helper_method :current_user, :prefs, :format_date, :markdown
@@ -143,14 +142,6 @@ class ApplicationController < ActionController::Base
return json_elems
end
- # Uses RedCloth to transform text using either Textile or Markdown Need to
- # require redcloth above RedCloth 3.0 or greater is needed to use Markdown,
- # otherwise it only handles Textile
- #
- def markdown(text)
- RedCloth.new(text).to_html
- end
-
# Here's the concept behind this "mobile content negotiation" hack: In
# addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature
# 'mobile' version designed to be suitablef or use from a phone or PDA. It
@@ -223,7 +214,7 @@ class ApplicationController < ActionController::Base
def redirect_back_or_home
respond_to do |format|
- format.html { redirect_back_or_default home_url }
+ format.html { redirect_back_or_default root_url }
format.m { redirect_back_or_default mobile_url }
end
end
diff --git a/app/controllers/integrations_controller.rb b/app/controllers/integrations_controller.rb
index 9daaa5ec..36e5e052 100644
--- a/app/controllers/integrations_controller.rb
+++ b/app/controllers/integrations_controller.rb
@@ -53,7 +53,7 @@ class IntegrationsController < ApplicationController
message = Mail.new(params[:message])
# find user
- user = User.where("preferences.sms_email = ?", message.from).includes(:preferences).first
+ user = User.where("preferences.sms_email = ?", message.from).includes(:preference).first
if user.nil?
render :text => "No user found", :status => 404
return false
diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb
index 9aa3b83e..d65af5d5 100644
--- a/app/controllers/login_controller.rb
+++ b/app/controllers/login_controller.rb
@@ -27,15 +27,13 @@ class LoginController < ApplicationController
@username = session[:cas_user]
@login_url = CASClient::Frameworks::Rails::Filter.login_url(self)
end
- if openid_enabled? && using_open_id?
- login_openid
- elsif cas_enabled? && session[:cas_user]
+ if cas_enabled? && session[:cas_user]
login_cas
else
@page_title = "TRACKS::Login"
cookies[:preferred_auth] = prefered_auth? unless cookies[:preferred_auth]
case request.method
- when :post
+ when 'POST'
if @user = User.authenticate(params['user_login'], params['user_password'])
session['user_id'] = @user.id
# If checkbox on login page checked, we don't expire the session after 1 hour
@@ -54,7 +52,7 @@ class LoginController < ApplicationController
@login = params['user_login']
notify :warning, t('login.unsuccessful')
end
- when :get
+ when 'GET'
if User.no_users_yet?
redirect_to signup_path
return
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 243fe2ee..06ad7edc 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -9,7 +9,6 @@ class ProjectsController < ApplicationController
def index
@source_view = params['_source_view'] || 'project_list'
- @new_project = current_user.projects.build
if params[:projects_and_actions]
projects_and_actions
else
@@ -19,15 +18,22 @@ class ProjectsController < ApplicationController
if params[:only_active_with_no_next_actions]
@projects = current_user.projects.active.select { |p| count_undone_todos(p) == 0 }
else
- @projects = current_user.projects
+ @projects = current_user.projects.all
end
+ @new_project = current_user.projects.build
respond_to do |format|
format.html &render_projects_html
format.m &render_projects_mobile
format.xml { render :xml => @projects.to_xml( :except => :user_id ) }
- format.rss &render_rss_feed
- format.atom &render_atom_feed
- format.text &render_text_feed
+ format.rss do
+ @feed_title = I18n.t('models.project.feed_title')
+ @feed_description = I18n.t('models.project.feed_description', :username => current_user.display_name)
+ end
+ format.atom do
+ @feed_title = I18n.t('models.project.feed_title')
+ @feed_description = I18n.t('models.project.feed_description', :username => current_user.display_name)
+ end
+ format.text
format.autocomplete &render_autocomplete
end
end
@@ -144,16 +150,9 @@ class ProjectsController < ApplicationController
render_failure "Expected post format is valid xml like so:
If you enter the following entry to your crontab, you will receive email every day around 5 AM with a list of the upcoming actions which are due within the next 7 days.
- +You can of course use other text <%= link_to 'feeds provided by Tracks', feeds_path %> -- why not email a list of next actions in a particular project to a group of colleagues who are working on the project?
@@ -100,7 +100,7 @@ If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:Do you have one of your own to add? +
Do you have one of your own to add? Tell us about it in our Tips and Tricks forum and we may include it on this page in a future versions of Tracks.
@@ -90,7 +90,7 @@If you enter the following entry to your crontab, you will receive email every day around 5 AM with a list of the upcoming actions which are due within the next 7 days.
- +You can of course use other text <%= link_to 'feeds provided by Tracks', feeds_path %> -- why not email a list of next actions in a particular project to a group of colleagues who are working on the project?
@@ -100,7 +100,7 @@ If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:Dit script neemt de verstuurder en het onderwerp van de geselecteerde email(s) +
Dit script neemt de verstuurder en het onderwerp van de geselecteerde email(s) van Mail over en maakt een nieuwe acties voor elke email met de beschrijving "Email [sender] about [subject]". De beschrijving wordt, als nodig, na 100 karakters afgebroken (dit is de limiet voor een beschrijving). Het heeft ook Growl notificaties mocht je Growl geïnstalleerd hebben.
@@ -93,7 +93,7 @@Als je de volgende regel toevoegd aan jouw crontab, dat ontvang je een e-mail op elke dag rond 05:00 met een lijst met acties waarvan de deadline afloopt binnen de komende 7 dagen.
- +Uiteraard kan je ook een andere <%= link_to 'text feed gebruiken die Tracks biedt', feeds_path %> -- bijvoorbeeld een email met een lijst van acties voor een specifiek project naar een groep collega's die werken aan dat project?
@@ -103,7 +103,7 @@ Als Tracks draait op dezelfde server als jouw mailserver, dan kan je de geïntegreerde mail handler gebruiken van Tracks. Om dit in te stellen:Je kan nu ook jouw projects/actions beheren in Gmail met de Tracks Gmail Gadget. Voeg Tracks Gmail gadget toe aan de sidebar van Gmail en volg jouw acties - of voeg een nieuwe actie toe zonder apart een nieuw browser tab/scherm te openen + of voeg een nieuwe actie toe zonder apart een nieuw browser tab/scherm te openen voor Tracks. Om dit in te stellen:
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \ - <%= home_url %>contexts.xml + <%= root_url %>contexts.xml >> <?xml version="1.0" encoding="UTF-8"?> <contexts>...</contexts>@@ -32,7 +32,7 @@@@ -115,7 +115,7 @@ Location: <%= home_url %>todos/452.xml$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \ - <%= home_url %>contexts/51.xml + <%= root_url %>contexts/51.xml >> <?xml version="1.0" encoding="UTF-8"?> <context>...</context>@@ -43,7 +43,7 @@@@ -102,9 +102,9 @@ Location: <%= home_url %>projects/65.xml$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \ - <%= home_url %>contexts/51/todos.xml + <%= root_url %>contexts/51/todos.xml >> <?xml version="1.0" encoding="UTF-8"?> <todos type="array">...</todos>@@ -75,7 +75,7 @@ field toID, created_at, modified_at, completed_atby adding the pa@@ -89,9 +89,9 @@ field to$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \ - <%= home_url %>tickler.xml?limit_fields=index + <%= root_url %>tickler.xml?limit_fields=indexID, created_at, modified_at, completed_atby adding the pa$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \ -d "<project><name>Build a treehouse for the kids</name></project>" \ - <%= home_url %>projects.xml -i + <%= root_url %>projects.xml -i >> HTTP/1.1 201 Created -Location: <%= home_url %>projects/65.xml +Location: <%= root_url %>projects/65.xml ...$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \ -d "<todo><description>Model treehouse in SketchUp</description><context_id>2</context_id><project_id>65</project_id></todo>" \ - <%= home_url %>todos.xml -i + <%= root_url %>todos.xml -i >> HTTP/1.1 201 Created -Location: <%= home_url %>todos/452.xml +Location: <%= root_url %>todos/452.xml ...$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" -X PUT \ -d "<todo><notes>use maple texture</notes></todos>" \ - <%= home_url %>todos/452.xml -i + <%= root_url %>todos/452.xml -i >> HTTP/1.1 200 OK ... @@ -135,7 +135,7 @@ Location: <%= home_url %>todos/452.xml$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" -X PUT \ - <%= home_url %>todos/452/toggle_check.xml -i + <%= root_url %>todos/452/toggle_check.xml -i >> HTTP/1.1 200 OK ... @@ -156,7 +156,7 @@ Location: <%= home_url %>todos/452.xml$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" -X DELETE \ - <%= home_url %>todos/452.xml -i + <%= root_url %>todos/452.xml -i >> HTTP/1.1 200 OK ...@@ -175,7 +175,7 @@ Location: <%= home_url %>todos/452.xml$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \ - <%= home_url %>contexts/2/todos.xml + <%= root_url %>contexts/2/todos.xml >> <?xml version="1.0" encoding="UTF-8"?> <nil-classes type="array"/> @@ -192,8 +192,8 @@ $ script/console Loading development environment (Rails 1.2.4) >> class Context < ActiveResource::Base; end => nil ->> Context.site = "<%= home_url %>" -=> "<%= home_url %>" +>> Context.site = "<%= root_url %>" +=> "<%= root_url %>" >> Context.site.user = "username" => "username" diff --git a/app/views/notes/_note_edit_form.rhtml b/app/views/notes/_note_edit_form.html.erb similarity index 90% rename from app/views/notes/_note_edit_form.rhtml rename to app/views/notes/_note_edit_form.html.erb index 6cfe5681..47f4fb0e 100644 --- a/app/views/notes/_note_edit_form.rhtml +++ b/app/views/notes/_note_edit_form.html.erb @@ -7,7 +7,7 @@ form_for(note, :html => { :class => "inline-form edit-note-form"}) do |f| -%> -<%= error_messages_for("note") %>+<%= get_list_of_error_messages_for(note) %><%= f.hidden_field( "project_id" ) %> <%= f.text_area( "body", "cols" => 70, "rows" => 15, "tabindex" => 1 ) %> diff --git a/app/views/notes/_notes_summary.rhtml b/app/views/notes/_notes_summary.html.erb similarity index 100% rename from app/views/notes/_notes_summary.rhtml rename to app/views/notes/_notes_summary.html.erb diff --git a/app/views/projects/_mobile_project_listing.rhtml b/app/views/projects/_mobile_project_listing.html.erb similarity index 100% rename from app/views/projects/_mobile_project_listing.rhtml rename to app/views/projects/_mobile_project_listing.html.erb diff --git a/app/views/projects/_new_project_form.rhtml b/app/views/projects/_new_project_form.html.erb similarity index 95% rename from app/views/projects/_new_project_form.rhtml rename to app/views/projects/_new_project_form.html.erb index 778363f7..d0e90f71 100644 --- a/app/views/projects/_new_project_form.rhtml +++ b/app/views/projects/_new_project_form.html.erb @@ -7,7 +7,7 @@<%= form_for(@new_project, :html => {:id => 'project_form',:name=>'project',:class => "inline-form", :method => :post }) do -%> -<%= render :partial => "todos/todo", :collection => @not_done, :locals => { :parent_container_type => "project" } %> - + \ No newline at end of file diff --git a/app/views/projects/_project_form.rhtml b/app/views/projects/_project_form.html.erb similarity index 95% rename from app/views/projects/_project_form.rhtml rename to app/views/projects/_project_form.html.erb index b349f9f5..8673994b 100644 --- a/app/views/projects/_project_form.rhtml +++ b/app/views/projects/_project_form.html.erb @@ -7,7 +7,7 @@ project = project_form :class => "inline-form edit-project-form", :method => :put }) do -%> -<%= error_messages_for("project") %>+<%= get_list_of_error_messages_for(@new_project) %>
<%= text_field 'project', 'name', "tabindex" => next_tab_index %>
diff --git a/app/views/projects/_project.rhtml b/app/views/projects/_project.html.erb similarity index 88% rename from app/views/projects/_project.rhtml rename to app/views/projects/_project.html.erb index 082ed641..8df03f71 100644 --- a/app/views/projects/_project.rhtml +++ b/app/views/projects/_project.html.erb @@ -5,7 +5,7 @@ <% end -%><%= project.name -%>-" class="list"><%-# list needs to be here for edit form to work -%> +@@ -18,4 +18,4 @@" class="list"> <%= render :partial => "projects/project_settings", :object => project, :locals => { :collapsible => collapsible } %><%= error_messages_for("project") %>+<%= get_list_of_error_messages_for(@project) %><%= source_view_tag( @source_view ) -%>
diff --git a/app/views/projects/_project_listing.rhtml b/app/views/projects/_project_listing.html.erb similarity index 100% rename from app/views/projects/_project_listing.rhtml rename to app/views/projects/_project_listing.html.erb diff --git a/app/views/projects/_project_settings.rhtml b/app/views/projects/_project_settings.html.erb similarity index 100% rename from app/views/projects/_project_settings.rhtml rename to app/views/projects/_project_settings.html.erb diff --git a/app/views/projects/_project_state_group.rhtml b/app/views/projects/_project_state_group.html.erb similarity index 100% rename from app/views/projects/_project_state_group.rhtml rename to app/views/projects/_project_state_group.html.erb diff --git a/app/views/projects/create.js.erb b/app/views/projects/create.js.erb index cb0a675c..e639ebdb 100644 --- a/app/views/projects/create.js.erb +++ b/app/views/projects/create.js.erb @@ -37,7 +37,7 @@ function update_active_projects_container() { } function html_for_error_messages() { - return "<%= escape_javascript(error_messages_for('project')) %>"; + return "<%= escape_javascript(get_list_of_error_messages_for(@project)) %>"; } function html_for_project_listing() { diff --git a/app/views/projects/index.atom.builder b/app/views/projects/index.atom.builder new file mode 100644 index 00000000..e95aedb7 --- /dev/null +++ b/app/views/projects/index.atom.builder @@ -0,0 +1,12 @@ +atom_feed do |feed| + feed.title(@feed_title) + feed.subtitle(@feed_description) + feed.updated(@projects.last.updated_at) + + @projects.each do |project| + feed.entry(project) do |entry| + entry.title(h(project.name)) + entry.content(project_summary(project), :type => :html) + end + end +end \ No newline at end of file diff --git a/app/views/projects/index.rss.builder b/app/views/projects/index.rss.builder new file mode 100644 index 00000000..45257446 --- /dev/null +++ b/app/views/projects/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 + + @projects.each do |project| + xml.item do + xml.title h(project.name) + xml.description project_summary(project) + xml.pubDate project.created_at.to_s(:rfc822) + xml.link project_url(project) + xml.guid project_url(project) + end + end + end +end diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb index 98338559..0d6fce21 100644 --- a/app/views/projects/show.html.erb +++ b/app/views/projects/show.html.erb @@ -14,8 +14,7 @@<%= link_to t('projects.add_note'), '#' %><%= t('projects.notes') %>
- <%= render :partial => "shared/empty", - :locals => { :message => t('projects.no_notes_attached')} %> +<%= render :partial => "notes/notes_summary", :collection => @project.notes %> @@ -29,5 +28,5 @@<%= render :partial => "shared/add_new_item_form" %> - <%= render :file => "sidebar/sidebar.html.erb" %> + <%= render :file => "sidebar/sidebar" %>diff --git a/app/views/shared/_empty.rhtml b/app/views/shared/_empty.rhtml deleted file mode 100644 index f2f2cb9f..00000000 --- a/app/views/shared/_empty.rhtml +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/lib/tracks/config.rb b/lib/tracks/config.rb index 0ca04f97..ecbd0d6d 100644 --- a/lib/tracks/config.rb +++ b/lib/tracks/config.rb @@ -1,5 +1,7 @@ module Tracks + class Config + def self.salt SITE_CONFIG['salt'] end @@ -15,7 +17,7 @@ module Tracks def self.cas_enabled? auth_schemes.include?('cas') end - + def self.prefered_auth? if SITE_CONFIG['prefered_auth'] SITE_CONFIG['prefered_auth'] @@ -23,5 +25,7 @@ module Tracks auth_schemes.first end end + end + end \ No newline at end of file diff --git a/test/functional/integrations_controller_test.rb b/test/functional/integrations_controller_test.rb index 4d36d69a..d6412389 100644 --- a/test/functional/integrations_controller_test.rb +++ b/test/functional/integrations_controller_test.rb @@ -1,16 +1,8 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper') -require 'integrations_controller' - -# Re-raise errors caught by the controller. -class IntegrationsController; def rescue_action(e) raise e end; end class IntegrationsControllerTest < ActionController::TestCase - fixtures :users, :preferences, :projects, :contexts, :todos, :recurring_todos, :tags, :taggings def setup - @controller = IntegrationsController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new end def test_page_load @@ -22,15 +14,15 @@ class IntegrationsControllerTest < ActionController::TestCase def test_cloudmailin_integration_success SITE_CONFIG['cloudmailin'] = "123456789" post :cloudmailin, { - "html"=>"", - "plain"=>"asdasd", - "x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]", - "disposable"=>"", - "from"=>"5555555555@tmomail.net", - "signature"=>"e85e908fb893394762047c21e54ce248", - "to"=>"<123123@cloudmailin.net>", - "subject"=>"asd", - "x_cc_header"=>"", + "html"=>"", + "plain"=>"asdasd", + "x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]", + "disposable"=>"", + "from"=>"5555555555@tmomail.net", + "signature"=>"e85e908fb893394762047c21e54ce248", + "to"=>"<123123@cloudmailin.net>", + "subject"=>"asd", + "x_cc_header"=>"", "message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <5555555555@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n" } @@ -40,15 +32,15 @@ class IntegrationsControllerTest < ActionController::TestCase def test_cloudmailin_integration_invalid_signature SITE_CONFIG['cloudmailin'] = "12345678901234567890" post :cloudmailin, { - "html"=>"", - "plain"=>"asdasd", - "x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]", - "disposable"=>"", - "from"=>"5555555555@tmomail.net", - "signature"=>"e85e908fb893394762047c21e54ce248", - "to"=>"<123123@cloudmailin.net>", - "subject"=>"asd", - "x_cc_header"=>"", + "html"=>"", + "plain"=>"asdasd", + "x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]", + "disposable"=>"", + "from"=>"5555555555@tmomail.net", + "signature"=>"e85e908fb893394762047c21e54ce248", + "to"=>"<123123@cloudmailin.net>", + "subject"=>"asd", + "x_cc_header"=>"", "message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <5555555555@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n" } @@ -58,18 +50,19 @@ class IntegrationsControllerTest < ActionController::TestCase def test_cloudmailin_integration_unknown_address SITE_CONFIG['cloudmailin'] = "123456789" post :cloudmailin, { - "html"=>"", - "plain"=>"asdasd", - "x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]", - "disposable"=>"", - "from"=>"444444444444@tmomail.net", - "signature"=>"6d2df0e807bfa9b77d24c31dce6d4515", - "to"=>"<123123@cloudmailin.net>", - "subject"=>"asd", - "x_cc_header"=>"", + "html"=>"", + "plain"=>"asdasd", + "x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]", + "disposable"=>"", + "from"=>"444444444444@tmomail.net", + "signature"=>"6d2df0e807bfa9b77d24c31dce6d4515", + "to"=>"<123123@cloudmailin.net>", + "subject"=>"asd", + "x_cc_header"=>"", "message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <444444444444@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n" } assert_response 404 end + end diff --git a/test/functional/login_controller_test.rb b/test/functional/login_controller_test.rb index 4e490456..fcacddea 100644 --- a/test/functional/login_controller_test.rb +++ b/test/functional/login_controller_test.rb @@ -1,19 +1,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper') -require 'login_controller' -require_dependency "login_system" - -# Re-raise errors caught by the controller. -class LoginController; def rescue_action(e) raise e end; end class LoginControllerTest < ActionController::TestCase fixtures :preferences, :users def setup - assert_equal "test", ENV['RAILS_ENV'] - assert_equal "change-me", Tracks::Config.salt - @controller = LoginController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new end #============================================ @@ -23,15 +13,16 @@ class LoginControllerTest < ActionController::TestCase def test_invalid_login post :login, {:user_login => 'cracker', :user_password => 'secret', :user_noexpiry => 'on'} assert_response :success - assert(!@response.has_session_object?(:user_id)) + assert(!session[:user_id]) assert_template "login" end def test_login_with_valid_admin_user @request.session['return-to'] = "/bogus/location" post :login, {:user_login => 'admin', :user_password => 'abracadabra', :user_noexpiry => 'on'} - user = User.find(session['user_id']) - assert_equal user.id, @response.session['user_id'] + user = User.find_by_id(session['user_id']) + assert_not_nil user + assert_equal user.id, session['user_id'] assert_equal user.login, "admin" assert user.is_admin assert_equal "Login successful: session will not expire.", flash[:notice] @@ -40,12 +31,13 @@ class LoginControllerTest < ActionController::TestCase def test_login_with_valid_standard_user post :login, {:user_login => 'jane', :user_password => 'sesame', :user_noexpiry => 'off'} - user = User.find(session['user_id']) - assert_equal user.id, @response.session['user_id'] + user = User.find_by_id(session['user_id']) + assert_not_nil user + assert_equal user.id, session['user_id'] assert_equal user.login, "jane" assert user.is_admin == false || user.is_admin == 0 assert_equal "Login successful: session will expire after 1 hour of inactivity.", flash[:notice] - assert_redirected_to home_url + assert_redirected_to root_url end def test_login_with_no_users_redirects_to_signup @@ -58,21 +50,21 @@ class LoginControllerTest < ActionController::TestCase login_as :admin_user get :logout assert_nil(session['user_id']) - assert_redirected_to :controller => 'login', :action => 'login' + assert_redirected_to login_url end # Test login with a bad password for existing user - # + # def test_login_bad_password post :login, {:user_login => 'jane', :user_password => 'wrong', :user_noexpiry => 'on'} - assert(!@response.has_session_object?(:user)) + assert(!session[:user]) assert_equal "Login unsuccessful.", flash[:warning] assert_response :success end def test_login_bad_login post :login, {:user_login => 'blah', :user_password => 'sesame', :user_noexpiry => 'on'} - assert(!@response.has_session_object?(:user)) + assert(!session[:user]) assert_equal "Login unsuccessful.", flash[:warning] assert_response :success end @@ -81,7 +73,7 @@ class LoginControllerTest < ActionController::TestCase post :login, :user_login => 'jane', :user_password => 'sesame', :user_noexpiry => "on" assert_not_nil @response.cookies["auth_token"] end - + def test_should_not_remember_me post :login, :user_login => 'jane', :user_password => 'sesame', :user_noexpiry => "off" assert_nil @response.cookies["auth_token"] @@ -92,14 +84,14 @@ class LoginControllerTest < ActionController::TestCase get :logout assert_nil @response.cookies["auth_token"] end - + def test_should_login_with_cookie users(:other_user).remember_me @request.cookies["auth_token"] = auth_token_cookie_for(:other_user) get :login assert @controller.send(:logged_in?) end - + def test_should_fail_expired_cookie_login users(:other_user).remember_me users(:other_user).update_attribute :remember_token_expires_at, 5.minutes.ago.utc @@ -107,7 +99,7 @@ class LoginControllerTest < ActionController::TestCase get :login assert !@controller.send(:logged_in?) end - + def test_should_fail_cookie_login users(:other_user).remember_me @request.cookies["auth_token"] = 'invalid_auth_token' @@ -137,10 +129,9 @@ class LoginControllerTest < ActionController::TestCase end private - + def auth_token_cookie_for(user) users(user).remember_token end - end diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index a7220667..7ec69685 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -1,15 +1,8 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper') -require File.expand_path(File.dirname(__FILE__) + '/todo_container_controller_test_base') -require 'projects_controller' -# Re-raise errors caught by the controller. -class ProjectsController; def rescue_action(e) raise e end; end - -class ProjectsControllerTest < TodoContainerControllerTestBase - fixtures :users, :todos, :preferences, :projects, :contexts, :recurring_todos +class ProjectsControllerTest < ActionController::TestCase def setup - perform_setup(Project, ProjectsController) end def test_projects_list @@ -23,35 +16,32 @@ class ProjectsControllerTest < TodoContainerControllerTestBase get :show, :id => p.to_param assert_not_nil assigns['deferred'] assert_equal 1, assigns['deferred'].size - + t = p.todos.not_completed[0] t.show_from = 1.days.from_now.utc t.save! - + get :show, :id => p.to_param assert_equal 2, assigns['deferred'].size end - + def test_show_exposes_next_project_in_same_state login_as :admin_user get :show, :id => projects(:timemachine).to_param assert_equal(projects(:moremoney), assigns['next_project']) end - + def test_show_exposes_previous_project_in_same_state login_as :admin_user get :show, :id => projects(:moremoney).to_param assert_equal(projects(:timemachine), assigns['previous_project']) end - + def test_create_project_via_ajax_increments_number_of_projects + login_as :other_user assert_ajax_create_increments_count 'My New Project' end - - def test_create_with_comma_in_name_increments_number_of_projects - assert_ajax_create_increments_count 'foo,bar' - end - + def test_todo_state_is_project_hidden_after_hiding_project p = projects(:timemachine) todos = p.todos.find_in_state(:all, :active) @@ -75,12 +65,14 @@ class ProjectsControllerTest < TodoContainerControllerTestBase assert p.reload().active? 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 Projects' @@ -102,7 +94,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end end end - + def test_rss_feed_not_accessible_to_anonymous_user_without_token login_as nil get :index, { :format => "rss" } @@ -125,8 +117,8 @@ class ProjectsControllerTest < TodoContainerControllerTestBase login_as :admin_user get :index, { :format => "atom" } assert_equal 'application/atom+xml', @response.content_type - #puts @response.body - + # puts @response.body + assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do assert_select '>title', 'Tracks Projects' assert_select '>subtitle', "Lists all the projects for #{users(:admin_user).display_name}" @@ -159,7 +151,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase 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" } @@ -171,10 +163,10 @@ class ProjectsControllerTest < TodoContainerControllerTestBase login_as :admin_user p = projects(:timemachine) p.todos.each { |t| t.destroy } - + get :index, { :format => "txt", :only_active_with_no_next_actions => true } - assert (/^\s*BUILD A WORKING TIME MACHINE\s+0 actions. Project is active.\s*$/.match(@response.body)) - assert !(/[1-9] actions/.match(@response.body)) + assert (/^\s*BUILD A WORKING TIME MACHINE\s+0 actions. Project is active.\s*$/.match(@response.body)) + assert !(/[1-9] actions/.match(@response.body)) end def test_text_feed_not_accessible_to_anonymous_user_without_token @@ -194,12 +186,12 @@ class ProjectsControllerTest < TodoContainerControllerTestBase get :index, { :format => "txt", :token => users(:admin_user).token } assert_response :ok end - + def test_actionize_sorts_active_projects_by_number_of_tasks login_as :admin_user u = users(:admin_user) post :actionize, :state => "active", :format => 'js' - + assert_equal 1, projects(:gardenclean).position assert_equal 2, projects(:moremoney).position assert_equal 3, projects(:timemachine).position @@ -211,15 +203,15 @@ class ProjectsControllerTest < TodoContainerControllerTestBase post :alphabetize, :state => "active", :format => 'js' assert_equal 1, projects(:timemachine).position assert_equal 2, projects(:gardenclean).position - assert_equal 3, projects(:moremoney).position + assert_equal 3, projects(:moremoney).position end - + def test_alphabetize_assigns_state login_as :admin_user post :alphabetize, :state => "active", :format => 'js' assert_equal "active", assigns['state'] end - + def test_alphabetize_assigns_projects login_as :admin_user post :alphabetize, :state => "active", :format => 'js' @@ -230,7 +222,4 @@ class ProjectsControllerTest < TodoContainerControllerTestBase assert_equal projects(:moremoney), exposed_projects[2] end - def protect_against_forgery? - false - end end diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb index d9b461aa..9a81f39c 100644 --- a/test/functional/users_controller_test.rb +++ b/test/functional/users_controller_test.rb @@ -112,7 +112,7 @@ class UsersControllerTest < ActionController::TestCase def test_create_redirects_to_home_page login_as :admin_user post :create, :user => {:login => 'newbie', :password => 'newbiepass', :password_confirmation => 'newbiepass'} - assert_redirected_to home_url + assert_redirected_to root_url end def test_create_sets_flash_message diff --git a/test/test_helper.rb b/test/test_helper.rb index b4de452d..359a74f2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,6 +2,8 @@ ENV["RAILS_ENV"] = "test" require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' +{ :salt => "change-me", :authentication_schemes => ["database", "open_id"], :prefered_auth => "database"}.each{|k,v| SITE_CONFIG[k]=v} + class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. # @@ -15,17 +17,7 @@ class ActiveSupport::TestCase yield assert_not_equal initial_value, object.send(method), "#{object}##{method}" end -end - -module Tracks - class Config - def self.salt - "change-me" - end - def self.auth_schemes - return ["database","open_id"] - end - end + end class ActionController::TestCase