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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
require 'rubygems'
require 'spork'
#uncomment the following line to use spork with the debugger
#require 'spork/ext/ruby-debug'
require 'simplecov'
require 'coveralls'
# Generate coverage locally in html as well as in coveralls.io
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
SimpleCov::Formatter::HTMLFormatter,
Coveralls::SimpleCov::Formatter
]
SimpleCov.start('rails') do
add_filter 'commonlib'
add_filter 'vendor/plugins'
add_filter 'lib/attachment_to_html'
add_filter 'lib/strip_attributes'
add_filter 'lib/has_tag_string'
add_filter 'lib/acts_as_xapian'
add_filter 'lib/themes'
add_filter '.bundle'
end
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you'll
# need to restart spork for it take effect.
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
# Use test-specific translations
AlaveteliLocalization.set_default_text_domain('app', File.join(File.dirname(__FILE__), 'fixtures', 'locale'))
RSpec.configure do |config|
# ## Mock Framework
#
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
#
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# The order (!) of this is important thanks to foreign keys
config.global_fixtures = :users,
:public_bodies,
:public_body_translations,
:public_body_versions,
:info_requests,
:raw_emails,
:incoming_messages,
:outgoing_messages,
:comments,
:info_request_events,
:track_things,
:has_tag_string_tags,
:holidays
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
# If true, the base class of anonymous controllers will be inferred
# automatically. This will be the default behavior in future versions of
# rspec-rails.
config.infer_base_class_for_anonymous_controllers = false
# Run specs in random order to surface order dependencies. If you find an
# order dependency and want to debug it, you can fix the order by providing
# the seed, which is printed after each run.
# --seed 1234
config.order = "random"
# This is a workaround for a strange thing where ActionMailer::Base.deliveries isn't being
# cleared out correctly in controller specs. So, do it here for everything.
config.before(:each) do
ActionMailer::Base.deliveries = []
end
# Any test that messes with the locale needs to restore the state afterwards so that it
# doesn't interfere with any subsequent tests. This is made more complicated by the
# ApplicationController#set_gettext_locale which sets the locale and so you may be setting
# the locale in your tests and not even realising it. So, let's make things easier for
# ourselves and just always restore the locale for all tests.
config.after(:each) do
AlaveteliLocalization.set_locales(AlaveteliConfiguration::available_locales,
AlaveteliConfiguration::default_locale)
end
# Turn routing-filter off in functional and unit tests as per
# https://github.com/svenfuchs/routing-filter/blob/master/README.markdown#testing
config.before(:each) do
RoutingFilter.active = false if [:controller, :helper, :model].include? example.metadata[:type]
end
config.after(:each) do
RoutingFilter.active = true if [:controller, :helper, :model].include? example.metadata[:type]
end
# This section makes the garbage collector run less often to speed up tests
last_gc_run = Time.now
config.before(:each) do
GC.disable
end
config.after(:each) do
if Time.now - last_gc_run > 4
GC.enable
GC.start
last_gc_run = Time.now
end
end
end
# TODO: No idea what namespace/class/module to put this in
# Create a clean xapian index based on the fixture files and the raw_email data.
def create_fixtures_xapian_index
load_raw_emails_data
rebuild_xapian_index
end
# Use the before create job hook to simulate a race condition with
# another process by creating an acts_as_xapian_job record for the
# same model:
def with_duplicate_xapian_job_creation
InfoRequestEvent.module_eval do
def xapian_before_create_job_hook(action, model, model_id)
ActsAsXapian::ActsAsXapianJob.create!(:model => model,
:model_id => model_id,
:action => action)
end
end
yield
ensure
InfoRequestEvent.module_eval do
def xapian_before_create_job_hook(action, model, model_id)
end
end
end
def with_env_tz(new_tz = 'US/Eastern')
old_tz, ENV['TZ'] = ENV['TZ'], new_tz
yield
ensure
old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
end
def with_active_record_default_timezone(zone)
old_zone, ActiveRecord::Base.default_timezone = ActiveRecord::Base.default_timezone, zone
yield
ensure
ActiveRecord::Base.default_timezone = old_zone
end
# To test the statistics calculations, it's helpful to have the
# request fixtures in different states, but changing the fixtures
# themselves disrupts many other tests. This function takes a
# block, and runs that block with the info requests for the
# Geraldine Quango altered so that one is hidden and there's a
# successful one.
def with_hidden_and_successful_requests
external = info_requests(:external_request)
chicken = info_requests(:naughty_chicken_request)
old_external_prominence = external.prominence
old_chicken_described_state = chicken.described_state
begin
external.prominence = 'hidden'
external.save!
chicken.described_state = 'successful'
chicken.save!
yield
ensure
external.prominence = old_external_prominence
external.save!
chicken.described_state = old_chicken_described_state
chicken.save!
end
end
# Reset the default locale, making sure that the previous default locale
# is also cleared from the fallbacks
def with_default_locale(locale)
original_default_locale = I18n.default_locale
original_fallbacks = I18n.fallbacks
I18n.fallbacks = nil
I18n.default_locale = locale
yield
ensure
I18n.fallbacks = original_fallbacks
I18n.default_locale = original_default_locale
end
def basic_auth_login(request, username = nil, password = nil)
username = AlaveteliConfiguration::admin_username if username.nil?
password = AlaveteliConfiguration::admin_password if password.nil?
request.env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("#{username}:#{password}")
end
end
Spork.each_run do
FactoryGirl.definition_file_paths = [ Rails.root.join('spec', 'factories') ]
FactoryGirl.reload
# This code will be run each time you run your specs.
end
def normalise_whitespace(s)
s = s.gsub(/\A\s+|\s+\Z/, "")
s = s.gsub(/\s+/, " ")
return s
end
RSpec::Matchers.define :be_equal_modulo_whitespace_to do |expected|
match do |actual|
normalise_whitespace(actual) == normalise_whitespace(expected)
end
end
|