plugins_tests.rake
4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
all_plugins = Dir.glob('plugins/*').map { |f| File.basename(f) } - ['template']
def enabled_plugins
Dir.glob('config/plugins/*').map { |f| File.basename(f) } - ['README']
end
disabled_plugins = all_plugins - enabled_plugins
task 'db:test:plugins:prepare' do
if Dir.glob('config/plugins/*/db/migrate/*.rb').empty?
puts "I: skipping database setup, enabled plugins have no migrations"
else
Rake::Task['db:test:prepare'].invoke
sh 'rake db:migrate RAILS_ENV=test SCHEMA=/dev/null'
end
end
def plugin_name(plugin)
"#{plugin} plugin"
end
def plugin_enabled?(plugin)
File.exist?(File.join('config', 'plugins', plugin))
end
def plugin_disabled_warning(plugin)
puts "E: you should enable #{plugin} plugin before running it's tests!"
end
def task2ext(task)
(task == :selenium || task == :cucumber) ? :feature : :rb
end
def task2profile(task, plugin)
if task == :cucumber
return plugin
elsif task == :selenium
return "#{plugin}_selenium"
else
return 'default'
end
end
def filename2plugin(filename)
filename.split('/')[1]
end
def task2folder(task)
result = case task.to_sym
when :units
:unit
when :functionals
:functional
when :integration
:integration
when :cucumber
:features
when :selenium
:features
end
return result
end
def run_test(name, files)
files = Array(files)
plugin = filename2plugin(files.first)
if name == :cucumber || name == :selenium
run_cucumber task2_profile(name, plugin), files
else
run_testrb files
end
end
def run_testrb(files)
sh 'testrb', '-Itest', *files
end
def run_cucumber(profile, files)
sh 'xvfb-run', 'ruby', '-S', 'cucumber', '--profile', profile.to_s, '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *files
end
def custom_run(name, files, run=:individually)
case run
when :all
run_test name, files
when :individually
files.each do |file|
run_test name, file
end
when :by_plugin
end
end
def run_tests(name, plugins, run=:individually)
plugins = Array(plugins)
glob = "plugins/{#{plugins.join(',')}}/test/#{task2folder(name)}/**/*.#{task2ext(name)}"
files = Dir.glob(glob)
if files.empty?
puts "I: no tests to run #{name}"
else
custom_run(name, files, run)
end
end
def plugin_test_task(name, plugin, run=:individually)
desc "Run #{name} tests for #{plugin_name(plugin)}"
task name => 'db:test:plugins:prepare' do |t|
if plugin_enabled?(plugin)
run_tests(name, plugin, run)
else
plugin_disabled_warning(plugin)
end
end
end
def test_sequence_task(name, plugin, *tasks)
desc "Run all tests for #{plugin_name(plugin)}"
task name do
failed = []
tasks.each do |task|
begin
Rake::Task['test:noosfero_plugins:' + task.to_s].invoke
rescue Exception => ex
puts ex
failed << task
end
end
unless failed.empty?
fail 'Tests failed: ' + failed.join(', ')
end
end
end
namespace :test do
namespace :noosfero_plugins do
all_plugins.each do |plugin|
namespace plugin do
plugin_test_task :units, plugin
plugin_test_task :functionals, plugin
plugin_test_task :integration, plugin
plugin_test_task :cucumber, plugin
plugin_test_task :selenium, plugin
end
test_sequence_task(plugin, plugin, "#{plugin}:units", "#{plugin}:functionals", "#{plugin}:integration", "#{plugin}:cucumber", "#{plugin}:selenium")
end
[:units, :functionals, :integration].each do |taskname|
task taskname => 'db:test:plugins:prepare' do |t|
run_tests taskname, enabled_plugins
end
end
task :cucumber => 'db:test:plugins:prepare' do |t|
run_tests :cucumber, enabled_plugins
end
task :selenium => 'db:test:plugins:prepare' do |t|
run_tests :selenium, enabled_plugins
end
task :temp_enable_all_plugins do
sh './script/noosfero-plugins', 'enableall'
end
task :rollback_enable_all_plugins do
sh './script/noosfero-plugins', 'disable', *disabled_plugins
end
end
test_sequence_task(:noosfero_plugins, '*', :temp_enable_all_plugins, :units, :functionals, :integration, :cucumber, :selenium, :rollback_enable_all_plugins)
end