decidim-dev 0.26.2 → 0.27.0.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/commands/decidim/dummy_resources/create_dummy_resource.rb +1 -1
- data/app/controllers/concerns/decidim/dev/needs_development_tools.rb +1 -1
- data/config/locales/ar.yml +1 -0
- data/config/locales/bg.yml +1 -0
- data/config/locales/ca.yml +7 -0
- data/config/locales/cs.yml +5 -0
- data/config/locales/de.yml +1 -0
- data/config/locales/el.yml +1 -0
- data/config/locales/en.yml +6 -0
- data/config/locales/es-MX.yml +7 -0
- data/config/locales/es-PY.yml +7 -0
- data/config/locales/es.yml +7 -0
- data/config/locales/eu.yml +1 -0
- data/config/locales/fi-plain.yml +7 -0
- data/config/locales/fi.yml +7 -0
- data/config/locales/fr-CA.yml +7 -0
- data/config/locales/fr.yml +7 -0
- data/config/locales/ga-IE.yml +1 -0
- data/config/locales/gl.yml +1 -0
- data/config/locales/hu.yml +1 -0
- data/config/locales/id-ID.yml +1 -0
- data/config/locales/is-IS.yml +2 -1
- data/config/locales/it.yml +1 -0
- data/config/locales/ja.yml +7 -0
- data/config/locales/lt.yml +64 -0
- data/config/locales/lv.yml +1 -0
- data/config/locales/nl.yml +1 -0
- data/config/locales/no.yml +1 -0
- data/config/locales/pl.yml +1 -0
- data/config/locales/pt-BR.yml +1 -0
- data/config/locales/pt.yml +1 -0
- data/config/locales/ro-RO.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/config/locales/sk.yml +1 -0
- data/config/locales/sl.yml +1 -0
- data/config/locales/sr-CS.yml +1 -0
- data/config/locales/sv.yml +1 -0
- data/config/locales/tr-TR.yml +1 -0
- data/config/locales/uk.yml +1 -0
- data/config/locales/zh-CN.yml +1 -0
- data/lib/decidim/dev/assets/geocoder_result_here.json +46 -67
- data/lib/decidim/dev/assets/import_voting_census_only_headers.csv +1 -0
- data/lib/decidim/dev/assets/logo.png +0 -0
- data/lib/decidim/dev/assets/ssl-cert.pem +22 -0
- data/lib/decidim/dev/assets/ssl-key.pem +28 -0
- data/lib/decidim/dev/common_rake.rb +1 -0
- data/lib/decidim/dev/railtie.rb +1 -1
- data/lib/decidim/dev/test/base_spec_helper.rb +2 -1
- data/lib/decidim/dev/test/rspec_support/attachment_helpers.rb +30 -0
- data/lib/decidim/dev/test/rspec_support/autocomplete_select.rb +23 -0
- data/lib/decidim/dev/test/rspec_support/capybara.rb +77 -9
- data/lib/decidim/dev/test/rspec_support/comments.rb +1 -1
- data/lib/decidim/dev/test/rspec_support/component.rb +5 -5
- data/lib/decidim/dev/test/rspec_support/controller_example_group.rb +27 -0
- data/lib/decidim/dev/test/rspec_support/data_consent.rb +41 -0
- data/lib/decidim/dev/test/rspec_support/dynamic_attach.rb +31 -0
- data/lib/decidim/dev/test/rspec_support/frontend.rb +1 -1
- data/lib/decidim/dev/test/rspec_support/geocoder.rb +6 -2
- data/lib/decidim/dev/test/rspec_support/helpers.rb +12 -0
- data/lib/decidim/dev/test/rspec_support/html_matchers.rb +11 -0
- data/lib/decidim/dev/test/rspec_support/imports_controller_shared_examples.rb +3 -8
- data/lib/decidim/dev/test/rspec_support/network_conditions_helpers.rb +18 -0
- data/lib/decidim/dev/test/rspec_support/rake_tasks.rb +0 -2
- data/lib/decidim/dev/test/rspec_support/screenshot_helper.rb +41 -0
- data/lib/decidim/dev/test/rspec_support/warden.rb +5 -0
- data/lib/decidim/dev/test/rspec_support/wicked_pdf_assets_mock.rb +4 -0
- data/lib/decidim/dev/test/spec_helper.rb +2 -4
- data/lib/decidim/dev/test/w3c_rspec_validators_overrides.rb +0 -2
- data/lib/decidim/dev/version.rb +1 -1
- data/lib/decidim-dev.rb +1 -1
- data/lib/tasks/generators.rake +7 -2
- data/lib/tasks/lighthouse_report.rake +29 -0
- data/lib/tasks/locale_checker.rake +1 -1
- metadata +51 -41
- data/lib/decidim/dev/test/rspec_support/react_select.rb +0 -29
@@ -3,6 +3,7 @@
|
|
3
3
|
require "decidim/dev"
|
4
4
|
|
5
5
|
ENV["RAILS_ENV"] ||= "test"
|
6
|
+
ENV["RAILS_SYSTEM_TESTING_SCREENSHOT_HTML"] ||= "1"
|
6
7
|
|
7
8
|
engine_spec_dir = File.join(Dir.pwd, "spec")
|
8
9
|
|
@@ -18,7 +19,7 @@ require_relative "rspec_support/authorization"
|
|
18
19
|
|
19
20
|
require "#{Decidim::Dev.dummy_app_path}/config/environment"
|
20
21
|
|
21
|
-
Dir["#{engine_spec_dir}/shared/**/*.rb"].
|
22
|
+
Dir["#{engine_spec_dir}/shared/**/*.rb"].each { |f| require f }
|
22
23
|
|
23
24
|
require "paper_trail/frameworks/rspec"
|
24
25
|
|
@@ -9,6 +9,36 @@ module AttachmentHelpers
|
|
9
9
|
def attachment_file_size(attachment)
|
10
10
|
ActiveSupport::NumberHelper.number_to_human_size(attachment.file_size)
|
11
11
|
end
|
12
|
+
|
13
|
+
# Creates ActiveStorage::Blob object and returns its signed_id
|
14
|
+
# Used in non-system tests that need files.
|
15
|
+
def upload_test_file(file, options = {})
|
16
|
+
filename = options[:filename] || upload_test_file_filename(file)
|
17
|
+
content_type = options[:content_type] || upload_test_file_content_type(file)
|
18
|
+
|
19
|
+
blob = ActiveStorage::Blob.create_and_upload!(
|
20
|
+
io: File.open(file),
|
21
|
+
filename: filename,
|
22
|
+
content_type: content_type
|
23
|
+
)
|
24
|
+
return blob if options[:return_blob]
|
25
|
+
|
26
|
+
blob.signed_id
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def upload_test_file_filename(file)
|
32
|
+
return file.original_filename if file.respond_to? :original_filename
|
33
|
+
|
34
|
+
file.split("/").last
|
35
|
+
end
|
36
|
+
|
37
|
+
def upload_test_file_content_type(file)
|
38
|
+
return file.content_type if file.respond_to? :content_type
|
39
|
+
|
40
|
+
MIME::Types.type_for(file).first.content_type
|
41
|
+
end
|
12
42
|
end
|
13
43
|
|
14
44
|
RSpec.configure do |config|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Capybara
|
4
|
+
module AutoCompleteJS
|
5
|
+
def autocomplete_select(value, from:)
|
6
|
+
within("div[data-autocomplete-for='#{from}']") do
|
7
|
+
find(".autocomplete-input").click
|
8
|
+
find(".autocomplete-input").native.send_keys(value[0..4])
|
9
|
+
expect(page).to have_css("#autoComplete_list_1") # select should be open now
|
10
|
+
|
11
|
+
expect(page).to have_css("#autoComplete_result_0", text: value)
|
12
|
+
find("#autoComplete_result_0", text: value).hover
|
13
|
+
expect(page).to have_css("#autoComplete_result_0", text: value)
|
14
|
+
find("#autoComplete_result_0", text: value).click
|
15
|
+
expect(page).to have_css(".autocomplete__selected-item", text: value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
RSpec.configure do |config|
|
22
|
+
config.include Capybara::AutoCompleteJS, type: :system
|
23
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "selenium-webdriver"
|
4
|
-
require "system_test_html_screenshots"
|
5
4
|
|
6
5
|
module Decidim
|
7
6
|
# Helpers meant to be used only during capybara test runs.
|
@@ -9,7 +8,7 @@ module Decidim
|
|
9
8
|
def switch_to_host(host = "lvh.me")
|
10
9
|
raise "Can't switch to a custom host unless it really exists. Use `whatever.lvh.me` as a workaround." unless /lvh\.me$/.match?(host)
|
11
10
|
|
12
|
-
app_host = (host ? "
|
11
|
+
app_host = (host ? "#{protocol}://#{host}" : nil)
|
13
12
|
Capybara.app_host = app_host
|
14
13
|
end
|
15
14
|
|
@@ -18,7 +17,13 @@ module Decidim
|
|
18
17
|
end
|
19
18
|
|
20
19
|
def switch_to_secure_context_host
|
21
|
-
Capybara.app_host = "
|
20
|
+
Capybara.app_host = "#{protocol}://localhost"
|
21
|
+
end
|
22
|
+
|
23
|
+
def protocol
|
24
|
+
return "https" if ENV["TEST_SSL"]
|
25
|
+
|
26
|
+
"http"
|
22
27
|
end
|
23
28
|
end
|
24
29
|
end
|
@@ -32,11 +37,50 @@ Capybara.register_driver :headless_chrome do |app|
|
|
32
37
|
else
|
33
38
|
"--window-size=1920,1080"
|
34
39
|
end
|
40
|
+
options.args << "--ignore-certificate-errors" if ENV["TEST_SSL"]
|
41
|
+
Capybara::Selenium::Driver.new(
|
42
|
+
app,
|
43
|
+
browser: :chrome,
|
44
|
+
capabilities: [options]
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
1.step do
|
49
|
+
port = rand(5000..6999)
|
50
|
+
begin
|
51
|
+
Socket.tcp("127.0.0.1", port, connect_timeout: 5).close
|
52
|
+
rescue Errno::ECONNREFUSED
|
53
|
+
# When connection is refused, the port is available for use.
|
54
|
+
Capybara.server_port = port
|
55
|
+
break
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# In order to work with PWA apps, Chrome can't be run in headless mode, and requires
|
60
|
+
# setting up special prefs and flags
|
61
|
+
Capybara.register_driver :pwa_chrome do |app|
|
62
|
+
options = ::Selenium::WebDriver::Chrome::Options.new
|
63
|
+
options.args << "--no-sandbox"
|
64
|
+
# Don't limit browser resources
|
65
|
+
options.args << "--disable-dev-shm-usage"
|
66
|
+
# Add pwa.lvh.me host as a secure origin
|
67
|
+
options.args << "--unsafely-treat-insecure-origin-as-secure=http://pwa.lvh.me:#{Capybara.server_port}"
|
68
|
+
# User data flag is mandatory when preferences and locale state is set
|
69
|
+
options.args << "--user-data-dir=/tmp/decidim_tests_user_data_#{rand(1000)}"
|
70
|
+
options.args << if ENV["BIG_SCREEN_SIZE"].present?
|
71
|
+
"--window-size=1920,3000"
|
72
|
+
else
|
73
|
+
"--window-size=1920,1080"
|
74
|
+
end
|
75
|
+
# Set notifications allowed in http protocol
|
76
|
+
options.local_state["browser.enabled_labs_experiments"] = ["enable-system-notifications@1", "unsafely-treat-insecure-origin-as-secure"]
|
77
|
+
# Mark notification permission as enabled
|
78
|
+
options.prefs["profile.default_content_setting_values.notifications"] = 1
|
35
79
|
|
36
80
|
Capybara::Selenium::Driver.new(
|
37
81
|
app,
|
38
82
|
browser: :chrome,
|
39
|
-
|
83
|
+
capabilities: [options]
|
40
84
|
)
|
41
85
|
end
|
42
86
|
|
@@ -49,13 +93,22 @@ Capybara.register_driver :iphone do |app|
|
|
49
93
|
Capybara::Selenium::Driver.new(
|
50
94
|
app,
|
51
95
|
browser: :chrome,
|
52
|
-
|
96
|
+
capabilities: [options]
|
53
97
|
)
|
54
98
|
end
|
55
99
|
|
56
|
-
|
57
|
-
|
58
|
-
|
100
|
+
server_options = { Silent: true, queue_requests: false }
|
101
|
+
if ENV["TEST_SSL"]
|
102
|
+
dev_gem = Bundler.load.specs.find { |spec| spec.name == "decidim-dev" }
|
103
|
+
cert_dir = "#{dev_gem.full_gem_path}/lib/decidim/dev/assets"
|
104
|
+
server_options.merge!(
|
105
|
+
Host: "ssl://#{Capybara.server_host}:#{Capybara.server_port}?key=#{cert_dir}/ssl-key.pem&cert=#{cert_dir}/ssl-cert.pem"
|
106
|
+
)
|
107
|
+
Capybara.asset_host = "https://localhost:3000"
|
108
|
+
else
|
109
|
+
Capybara.asset_host = "http://localhost:3000"
|
110
|
+
end
|
111
|
+
Capybara.server = :puma, server_options
|
59
112
|
|
60
113
|
Capybara.server_errors = [SyntaxError, StandardError]
|
61
114
|
|
@@ -65,6 +118,21 @@ RSpec.configure do |config|
|
|
65
118
|
config.before :each, type: :system do
|
66
119
|
driven_by(:headless_chrome)
|
67
120
|
switch_to_default_host
|
121
|
+
domain = (try(:organization) || try(:current_organization))&.host
|
122
|
+
if domain
|
123
|
+
# Javascript sets the cookie also for all subdomains but localhost is a
|
124
|
+
# special case.
|
125
|
+
domain = ".#{domain}" unless domain == "localhost"
|
126
|
+
page.driver.browser.execute_cdp(
|
127
|
+
"Network.setCookie",
|
128
|
+
domain: domain,
|
129
|
+
name: Decidim.consent_cookie_name,
|
130
|
+
value: { essential: true }.to_json,
|
131
|
+
path: "/",
|
132
|
+
expires: 1.day.from_now.to_i,
|
133
|
+
same_site: "Lax"
|
134
|
+
)
|
135
|
+
end
|
68
136
|
end
|
69
137
|
|
70
138
|
config.before :each, driver: :rack_test do
|
@@ -80,7 +148,7 @@ RSpec.configure do |config|
|
|
80
148
|
end
|
81
149
|
|
82
150
|
config.after(type: :system) do |example|
|
83
|
-
warn page.driver.browser.
|
151
|
+
warn page.driver.browser.logs.get(:browser) unless example.metadata[:driver].eql?(:rack_test)
|
84
152
|
end
|
85
153
|
|
86
154
|
config.include Decidim::CapybaraTestHelpers, type: :system
|
@@ -89,7 +89,7 @@ module Decidim
|
|
89
89
|
include Followable
|
90
90
|
include Traceable
|
91
91
|
include Publicable
|
92
|
-
include Decidim::
|
92
|
+
include Decidim::DownloadYourData
|
93
93
|
include Searchable
|
94
94
|
include Paddable
|
95
95
|
include Amendable
|
@@ -236,8 +236,8 @@ Decidim.register_component(:dummy) do |component|
|
|
236
236
|
settings.attribute :comments_enabled, type: :boolean, default: true
|
237
237
|
settings.attribute :comments_max_length, type: :integer, required: false
|
238
238
|
settings.attribute :resources_permissions_enabled, type: :boolean, default: true
|
239
|
-
settings.attribute :
|
240
|
-
settings.attribute :
|
239
|
+
settings.attribute :dummy_global_attribute1, type: :boolean
|
240
|
+
settings.attribute :dummy_global_attribute2, type: :boolean, readonly: ->(_context) { false }
|
241
241
|
settings.attribute :readonly_attribute, type: :boolean, default: true, readonly: ->(_context) { true }
|
242
242
|
settings.attribute :enable_pads_creation, type: :boolean, default: false
|
243
243
|
settings.attribute :amendments_enabled, type: :boolean, default: false
|
@@ -246,8 +246,8 @@ Decidim.register_component(:dummy) do |component|
|
|
246
246
|
|
247
247
|
component.settings(:step) do |settings|
|
248
248
|
settings.attribute :comments_blocked, type: :boolean, default: false
|
249
|
-
settings.attribute :
|
250
|
-
settings.attribute :
|
249
|
+
settings.attribute :dummy_step_attribute1, type: :boolean
|
250
|
+
settings.attribute :dummy_step_attribute2, type: :boolean, readonly: ->(_context) { false }
|
251
251
|
settings.attribute :dummy_step_translatable_text, type: :text, translated: true, editor: true, required: true
|
252
252
|
settings.attribute :readonly_step_attribute, type: :boolean, default: true, readonly: ->(_context) { true }
|
253
253
|
settings.attribute :amendment_creation_enabled, type: :boolean, default: true
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ControllerExampleGroup
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class_methods do
|
8
|
+
def routes
|
9
|
+
before do
|
10
|
+
routes = yield
|
11
|
+
@orig_default_url_options = routes.default_url_options.dup
|
12
|
+
routes.default_url_options[:script_name] = ""
|
13
|
+
|
14
|
+
self.routes = routes
|
15
|
+
end
|
16
|
+
|
17
|
+
after do
|
18
|
+
routes.default_url_options = @orig_default_url_options
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
RSpec.configure do |config|
|
26
|
+
config.include Decidim::ControllerExampleGroup, type: :controller
|
27
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Capybara
|
4
|
+
module DataConsent
|
5
|
+
# Update data consent
|
6
|
+
def data_consent(categories = "all", options = {})
|
7
|
+
visit decidim.root_path if options[:visit_root]
|
8
|
+
|
9
|
+
dialog_present = begin
|
10
|
+
find("#dc-dialog-wrapper")
|
11
|
+
rescue Capybara::ElementNotFound => _e
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
if dialog_present
|
16
|
+
click_button "Settings"
|
17
|
+
else
|
18
|
+
within ".footer" do
|
19
|
+
click_link "Cookie settings"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if [true, "all"].include?(categories)
|
24
|
+
click_button "Accept all"
|
25
|
+
elsif categories.is_a?(Array)
|
26
|
+
categories.each do |category|
|
27
|
+
within "[data-id='#{category}']" do
|
28
|
+
find(".switch-paddle").click
|
29
|
+
end
|
30
|
+
end
|
31
|
+
click_button "Save settings"
|
32
|
+
elsif [false, "essential"].include?(categories)
|
33
|
+
click_button "Accept only essential"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
RSpec.configure do |config|
|
40
|
+
config.include Capybara::DataConsent, type: :system
|
41
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Adapted from https://github.com/JedWatson/react-select/issues/832#issuecomment-276441836
|
4
|
+
|
5
|
+
module Capybara
|
6
|
+
module UploadModal
|
7
|
+
# Replaces attach_file.
|
8
|
+
# Beware that modal does not open within form!
|
9
|
+
def dynamically_attach_file(name, file_location, options = {})
|
10
|
+
find("##{name}_button").click
|
11
|
+
filename = options[:filename] || file_location.to_s.split("/").last
|
12
|
+
|
13
|
+
yield if block_given?
|
14
|
+
|
15
|
+
within ".upload-modal" do
|
16
|
+
find(".remove-upload-item").click if options[:remove_before]
|
17
|
+
input_element = find("input[type='file']", visible: :all)
|
18
|
+
input_element.attach_file(file_location)
|
19
|
+
within "[data-filename='#{filename}']" do
|
20
|
+
expect(page).to have_css("div.progress-bar.filled", wait: 5)
|
21
|
+
end
|
22
|
+
all("input.attachment-title").last.set(options[:title]) if options.has_key?(:title)
|
23
|
+
click_button "Save" unless options[:keep_modal_open]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
RSpec.configure do |config|
|
30
|
+
config.include Capybara::UploadModal, type: :system
|
31
|
+
end
|
@@ -4,7 +4,7 @@ module FrontendHelpers
|
|
4
4
|
# Thanks to:
|
5
5
|
# https://medium.com/@coorasse/catch-javascript-errors-in-your-system-tests-89c2fe6773b1
|
6
6
|
def expect_no_js_errors
|
7
|
-
errors = page.driver.browser.
|
7
|
+
errors = page.driver.browser.logs.get(:browser)
|
8
8
|
return if errors.blank?
|
9
9
|
|
10
10
|
aggregate_failures "javascript errors" do
|
@@ -17,8 +17,9 @@ module GeocoderHelpers
|
|
17
17
|
# Waits for the front-end geocoding request to finish in order to ensure there
|
18
18
|
# are no pending requests when proceeding.
|
19
19
|
def fill_in_geocoding(attribute, options = {})
|
20
|
-
fill_in attribute, options
|
21
|
-
expect(page).to have_selector(".
|
20
|
+
fill_in attribute, **options
|
21
|
+
expect(page).to have_selector(".autoComplete_wrapper ul#autoComplete_list_1", count: 1)
|
22
|
+
find("li#autoComplete_result_0").click
|
22
23
|
end
|
23
24
|
|
24
25
|
module_function
|
@@ -38,6 +39,7 @@ module Decidim::Map::Provider
|
|
38
39
|
module Geocoding
|
39
40
|
class Test < ::Decidim::Map::Geocoding; end
|
40
41
|
end
|
42
|
+
|
41
43
|
module Autocomplete
|
42
44
|
class Test < ::Decidim::Map::Autocomplete
|
43
45
|
def self.stubs
|
@@ -66,9 +68,11 @@ module Decidim::Map::Provider
|
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|
71
|
+
|
69
72
|
module DynamicMap
|
70
73
|
class Test < ::Decidim::Map::DynamicMap; end
|
71
74
|
end
|
75
|
+
|
72
76
|
module StaticMap
|
73
77
|
class Test < ::Decidim::Map::StaticMap; end
|
74
78
|
end
|
@@ -39,6 +39,18 @@ module Decidim::ComponentTestHelpers
|
|
39
39
|
def have_admin_callout(text)
|
40
40
|
have_selector(".callout--full", text: text)
|
41
41
|
end
|
42
|
+
|
43
|
+
def stub_get_request_with_format(rq_url, rs_format)
|
44
|
+
stub_request(:get, rq_url)
|
45
|
+
.with(
|
46
|
+
headers: {
|
47
|
+
"Accept" => "*/*",
|
48
|
+
"Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
|
49
|
+
"User-Agent" => "Ruby"
|
50
|
+
}
|
51
|
+
)
|
52
|
+
.to_return(status: 200, body: "", headers: { content_type: rs_format })
|
53
|
+
end
|
42
54
|
end
|
43
55
|
|
44
56
|
RSpec.configure do |config|
|
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
require "rspec-html-matchers"
|
4
4
|
|
5
|
+
module EscapeHtmlHelpers
|
6
|
+
def escaped_html(string)
|
7
|
+
CGI.escapeHTML(string)
|
8
|
+
end
|
9
|
+
|
10
|
+
def have_escaped_html(string)
|
11
|
+
include(escaped_html(string))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
5
15
|
RSpec::Matchers.define(:have_equivalent_markup_to) do |expected|
|
6
16
|
cleaner = ->(str) { str.gsub(/>[[:space:]]*/, ">").gsub(/[[:space:]]*</, "<").strip }
|
7
17
|
|
@@ -14,4 +24,5 @@ end
|
|
14
24
|
|
15
25
|
RSpec.configure do |config|
|
16
26
|
config.include RSpecHtmlMatchers
|
27
|
+
config.include EscapeHtmlHelpers
|
17
28
|
end
|
@@ -19,14 +19,9 @@ shared_examples "admin imports controller" do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
describe "POST create" do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
Rack::Test::UploadedFile.new(
|
26
|
-
Decidim::Dev.test_file("import_proposals.csv", "text/csv"),
|
27
|
-
"text/csv"
|
28
|
-
)
|
29
|
-
end
|
22
|
+
# The file does not really matter for the dummies creator because it
|
23
|
+
# will always create a record for each data row regardless of the data.
|
24
|
+
let(:file) { upload_test_file(Decidim::Dev.test_file("import_proposals.csv", "text/csv")) }
|
30
25
|
let(:params) do
|
31
26
|
default_params.merge(extra_params).merge(file: file)
|
32
27
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NetworkConditionsHelpers
|
4
|
+
def with_browser_in_offline_mode
|
5
|
+
page.driver.browser.network_conditions = { offline: true }
|
6
|
+
|
7
|
+
# Wait for the browser to be offline
|
8
|
+
sleep 1
|
9
|
+
|
10
|
+
yield
|
11
|
+
|
12
|
+
page.driver.browser.network_conditions = { offline: false }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
config.include NetworkConditionsHelpers, type: :system
|
18
|
+
end
|
@@ -32,7 +32,6 @@ module RakeTaskOutputHelpers
|
|
32
32
|
included do
|
33
33
|
let!(:original_stdout) { $stdout }
|
34
34
|
|
35
|
-
# rubocop:disable RSpec/ExpectOutput
|
36
35
|
before do
|
37
36
|
$stdout = StringIO.new
|
38
37
|
end
|
@@ -40,7 +39,6 @@ module RakeTaskOutputHelpers
|
|
40
39
|
after do
|
41
40
|
$stdout = original_stdout
|
42
41
|
end
|
43
|
-
# rubocop:enable RSpec/ExpectOutput
|
44
42
|
end
|
45
43
|
|
46
44
|
def check_no_errors_have_been_printed
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "action_dispatch/system_testing/test_helpers/screenshot_helper"
|
4
|
+
|
5
|
+
module ActionDispatch
|
6
|
+
module SystemTesting
|
7
|
+
module TestHelpers
|
8
|
+
module ScreenshotHelper
|
9
|
+
private
|
10
|
+
|
11
|
+
# Customize the screenshot helper to fix the file paths for examples that have
|
12
|
+
# unallowed characters in them. Otherwise the artefacts creation and upload
|
13
|
+
# fails at GitHub actions. See the list of unallowed characters from:
|
14
|
+
# https://github.com/actions/toolkit/blob/main/packages/artifact/docs/additional-information.md#non-supported-characters
|
15
|
+
def image_name
|
16
|
+
# By default, this only cleans up the forward and backward slash characters.
|
17
|
+
sanitized_method_name = method_name.tr("/\\()\":<>|*?", "-----------")
|
18
|
+
name = "#{unique}_#{sanitized_method_name}"
|
19
|
+
name[0...225]
|
20
|
+
end
|
21
|
+
|
22
|
+
# Add the file URI scheme so terminal emulators can open one click
|
23
|
+
def display_image
|
24
|
+
message = +"[Screenshot Image]: file://#{image_path}\n"
|
25
|
+
message << +"[Screenshot HTML]: file://#{html_path}\n" if save_html?
|
26
|
+
|
27
|
+
case output_type
|
28
|
+
when "artifact"
|
29
|
+
message << "\e]1338;url=artifact://#{absolute_image_path}\a\n"
|
30
|
+
when "inline"
|
31
|
+
name = inline_base64(File.basename(absolute_image_path))
|
32
|
+
image = inline_base64(File.read(absolute_image_path))
|
33
|
+
message << "\e]1337;File=name=#{name};height=400px;inline=1:#{image}\a\n"
|
34
|
+
end
|
35
|
+
|
36
|
+
message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -18,6 +18,7 @@ end
|
|
18
18
|
|
19
19
|
RSpec.configure do |config|
|
20
20
|
config.include Decidim::WardenTestHelpers, type: :system
|
21
|
+
config.include Decidim::WardenTestHelpers, type: :request
|
21
22
|
config.include Devise::Test::ControllerHelpers, type: :controller
|
22
23
|
|
23
24
|
config.before :each, type: :cell do
|
@@ -30,4 +31,8 @@ RSpec.configure do |config|
|
|
30
31
|
config.after :each, type: :system do
|
31
32
|
Warden.test_reset!
|
32
33
|
end
|
34
|
+
|
35
|
+
config.after :each, type: :request do
|
36
|
+
Warden.test_reset!
|
37
|
+
end
|
33
38
|
end
|
@@ -8,6 +8,10 @@ class WickedPdf
|
|
8
8
|
def wicked_pdf_stylesheet_pack_tag(*sources)
|
9
9
|
stylesheet_pack_tag(*sources)
|
10
10
|
end
|
11
|
+
|
12
|
+
# Disables the images in the PDFs as those requests would be jamming under
|
13
|
+
# the test environment
|
14
|
+
def wicked_pdf_image_tag(img, options = {}); end
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
@@ -4,7 +4,6 @@ require "rails-controller-testing"
|
|
4
4
|
require "rspec/rails"
|
5
5
|
require "rspec/cells"
|
6
6
|
require "byebug"
|
7
|
-
require "rectify/rspec"
|
8
7
|
require "wisper/rspec/stub_wisper_publisher"
|
9
8
|
require "db-query-matchers"
|
10
9
|
require "action_view/helpers/sanitize_helper"
|
@@ -14,13 +13,13 @@ require "decidim/dev/test/w3c_rspec_validators_overrides"
|
|
14
13
|
|
15
14
|
# Requires supporting files with custom matchers and macros, etc,
|
16
15
|
# in ./rspec_support/ and its subdirectories.
|
17
|
-
Dir["#{__dir__}/rspec_support/**/*.rb"].
|
16
|
+
Dir["#{__dir__}/rspec_support/**/*.rb"].each { |f| require f }
|
18
17
|
|
19
18
|
require_relative "factories"
|
20
19
|
|
21
20
|
RSpec.configure do |config|
|
22
21
|
config.color = true
|
23
|
-
config.fail_fast = ENV
|
22
|
+
config.fail_fast = ENV.fetch("FAIL_FAST", nil) == "true"
|
24
23
|
config.infer_spec_type_from_file_location!
|
25
24
|
config.mock_with :rspec
|
26
25
|
config.order = :random
|
@@ -32,7 +31,6 @@ RSpec.configure do |config|
|
|
32
31
|
# instead of true.
|
33
32
|
config.use_transactional_fixtures = true
|
34
33
|
|
35
|
-
config.include Rectify::RSpec::Helpers
|
36
34
|
config.include ActionView::Helpers::SanitizeHelper
|
37
35
|
config.include ERB::Util
|
38
36
|
end
|
@@ -36,12 +36,10 @@ end
|
|
36
36
|
# This allows us to dynamically load the validator URL from the ENV.
|
37
37
|
module W3cRspecValidators
|
38
38
|
class Config
|
39
|
-
# rubocop:disable Naming/MemoizedInstanceVariableName
|
40
39
|
def self.get
|
41
40
|
@config ||= {
|
42
41
|
w3c_service_uri: ENV.fetch("VALIDATOR_HTML_URI", "https://validator.w3.org/nu/")
|
43
42
|
}.stringify_keys
|
44
43
|
end
|
45
|
-
# rubocop:enable Naming/MemoizedInstanceVariableName
|
46
44
|
end
|
47
45
|
end
|
data/lib/decidim/dev/version.rb
CHANGED
data/lib/decidim-dev.rb
CHANGED
data/lib/tasks/generators.rake
CHANGED
@@ -32,7 +32,9 @@ namespace :decidim do
|
|
32
32
|
"--skip_spring",
|
33
33
|
"--demo",
|
34
34
|
"--force_ssl",
|
35
|
-
"false"
|
35
|
+
"false",
|
36
|
+
"--locales",
|
37
|
+
"en,ca,es"
|
36
38
|
)
|
37
39
|
end
|
38
40
|
|
@@ -48,7 +50,10 @@ namespace :decidim do
|
|
48
50
|
"--recreate_db",
|
49
51
|
"--seed_db",
|
50
52
|
"--demo",
|
51
|
-
"--profiling"
|
53
|
+
"--profiling",
|
54
|
+
"--locales",
|
55
|
+
"en,ca,es",
|
56
|
+
"--dev_ssl"
|
52
57
|
)
|
53
58
|
end
|
54
59
|
end
|