decidim-dev 0.0.6

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.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +24 -0
  3. data/Rakefile +2 -0
  4. data/app/views/decidim/dummy_resource/_linked_dummys.html.erb +5 -0
  5. data/config/i18n-tasks.yml +4 -0
  6. data/config/locales/ca.yml +5 -0
  7. data/config/locales/en.yml +5 -0
  8. data/config/locales/es.yml +5 -0
  9. data/config/locales/eu.yml +5 -0
  10. data/config/locales/fi.yml +5 -0
  11. data/lib/decidim/dev.rb +22 -0
  12. data/lib/decidim/dev/assets/Exampledocument.docx +0 -0
  13. data/lib/decidim/dev/assets/Exampledocument.odt +0 -0
  14. data/lib/decidim/dev/assets/Exampledocument.pdf +0 -0
  15. data/lib/decidim/dev/assets/avatar.jpg +0 -0
  16. data/lib/decidim/dev/assets/city.jpeg +0 -0
  17. data/lib/decidim/dev/assets/city2.jpeg +0 -0
  18. data/lib/decidim/dev/assets/city3.jpeg +0 -0
  19. data/lib/decidim/dev/assets/icon.png +0 -0
  20. data/lib/decidim/dev/assets/malicious.jpg +0 -0
  21. data/lib/decidim/dev/common_rake.rb +28 -0
  22. data/lib/decidim/dev/dummy_authorization_handler.rb +26 -0
  23. data/lib/decidim/dev/test/authorization_shared_examples.rb +23 -0
  24. data/lib/decidim/dev/test/base_spec_helper.rb +48 -0
  25. data/lib/decidim/dev/test/i18n_spec.rb +34 -0
  26. data/lib/decidim/dev/test/rspec_support/action_mailer.rb +72 -0
  27. data/lib/decidim/dev/test/rspec_support/active_job.rb +11 -0
  28. data/lib/decidim/dev/test/rspec_support/authenticated_controller_context.rb +9 -0
  29. data/lib/decidim/dev/test/rspec_support/authorization_handlers.rb +7 -0
  30. data/lib/decidim/dev/test/rspec_support/capybara.rb +73 -0
  31. data/lib/decidim/dev/test/rspec_support/database_cleaner.rb +13 -0
  32. data/lib/decidim/dev/test/rspec_support/engine_routes.rb +34 -0
  33. data/lib/decidim/dev/test/rspec_support/factory_girl.rb +4 -0
  34. data/lib/decidim/dev/test/rspec_support/feature.rb +91 -0
  35. data/lib/decidim/dev/test/rspec_support/feature_context.rb +44 -0
  36. data/lib/decidim/dev/test/rspec_support/geocoder.rb +11 -0
  37. data/lib/decidim/dev/test/rspec_support/helpers.rb +46 -0
  38. data/lib/decidim/dev/test/rspec_support/html_matchers.rb +6 -0
  39. data/lib/decidim/dev/test/rspec_support/i18n.rb +15 -0
  40. data/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/bind-polyfill.js +18 -0
  41. data/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/object-assign-polyfill.js +24 -0
  42. data/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/promise.js +233 -0
  43. data/lib/decidim/dev/test/rspec_support/translation_helpers.rb +75 -0
  44. data/lib/decidim/dev/test/rspec_support/warden.rb +9 -0
  45. data/lib/decidim/dev/test/rspec_support/webmock.rb +2 -0
  46. data/lib/decidim/dev/test/rspec_support/wisper.rb +6 -0
  47. data/lib/decidim/dev/test/spec_helper.rb +37 -0
  48. data/lib/generators/decidim/dummy_generator.rb +80 -0
  49. data/lib/generators/decidim/templates/autoprefixer.yml +8 -0
  50. data/lib/generators/decidim/templates/autoprefixer_initializer.rb +16 -0
  51. data/lib/generators/decidim/templates/decidim_dev.rb +2 -0
  52. metadata +406 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: eb6caf2afbc815dd893523f38c345953f2b04fdc
4
+ data.tar.gz: f4fd8e3949a62bed4f24a03c790163a0ae4d2da8
5
+ SHA512:
6
+ metadata.gz: b9714a35ff2d96b5b9d258ffbc1bbeb2623d3ef856555d72688f8a4db31895c57acf8d5879900a6d49221138e049c63ecef813164957e34f8c65db4a54cab0e0
7
+ data.tar.gz: 5fcb703af373cbb6585a37a223dad32b326fb457ab11fcd13472b9637d5364420ed9872e6f5be256d953f7f6fefc1403f4f6c2ba5b481b4d90f89ef70668d63d
@@ -0,0 +1,24 @@
1
+ # Decidim::Dev
2
+
3
+ This gem allows local development of decidim's features and other features.
4
+
5
+ ## Usage
6
+ TODO: Write docs.
7
+
8
+ ## Installation
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'decidim-dev'
13
+ ```
14
+
15
+ And then execute:
16
+ ```bash
17
+ $ bundle
18
+ ```
19
+
20
+ ## Contributing
21
+ See [Decidim](https://github.com/AjuntamentdeBarcelona/decidim).
22
+
23
+ ## License
24
+ See [Decidim](https://github.com/AjuntamentdeBarcelona/decidim).
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <% resources.each do |dummy| %>
3
+ <li><%= dummy.title %></li>
4
+ <% end %>
5
+ </ul>
@@ -0,0 +1,4 @@
1
+ base_locale: en
2
+ locales: [en]
3
+ ignore_unused:
4
+ - "decidim.resource_links.test_link.*"
@@ -0,0 +1,5 @@
1
+ ca:
2
+ decidim:
3
+ resource_links:
4
+ test_link:
5
+ dummy_resource_dummy: Fictici relacionat
@@ -0,0 +1,5 @@
1
+ en:
2
+ decidim:
3
+ resource_links:
4
+ test_link:
5
+ dummy_resource_dummy: Related dummy
@@ -0,0 +1,5 @@
1
+ es:
2
+ decidim:
3
+ resource_links:
4
+ test_link:
5
+ dummy_resource_dummy: Ficticio relacionado
@@ -0,0 +1,5 @@
1
+ eu:
2
+ decidim:
3
+ resource_links:
4
+ test_link:
5
+ dummy_resource_dummy: Honekin lotutako ????
@@ -0,0 +1,5 @@
1
+ fi:
2
+ decidim:
3
+ resource_links:
4
+ test_link:
5
+ dummy_resource_dummy: Liittyvät dummy
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "letter_opener_web"
4
+
5
+ module Decidim
6
+ # Decidim::Dev holds all the convenience logic and libraries to be able to
7
+ # create external libraries that create test apps and test themselves against
8
+ # them.
9
+ module Dev
10
+ # Public: Finds an asset.
11
+ #
12
+ # Returns a String with the path for a particular asset.
13
+ def self.asset(name)
14
+ File.join(
15
+ File.dirname(__FILE__),
16
+ "dev",
17
+ "assets",
18
+ name
19
+ )
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+ require_relative "../../generators/decidim/dummy_generator"
5
+
6
+ engine_path = Dir.pwd
7
+ engine_name = engine_path.split("/").last
8
+ dummy_app_path = File.expand_path(File.join(engine_path, "spec", "#{engine_name}_dummy_app"))
9
+
10
+ desc "Generates a dummy app for testing"
11
+ task :generate_test_app do
12
+ Decidim::Generators::DummyGenerator.start(
13
+ [
14
+ "--engine_path=#{engine_path}",
15
+ "--migrate=true",
16
+ "--quiet"
17
+ ]
18
+ )
19
+
20
+ require File.join(dummy_app_path, "config", "application")
21
+ Rails.application.load_tasks
22
+ Rake.application["assets:precompile"].invoke
23
+
24
+ FileUtils.cd(engine_path)
25
+ end
26
+
27
+ RSpec::Core::RakeTask.new(:spec)
28
+ task default: [:generate_test_app, :spec]
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ # An example implementation of an AuthorizationHandler to be used in tests.
4
+ class DummyAuthorizationHandler < AuthorizationHandler
5
+ attribute :document_number, String
6
+ attribute :postal_code, String
7
+ attribute :birthday, Date
8
+
9
+ validates :document_number, presence: true
10
+ validate :valid_document_number
11
+
12
+ def metadata
13
+ super.merge(document_number: document_number)
14
+ end
15
+
16
+ def unique_id
17
+ document_number
18
+ end
19
+
20
+ private
21
+
22
+ def valid_document_number
23
+ errors.add(:document_number, :invalid) unless document_number.to_s.end_with?("X")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ RSpec.shared_examples "an authorization handler" do
3
+ before do
4
+ unless respond_to?(:handler)
5
+ raise "You need to define `handler` (an instance of the authorization handler) in order to run the shared examples."
6
+ end
7
+ end
8
+
9
+ describe "to_partial_path" do
10
+ subject { handler.to_partial_path }
11
+ it { is_expected.to be_kind_of(String) }
12
+ end
13
+
14
+ describe "handler_name" do
15
+ subject { handler.handler_name }
16
+ it { is_expected.to be_kind_of(String) }
17
+ end
18
+
19
+ describe "metadata" do
20
+ subject { handler.metadata }
21
+ it { is_expected.to be_kind_of(Hash) }
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ ENV["RAILS_ENV"] ||= "test"
3
+
4
+ engine_name = ENV["ENGINE_NAME"]
5
+ engine_spec_dir = File.join(Dir.pwd, "spec")
6
+ dummy_app_path = File.expand_path(File.join(engine_spec_dir, "#{engine_name}_dummy_app"))
7
+
8
+ if ENV["CI"]
9
+ require "simplecov"
10
+ SimpleCov.root(ENV["TRAVIS_BUILD_DIR"])
11
+
12
+ SimpleCov.start do
13
+ filters.clear
14
+ add_filter "/test/"
15
+ add_filter "/spec/"
16
+ add_filter "bundle.js"
17
+ add_filter "/vendor/"
18
+
19
+ add_filter do |src|
20
+ !(src.filename =~ /^#{ENV["TRAVIS_BUILD_DIR"]}/)
21
+ end
22
+ end
23
+
24
+ require "codecov"
25
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
26
+ end
27
+
28
+ require "rails"
29
+ require "active_support/core_ext/string"
30
+ require "decidim/core"
31
+ require "decidim/core/test"
32
+ require "#{File.dirname(__FILE__)}/rspec_support/feature.rb"
33
+
34
+ begin
35
+ require "#{dummy_app_path}/config/environment"
36
+ rescue LoadError
37
+ puts "Could not load dummy application. Please ensure you have run `bundle exec rake generate_test_app`"
38
+ puts "Tried to load it from #{dummy_app_path}"
39
+ exit(-1)
40
+ end
41
+
42
+ # Requires supporting files with custom matchers and macros, etc,
43
+ # in ./support/ and its subdirectories.
44
+ Dir["#{engine_spec_dir}/support/**/*.rb"].each { |f| require f }
45
+ Dir["#{engine_spec_dir}/shared/**/*.rb"].each { |f| require f }
46
+
47
+ require_relative "spec_helper"
48
+ require_relative "i18n_spec"
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+ require "i18n/tasks"
3
+
4
+ RSpec.describe "I18n" do
5
+ let(:i18n) { I18n::Tasks::BaseTask.new(locales: [I18n.default_locale]) }
6
+ let(:missing_keys) { i18n.missing_keys }
7
+ let(:unused_keys) { i18n.unused_keys }
8
+
9
+ it "does not have missing keys" do
10
+ expect(missing_keys).to be_empty,
11
+ "Missing #{missing_keys.leaves.count} i18n keys, run `i18n-tasks missing` to show them"
12
+ end
13
+
14
+ it "does not have unused keys" do
15
+ expect(unused_keys).to be_empty,
16
+ "#{unused_keys.leaves.count} unused i18n keys, run `i18n-tasks unused` to show them"
17
+ end
18
+
19
+ it "is normalized" do
20
+ previous_locale_hashes = locale_hashes
21
+ i18n.normalize_store!
22
+ new_locale_hashes = locale_hashes
23
+
24
+ expect(previous_locale_hashes).to eq(new_locale_hashes),
25
+ "Please normalize your locale files with `i18n-tasks normalize`"
26
+ end
27
+
28
+ def locale_hashes
29
+ Dir.glob("config/locales/**/*.yml").inject({}) do |results, file|
30
+ md5 = Digest::MD5.file(file).hexdigest
31
+ results.merge(file => md5)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+ require "nokogiri"
3
+
4
+ RSpec.configure do |config|
5
+ config.before(:each) { clear_emails }
6
+ end
7
+
8
+ # A set of helpers meant to make your life easier when testing
9
+ # emails, especially given the fact that ActionMailer's API can
10
+ # be a bit inconsistent.
11
+ module MailerHelpers
12
+ def emails
13
+ ActionMailer::Base.deliveries
14
+ end
15
+
16
+ def clear_emails
17
+ ActionMailer::Base.deliveries.clear
18
+ end
19
+
20
+ def last_email
21
+ emails.last
22
+ end
23
+
24
+ def last_email_body
25
+ email_body(last_email)
26
+ end
27
+
28
+ def email_body(email)
29
+ (email.try(:html_part).try(:body) || email.body).encoded
30
+ end
31
+
32
+ def last_email_link
33
+ Nokogiri::HTML(last_email_body).css("table.content a").last["href"]
34
+ end
35
+
36
+ def last_email_first_link
37
+ Nokogiri::HTML(last_email_body).css("table.content a").first["href"]
38
+ end
39
+
40
+ def wait_for_email(options = {})
41
+ options[:max_attempts] ||= 3
42
+ attempts = 0
43
+ loop do
44
+ if attempts >= options[:max_attempts]
45
+ raise StandardError, "An email with subject containing '#{options[:subject]}' wasn't sent.'"
46
+ end
47
+
48
+ return if last_email&.subject&.include? options[:subject]
49
+
50
+ sleep 1
51
+ attempts += 1
52
+ end
53
+ end
54
+ end
55
+
56
+ RSpec.configure do |config|
57
+ config.include MailerHelpers
58
+ end
59
+
60
+ RSpec.configure do |config|
61
+ config.before :example, perform_enqueued: true do
62
+ @old_perform_enqueued_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_jobs
63
+ @old_perform_enqueued_at_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs
64
+ ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
65
+ ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
66
+ end
67
+
68
+ config.after :example, perform_enqueued: true do
69
+ ActiveJob::Base.queue_adapter.perform_enqueued_jobs = @old_perform_enqueued_jobs
70
+ ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = @old_perform_enqueued_at_jobs
71
+ end
72
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.include ActiveJob::TestHelper
5
+
6
+ config.before(:each) do
7
+ clear_enqueued_jobs
8
+ end
9
+ end
10
+
11
+ ActiveJob::Base.queue_adapter = :test
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ RSpec.shared_context "authenticated user" do
3
+ let(:user) { create(:user, :confirmed) }
4
+
5
+ before do
6
+ @request.env["decidim.current_organization"] = user.organization
7
+ sign_in user, scope: :user
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ require "decidim/dev/dummy_authorization_handler"
3
+ RSpec.configure do |config|
4
+ config.before(:each) do
5
+ Decidim.config.authorization_handlers = [Decidim::DummyAuthorizationHandler]
6
+ end
7
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "capybara/poltergeist"
4
+ require "capybara-screenshot/rspec"
5
+
6
+ module Decidim
7
+ # Helpers meant to be used only during capybara test runs.
8
+ module CapybaraTestHelpers
9
+ def switch_to_host(host = "lvh.me")
10
+ unless /lvh\.me$/ =~ host
11
+ raise "Can't switch to a custom host unless it really exists. Use `whatever.lvh.me` as a workaround."
12
+ end
13
+
14
+ app_host = (host ? "http://#{host}" : nil)
15
+ Capybara.app_host = app_host
16
+ end
17
+
18
+ def switch_to_default_host
19
+ Capybara.app_host = nil
20
+ end
21
+ end
22
+ end
23
+
24
+ capybara_options = {
25
+ extensions: [
26
+ File.expand_path(
27
+ File.join(File.dirname(__FILE__), "phantomjs_polyfills", "promise.js")
28
+ ),
29
+ File.expand_path(
30
+ File.join(File.dirname(__FILE__), "phantomjs_polyfills", "bind-polyfill.js")
31
+ ),
32
+ File.expand_path(
33
+ File.join(File.dirname(__FILE__), "phantomjs_polyfills", "object-assign-polyfill.js")
34
+ )
35
+ ],
36
+ js_errors: true,
37
+ url_whitelist: ["http://*.lvh.me", "localhost", "127.0.0.1"]
38
+ }
39
+
40
+ Capybara.register_driver :poltergeist do |app|
41
+ Capybara::Poltergeist::Driver.new(app, capybara_options)
42
+ end
43
+
44
+ Capybara.register_driver :debug do |app|
45
+ Capybara::Poltergeist::Driver.new(app, capybara_options.merge(inspector: true))
46
+ end
47
+
48
+ Capybara::Screenshot.prune_strategy = :keep_last_run
49
+ Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples = true
50
+
51
+ Capybara.configure do |config|
52
+ config.always_include_port = true
53
+ config.default_driver = :poltergeist
54
+ config.always_include_port = true
55
+ end
56
+
57
+ RSpec.configure do |config|
58
+ config.before :each, type: :feature do
59
+ Capybara.current_session.driver.reset!
60
+ switch_to_default_host
61
+ end
62
+
63
+ config.include Decidim::CapybaraTestHelpers, type: :feature
64
+
65
+ if ENV["CI"]
66
+ require "rspec/repeat"
67
+
68
+ config.include RSpec::Repeat
69
+ config.around :each, type: :feature do |example|
70
+ repeat example, 5.times, wait: 1, verbose: true
71
+ end
72
+ end
73
+ end