diff --git a/config.ru b/config.ru new file mode 100644 index 00000000000..8a9cdcc4d72 --- /dev/null +++ b/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run OpenProject::Application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 00000000000..ad535593c0e --- /dev/null +++ b/config/application.rb @@ -0,0 +1,65 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +# If you have a Gemfile, require the gems listed there, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(:default, Rails.env) if defined?(Bundler) + +if RUBY_VERSION >= '1.9' + Encoding.default_external = 'UTF-8' + Encoding.default_internal = 'UTF-8' +end + +module OpenProject + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Custom directories with classes and modules you want to be autoloadable. + config.autoload_paths += %W( #{::Rails.root.to_s}/app/sweepers ) + config.autoload_paths << Rails.root.join('lib').to_s + + # Only load the plugins named here, in the order given (default is alphabetical). + # :all can be used as a placeholder for all plugins not explicitly named. + # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + # Activate observers that should always be running. + # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + config.active_record.observers = :journal_observer, + :message_observer, + :issue_observer, + :news_observer, + :document_observer, + :wiki_content_observer, + :comment_observer + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + + # JavaScript files you want as :defaults (application.js is always included). + # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) + + # Configure the default encoding used in templates for Ruby 1.9. + config.encoding = "utf-8" + + # Configure sensitive parameters which will be filtered from the log file. + config.filter_parameters += [:password] + + # Use redmine's custom plugin locater + #require File.join(::Rails.root.to_s, "lib/redmine_plugin_locator") + #config.plugin_locators << RedminePluginLocator + + # Load any local configuration that is kept out of source control + # (e.g. patches). + if File.exists?(File.join(File.dirname(__FILE__), 'additional_environment.rb')) + instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_environment.rb')) + end + end +end diff --git a/config/boot.rb b/config/boot.rb index d0a0960565b..4489e58688c 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,137 +1,6 @@ -#-- encoding: UTF-8 -#-- copyright -# ChiliProject is a project management system. -# -# Copyright (C) 2010-2011 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# See doc/COPYRIGHT.rdoc for more details. -#++ +require 'rubygems' -# Don't change this file! -# Configure your app in config/environment.rb and config/environments/*.rb +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT) - -module Rails - class << self - def boot! - unless booted? - preinitialize - pick_boot.run - end - end - - def booted? - defined? Rails::Initializer - end - - def pick_boot - (vendor_rails? ? VendorBoot : GemBoot).new - end - - def vendor_rails? - File.exist?("#{RAILS_ROOT}/vendor/rails") - end - - def preinitialize - load(preinitializer_path) if File.exist?(preinitializer_path) - end - - def preinitializer_path - "#{RAILS_ROOT}/config/preinitializer.rb" - end - end - - class Boot - def run - load_initializer - - # This block was added for bundler support while following setup - # instructions from http://gembundler.com/rails23.html - Rails::Initializer.class_eval do - def load_gems - @bundler_loaded ||= Bundler.require :default, Rails.env - end - end - - Rails::Initializer.run(:set_load_path) - end - end - - class VendorBoot < Boot - def load_initializer - require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer" - Rails::Initializer.run(:install_gem_spec_stubs) - Rails::GemDependency.add_frozen_gem_path - end - end - - class GemBoot < Boot - def load_initializer - self.class.load_rubygems - load_rails_gem - require 'initializer' - end - - def load_rails_gem - if version = self.class.gem_version - gem 'rails', version - else - gem 'rails' - end - rescue Gem::LoadError => load_error - if load_error.message =~ /Could not find RubyGem rails/ - STDERR.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) - exit 1 - else - raise - end - end - - class << self - def rubygems_version - Gem::RubyGemsVersion rescue nil - end - - def gem_version - if defined? RAILS_GEM_VERSION - RAILS_GEM_VERSION - elsif ENV.include?('RAILS_GEM_VERSION') - ENV['RAILS_GEM_VERSION'] - else - parse_gem_version(read_environment_rb) - end - end - - def load_rubygems - min_version = '1.3.2' - require 'rubygems' - unless rubygems_version >= min_version - $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.) - exit 1 - end - - rescue LoadError - $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org) - exit 1 - end - - def parse_gem_version(text) - $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/ - end - - private - def read_environment_rb - File.read("#{RAILS_ROOT}/config/environment.rb") - end - end - end -end - -# All that for this: -Rails.boot! +require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) diff --git a/config/environment.rb b/config/environment.rb index 3c17419369e..193afc26ced 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,81 +1,5 @@ -#-- encoding: UTF-8 -#-- copyright -# ChiliProject is a project management system. -# -# Copyright (C) 2010-2011 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# See doc/COPYRIGHT.rdoc for more details. -#++ +# Load the rails application +require File.expand_path('../application', __FILE__) -# Be sure to restart your web server when you modify this file. - -# Uncomment below to force Rails into production mode when -# you don't control web/app server and can't set it the proper way -# ENV['RAILS_ENV'] ||= 'production' - -# Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.3.14' unless defined? RAILS_GEM_VERSION - -if RUBY_VERSION >= '1.9' - Encoding.default_external = 'UTF-8' - Encoding.default_internal = 'UTF-8' -end - -# Bootstrap the Rails environment, frameworks, and default configuration -require File.join(File.dirname(__FILE__), 'boot') - -# Load Engine plugin if available -begin - require File.join(File.dirname(__FILE__), '../vendor/plugins/engines/boot') -rescue LoadError - # Not available -end - -Rails::Initializer.run do |config| - # Settings in config/environments/* take precedence those specified here - - # Skip frameworks you're not going to use - # config.frameworks -= [ :action_web_service, :action_mailer ] - - # Add additional load paths for sweepers - config.autoload_paths += %W( #{RAILS_ROOT}/app/sweepers ) - - # Force all environments to use the same logger level - # (by default production uses :info, the others :debug) - # config.log_level = :debug - - # Enable page/fragment caching by setting a file-based store - # (remember to create the caching directory and make it readable to the application) - # config.action_controller.cache_store = :file_store, "#{RAILS_ROOT}/tmp/cache" - - # Activate observers that should always be running - # config.active_record.observers = :cacher, :garbage_collector - config.active_record.observers = :journal_observer, :message_observer, :issue_observer, :news_observer, :document_observer, :wiki_content_observer, :comment_observer - - # Make Active Record use UTC-base instead of local time - # config.active_record.default_timezone = :utc - - # Use Active Record's schema dumper instead of SQL when creating the test database - # (enables use of different database adapters for development and test environments) - # config.active_record.schema_format = :ruby - - # Deliveries are disabled by default. Do NOT modify this section. - # Define your email configuration in configuration.yml instead. - # It will automatically turn deliveries on - config.action_mailer.perform_deliveries = false - - # Use redmine's custom plugin locater - require File.join(RAILS_ROOT, "lib/redmine_plugin_locator") - config.plugin_locators << RedminePluginLocator - - # Load any local configuration that is kept out of source control - # (e.g. patches). - if File.exists?(File.join(File.dirname(__FILE__), 'additional_environment.rb')) - instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_environment.rb')) - end -end +# Initialize the rails application +OpenProject::Application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index 8044831d400..e2907afdbaa 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,31 +1,26 @@ -#-- encoding: UTF-8 -#-- copyright -# ChiliProject is a project management system. -# -# Copyright (C) 2010-2011 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# See doc/COPYRIGHT.rdoc for more details. -#++ +OpenProject::Application.configure do + # Settings specified here will take precedence over those in config/application.rb -# Settings specified here will take precedence over those in config/environment.rb + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the webserver when you make code changes. + config.cache_classes = false -# In the development environment your application's code is reloaded on -# every request. This slows down response time but is perfect for development -# since you don't have to restart the webserver when you make code changes. -config.cache_classes = false + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true -# Log error messages when you accidentally call methods on nil. -config.whiny_nils = true + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_view.debug_rjs = true + config.action_controller.perform_caching = false -# Show full error reports and disable caching -config.action_controller.consider_all_requests_local = true -config.action_view.debug_rjs = true -config.action_controller.perform_caching = false + # Don't care if the mailer can't send + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger + config.active_support.deprecation = :log + + # Only use best-standards-support built into browsers + config.action_dispatch.best_standards_support = :builtin +end -# Don't care if the mailer can't send -config.action_mailer.raise_delivery_errors = false \ No newline at end of file diff --git a/config/environments/production.rb b/config/environments/production.rb index 858ad0f8c52..7a7b734493b 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,44 +1,51 @@ -#-- encoding: UTF-8 -#-- copyright -# ChiliProject is a project management system. -# -# Copyright (C) 2010-2011 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# See doc/COPYRIGHT.rdoc for more details. -#++ +OpenProject::Application.configure do + # Settings specified here will take precedence over those in config/application.rb -# Settings specified here will take precedence over those in config/environment.rb + # The production environment is meant for finished, "live" apps. + # Code is not reloaded between requests + config.cache_classes = true -# The production environment is meant for finished, "live" apps. -# Code is not reloaded between requests -config.cache_classes = true + # Full error reports are disabled and caching is turned on + config.consider_all_requests_local = false + config.action_controller.perform_caching = true -##### -# Customize the default logger (http://ruby-doc.org/core/classes/Logger.html) -# -# Use a different logger for distributed setups -# config.logger = SyslogLogger.new -# -# Rotate logs bigger than 1MB, keeps no more than 7 rotated logs around. -# When setting a new Logger, make sure to set it's log level too. -# -# config.logger = Logger.new(config.log_path, 7, 1048576) -# config.logger.level = Logger::INFO + # Specifies the header that your server uses for sending files + config.action_dispatch.x_sendfile_header = "X-Sendfile" + # No email in production log + config.action_mailer.logger = nil -# Full error reports are disabled and caching is turned on -config.action_controller.consider_all_requests_local = false -config.action_controller.perform_caching = true + # For nginx: + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' -# Enable serving of images, stylesheets, and javascripts from an asset server -# config.action_controller.asset_host = "http://assets.example.com" + # If you have no front-end server that supports something like X-Sendfile, + # just comment this out and Rails will serve the files -# Disable delivery errors if you bad email addresses should just be ignored -config.action_mailer.raise_delivery_errors = false + # See everything in the log (default is :info) + # config.log_level = :debug -# No email in production log -config.action_mailer.logger = nil + # Use a different logger for distributed setups + # config.logger = SyslogLogger.new + + # Use a different cache store in production + # config.cache_store = :mem_cache_store + + # Disable Rails's static asset server + # In production, Apache or nginx will already do this + config.serve_static_assets = false + + # Enable serving of images, stylesheets, and javascripts from an asset server + # config.action_controller.asset_host = "http://assets.example.com" + + # Disable delivery errors, bad email addresses will be ignored + # config.action_mailer.raise_delivery_errors = false + + # Enable threaded mode + # config.threadsafe! + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found) + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners + config.active_support.deprecation = :notify +end diff --git a/config/environments/test.rb b/config/environments/test.rb index d64c781fcb9..ff0bcbb7eec 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,39 +1,35 @@ -#-- encoding: UTF-8 -#-- copyright -# ChiliProject is a project management system. -# -# Copyright (C) 2010-2011 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# See doc/COPYRIGHT.rdoc for more details. -#++ +OpenProject::Application.configure do + # Settings specified here will take precedence over those in config/application.rb -# Settings specified here will take precedence over those in config/environment.rb + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true -# The test environment is used exclusively to run your application's -# test suite. You never need to work with it otherwise. Remember that -# your test database is "scratch space" for the test suite and is wiped -# and recreated between test runs. Don't rely on the data there! -config.cache_classes = true + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true -# Log error messages when you accidentally call methods on nil. -config.whiny_nils = true + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false -# Show full error reports and disable caching -config.action_controller.consider_all_requests_local = true -config.action_controller.perform_caching = false + # Raise exceptions instead of rendering exception templates + config.action_dispatch.show_exceptions = false -config.action_mailer.perform_deliveries = true -config.action_mailer.delivery_method = :test + # Disable request forgery protection in test environment + config.action_controller.allow_forgery_protection = false -config.action_controller.session = { - :key => "_test_session", - :secret => "some secret phrase for the tests." -} + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test -# Skip protect_from_forgery in requests http://m.onkey.org/2007/9/28/csrf-protection-for-your-existing-rails-application -config.action_controller.allow_forgery_protection = false + # Use SQL instead of Active Record's schema dumper when creating the test database. + # This is necessary if your schema can't be completely dumped by the schema dumper, + # like if you have constraints or database-specific column types + # config.active_record.schema_format = :sql + + # Print deprecation notices to the stderr + config.active_support.deprecation = :stderr +end diff --git a/config/routes.rb b/config/routes.rb index 0c9d4a6b132..a77a81dd1c6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,8 +11,7 @@ # # See doc/COPYRIGHT.rdoc for more details. #++ - -ActionController::Routing::Routes.draw do |map| +OpenProject::Application.routes.draw do |map| # Add your own custom routes here. # The priority is based upon order of creation: first created -> highest priority. diff --git a/public/javascripts/rails.js b/public/javascripts/rails.js new file mode 100644 index 00000000000..88eac6e458b --- /dev/null +++ b/public/javascripts/rails.js @@ -0,0 +1,202 @@ +(function() { + Ajax.Responders.register({ + onCreate: function(request) { + var token = $$('meta[name=csrf-token]')[0]; + if (token) { + if (!request.options.requestHeaders) request.options.requestHeaders = {}; + request.options.requestHeaders['X-CSRF-Token'] = token.readAttribute('content'); + } + } + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + function isEventSupported(eventName) { + var el = document.createElement('div'); + eventName = 'on' + eventName; + var isSupported = (eventName in el); + if (!isSupported) { + el.setAttribute(eventName, 'return;'); + isSupported = typeof el[eventName] == 'function'; + } + el = null; + return isSupported; + } + + function isForm(element) { + return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'; + } + + function isInput(element) { + if (Object.isElement(element)) { + var name = element.nodeName.toUpperCase(); + return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'; + } + else return false; + } + + var submitBubbles = isEventSupported('submit'), + changeBubbles = isEventSupported('change'); + + if (!submitBubbles || !changeBubbles) { + // augment the Event.Handler class to observe custom events when needed + Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap( + function(init, element, eventName, selector, callback) { + init(element, eventName, selector, callback); + // is the handler being attached to an element that doesn't support this event? + if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) || + (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) { + // "submit" => "emulated:submit" + this.eventName = 'emulated:' + this.eventName; + } + } + ); + } + + if (!submitBubbles) { + // discover forms on the page by observing focus events which always bubble + document.on('focusin', 'form', function(focusEvent, form) { + // special handler for the real "submit" event (one-time operation) + if (!form.retrieve('emulated:submit')) { + form.on('submit', function(submitEvent) { + var emulated = form.fire('emulated:submit', submitEvent, true); + // if custom event received preventDefault, cancel the real one too + if (emulated.returnValue === false) submitEvent.preventDefault(); + }); + form.store('emulated:submit', true); + } + }); + } + + if (!changeBubbles) { + // discover form inputs on the page + document.on('focusin', 'input, select, textarea', function(focusEvent, input) { + // special handler for real "change" events + if (!input.retrieve('emulated:change')) { + input.on('change', function(changeEvent) { + input.fire('emulated:change', changeEvent, true); + }); + input.store('emulated:change', true); + } + }); + } + + function handleRemote(element) { + var method, url, params; + + var event = element.fire("ajax:before"); + if (event.stopped) return false; + + if (element.tagName.toLowerCase() === 'form') { + method = element.readAttribute('method') || 'post'; + url = element.readAttribute('action'); + // serialize the form with respect to the submit button that was pressed + params = element.serialize({ submit: element.retrieve('rails:submit-button') }); + // clear the pressed submit button information + element.store('rails:submit-button', null); + } else { + method = element.readAttribute('data-method') || 'get'; + url = element.readAttribute('href'); + params = {}; + } + + new Ajax.Request(url, { + method: method, + parameters: params, + evalScripts: true, + + onCreate: function(response) { element.fire("ajax:create", response); }, + onComplete: function(response) { element.fire("ajax:complete", response); }, + onSuccess: function(response) { element.fire("ajax:success", response); }, + onFailure: function(response) { element.fire("ajax:failure", response); } + }); + + element.fire("ajax:after"); + } + + function insertHiddenField(form, name, value) { + form.insert(new Element('input', { type: 'hidden', name: name, value: value })); + } + + function handleMethod(element) { + var method = element.readAttribute('data-method'), + url = element.readAttribute('href'), + csrf_param = $$('meta[name=csrf-param]')[0], + csrf_token = $$('meta[name=csrf-token]')[0]; + + var form = new Element('form', { method: "POST", action: url, style: "display: none;" }); + $(element.parentNode).insert(form); + + if (method !== 'post') { + insertHiddenField(form, '_method', method); + } + + if (csrf_param) { + insertHiddenField(form, csrf_param.readAttribute('content'), csrf_token.readAttribute('content')); + } + + form.submit(); + } + + function disableFormElements(form) { + form.select('input[type=submit][data-disable-with]').each(function(input) { + input.store('rails:original-value', input.getValue()); + input.setValue(input.readAttribute('data-disable-with')).disable(); + }); + } + + function enableFormElements(form) { + form.select('input[type=submit][data-disable-with]').each(function(input) { + input.setValue(input.retrieve('rails:original-value')).enable(); + }); + } + + function allowAction(element) { + var message = element.readAttribute('data-confirm'); + return !message || confirm(message); + } + + document.on('click', 'a[data-confirm], a[data-remote], a[data-method]', function(event, link) { + if (!allowAction(link)) { + event.stop(); + return false; + } + + if (link.readAttribute('data-remote')) { + handleRemote(link); + event.stop(); + } else if (link.readAttribute('data-method')) { + handleMethod(link); + event.stop(); + } + }); + + document.on("click", "form input[type=submit], form button[type=submit], form button:not([type])", function(event, button) { + // register the pressed submit button + event.findElement('form').store('rails:submit-button', button.name || false); + }); + + document.on("submit", function(event) { + var form = event.findElement(); + + if (!allowAction(form)) { + event.stop(); + return false; + } + + if (form.readAttribute('data-remote')) { + handleRemote(form); + event.stop(); + } else { + disableFormElements(form); + } + }); + + document.on('ajax:create', 'form', function(event, form) { + if (form == event.findElement()) disableFormElements(form); + }); + + document.on('ajax:complete', 'form', function(event, form) { + if (form == event.findElement()) enableFormElements(form); + }); +})(); diff --git a/script/rails b/script/rails new file mode 100755 index 00000000000..f8da2cffd4d --- /dev/null +++ b/script/rails @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. + +APP_PATH = File.expand_path('../../config/application', __FILE__) +require File.expand_path('../../config/boot', __FILE__) +require 'rails/commands' diff --git a/test/test_helper.rb b/test/test_helper.rb index 210e39c5b0e..ee4a8018716 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,8 +13,9 @@ #++ ENV["RAILS_ENV"] = "test" -require File.expand_path(File.dirname(__FILE__) + "/../config/environment") -require 'test_help' +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' + require File.expand_path(File.dirname(__FILE__) + '/helper_testcase') require File.join(RAILS_ROOT,'test', 'mocks', 'open_id_authentication_mock.rb')