Mercurial > hg > soundsoftware-site
comparison .svn/pristine/c4/c4b7e166da06347732efe23afdfc246d0e8be00e.svn-base @ 909:cbb26bc654de redmine-1.3
Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author | Chris Cannam |
---|---|
date | Fri, 24 Feb 2012 19:09:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
908:c6c2cbd0afee | 909:cbb26bc654de |
---|---|
1 # Contains the enhancements to assist in testing plugins. See Engines::Testing | |
2 # for more details. | |
3 | |
4 require 'test/unit' | |
5 | |
6 require 'tmpdir' | |
7 require 'fileutils' | |
8 | |
9 # In most cases, Rails' own plugin testing mechanisms are sufficient. However, there | |
10 # are cases where plugins can be given a helping hand in the testing arena. This module | |
11 # contains some methods to assist when testing plugins that contain fixtures. | |
12 # | |
13 # == Fixtures and plugins | |
14 # | |
15 # Since Rails' own fixtures method is fairly strict about where files can be loaded from, | |
16 # the simplest approach when running plugin tests with fixtures is to simply copy all | |
17 # fixtures into a single temporary location and inform the standard Rails mechanism to | |
18 # use this directory, rather than RAILS_ROOT/test/fixtures. | |
19 # | |
20 # The Engines::Testing#setup_plugin_fixtures method does this, copying all plugin fixtures | |
21 # into the temporary location before and tests are performed. This behaviour is invoked | |
22 # the the rake tasks provided by the Engines plugin, in the "test:plugins" namespace. If | |
23 # necessary, you can invoke the task manually. | |
24 # | |
25 # If you wish to take advantage of this, add a call to the Engines::Testing.set_fixture_path | |
26 # method somewhere before your tests (in a test_helper file, or above the TestCase itself). | |
27 # | |
28 # = Testing plugins | |
29 # | |
30 # Normally testing a plugin will require that Rails is loaded, unless you are including | |
31 # a skeleton Rails environment or set of mocks within your plugin tests. If you require | |
32 # the Rails environment to be started, you must ensure that this actually happens; while | |
33 # it's not obvious, your tests do not automatically run with Rails loaded. | |
34 # | |
35 # The simplest way to setup plugin tests is to include a test helper with the following | |
36 # contents: | |
37 # | |
38 # # Load the normal Rails helper. This ensures the environment is loaded | |
39 # require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper') | |
40 # # Ensure that we are using the temporary fixture path | |
41 # Engines::Testing.set_fixture_path | |
42 # | |
43 # Then run tests using the provided tasks (<tt>test:plugins</tt>, or the tasks that the engines | |
44 # plugin provides - <tt>test:plugins:units</tt>, etc.). | |
45 # | |
46 # Alternatively, you can explicitly load the environment by adpating the contents of the | |
47 # default <tt>test_helper</tt>: | |
48 # | |
49 # ENV["RAILS_ENV"] = "test" | |
50 # # Note that we are requiring config/environment from the root of the enclosing application. | |
51 # require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment") | |
52 # require 'test_help' | |
53 # | |
54 module Engines::Testing | |
55 mattr_accessor :temporary_fixtures_directory | |
56 self.temporary_fixtures_directory = FileUtils.mkdir_p(File.join(Dir.tmpdir, "rails_fixtures")) | |
57 | |
58 # Copies fixtures from plugins and the application into a temporary directory | |
59 # (Engines::Testing.temporary_fixtures_directory). | |
60 # | |
61 # If a set of plugins is not given, fixtures are copied from all plugins in order | |
62 # of precedence, meaning that plugins can 'overwrite' the fixtures of others if they are | |
63 # loaded later; the application's fixtures are copied last, allowing any custom fixtures | |
64 # to override those in the plugins. If no argument is given, plugins are loaded via | |
65 # PluginList#by_precedence. | |
66 # | |
67 # This method is called by the engines-supplied plugin testing rake tasks | |
68 def self.setup_plugin_fixtures(plugins = Engines.plugins.by_precedence) | |
69 | |
70 # First, clear the directory | |
71 Dir.glob("#{self.temporary_fixtures_directory}/*.yml").each{|fixture| File.delete(fixture)} | |
72 | |
73 # Copy all plugin fixtures, and then the application fixtures, into this directory | |
74 plugins.each do |plugin| | |
75 plugin_fixtures_directory = File.join(plugin.directory, "test", "fixtures") | |
76 plugin_app_directory = File.join(plugin.directory, "app") | |
77 if File.directory?(plugin_app_directory) && File.directory?(plugin_fixtures_directory) | |
78 Engines.mirror_files_from(plugin_fixtures_directory, self.temporary_fixtures_directory) | |
79 end | |
80 end | |
81 Engines.mirror_files_from(File.join(RAILS_ROOT, "test", "fixtures"), | |
82 self.temporary_fixtures_directory) | |
83 end | |
84 | |
85 # Sets the fixture path used by Test::Unit::TestCase to the temporary | |
86 # directory which contains all plugin fixtures. | |
87 def self.set_fixture_path | |
88 ActiveSupport::TestCase.fixture_path = self.temporary_fixtures_directory | |
89 $LOAD_PATH.unshift self.temporary_fixtures_directory | |
90 end | |
91 | |
92 # overridden test should be in test/{unit,functional,integration}/{plugin_name}/{test_name} | |
93 def self.override_tests_from_app | |
94 filename = caller.first.split(":").first | |
95 plugin_name = filename.split("/")[-4] | |
96 test_kind = filename.split("/")[-2] | |
97 override_file = File.expand_path(File.join(File.dirname(filename), "..", "..", "..", "..", "..", "test", | |
98 test_kind, plugin_name, File.basename(filename))) | |
99 load(override_file) if File.exist?(override_file) | |
100 end | |
101 end |