kowl 0.0.1
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 +7 -0
- data/LICENSE +7 -0
- data/README.md +383 -0
- data/bin/console +14 -0
- data/bin/kowl +106 -0
- data/bin/setup +13 -0
- data/lib/kowl/actions.rb +240 -0
- data/lib/kowl/docker.rb +447 -0
- data/lib/kowl/generators/README.md +5 -0
- data/lib/kowl/generators/action_generator.rb +113 -0
- data/lib/kowl/generators/admin_generator.rb +114 -0
- data/lib/kowl/generators/assets_generator.rb +188 -0
- data/lib/kowl/generators/base.rb +40 -0
- data/lib/kowl/generators/circleci_generator.rb +11 -0
- data/lib/kowl/generators/config_generator.rb +180 -0
- data/lib/kowl/generators/controller_generator.rb +64 -0
- data/lib/kowl/generators/database_generator.rb +42 -0
- data/lib/kowl/generators/decorators_generator.rb +16 -0
- data/lib/kowl/generators/docker_generator.rb +40 -0
- data/lib/kowl/generators/dotfiles_generator.rb +73 -0
- data/lib/kowl/generators/libs_generator.rb +19 -0
- data/lib/kowl/generators/mailer_generator.rb +58 -0
- data/lib/kowl/generators/misc_generator.rb +20 -0
- data/lib/kowl/generators/overrides/app_base.rb +15 -0
- data/lib/kowl/generators/overrides/app_builder.rb +58 -0
- data/lib/kowl/generators/overrides/app_generator.rb +249 -0
- data/lib/kowl/generators/pages_generator.rb +46 -0
- data/lib/kowl/generators/routes_generator.rb +20 -0
- data/lib/kowl/generators/sidekiq_generator.rb +31 -0
- data/lib/kowl/generators/staging_generator.rb +14 -0
- data/lib/kowl/generators/test_generator.rb +42 -0
- data/lib/kowl/generators/text_files_generator.rb +41 -0
- data/lib/kowl/generators/users_and_auth_generator.rb +143 -0
- data/lib/kowl/generators/uuid_generator.rb +39 -0
- data/lib/kowl/generators/views_and_helpers_generator.rb +104 -0
- data/lib/kowl/geodb.rb +96 -0
- data/lib/kowl/helpers.rb +139 -0
- data/lib/kowl/templates/Gemfile.erb.tt +253 -0
- data/lib/kowl/templates/README.md.erb +33 -0
- data/lib/kowl/templates/app/assets/javascripts/semantic.js.tt +26 -0
- data/lib/kowl/templates/app/assets/stylesheets/administrate/application.scss +44 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/_custom_styling.scss +38 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application-mailer.scss +1 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application.scss +14 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_alerts.scss +7 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_errors.scss +28 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_navbar.scss +17 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/variables.scss +6 -0
- data/lib/kowl/templates/app/assets/stylesheets/semantic/_custom_styling.scss +20 -0
- data/lib/kowl/templates/app/assets/stylesheets/semantic/application.scss +24 -0
- data/lib/kowl/templates/app/controllers/admin/application_controller.rb +29 -0
- data/lib/kowl/templates/app/controllers/admin/login_activities_controller.rb +29 -0
- data/lib/kowl/templates/app/controllers/admin/users_controller.rb +37 -0
- data/lib/kowl/templates/app/controllers/concerns/auth/authentication.rb +18 -0
- data/lib/kowl/templates/app/controllers/concerns/auth/authorization.rb +20 -0
- data/lib/kowl/templates/app/controllers/concerns/auth/error_handlers.rb +27 -0
- data/lib/kowl/templates/app/controllers/concerns/noauth/error_handlers.rb +25 -0
- data/lib/kowl/templates/app/controllers/users_controller.rb +17 -0
- data/lib/kowl/templates/app/dashboards/login_activity_dashboard.rb.tt +59 -0
- data/lib/kowl/templates/app/dashboards/rich_text_body_dashboard.rb.tt +17 -0
- data/lib/kowl/templates/app/dashboards/user_dashboard.rb.tt +60 -0
- data/lib/kowl/templates/app/fields/gravatar_field.rb +10 -0
- data/lib/kowl/templates/app/fields/rich_text_area_field.rb +8 -0
- data/lib/kowl/templates/app/inputs/rich_text_area_input.rb +11 -0
- data/lib/kowl/templates/app/javascript/administrate/components/date_time_picker.js.tt +32 -0
- data/lib/kowl/templates/app/javascript/administrate/components/table.js.tt +49 -0
- data/lib/kowl/templates/app/javascript/administrate/index.js +3 -0
- data/lib/kowl/templates/app/javascript/packs/administrate.js.tt +21 -0
- data/lib/kowl/templates/app/javascript/packs/semantic.js +11 -0
- data/lib/kowl/templates/app/mailers/application_mailer.rb +7 -0
- data/lib/kowl/templates/app/mailers/devise_mailer.rb +5 -0
- data/lib/kowl/templates/app/models/login_activity.rb.tt +29 -0
- data/lib/kowl/templates/app/models/user.rb.tt +72 -0
- data/lib/kowl/templates/app/policies/application_policy.rb +38 -0
- data/lib/kowl/templates/app/policies/login_activity_policy.rb +35 -0
- data/lib/kowl/templates/app/policies/user_policy.rb +43 -0
- data/lib/kowl/templates/app/views/admin/templates/navigation.erb.tt +23 -0
- data/lib/kowl/templates/app/views/admin/views/application/_javascript.html.erb +21 -0
- data/lib/kowl/templates/app/views/admin/views/users/_collection.html.erb +102 -0
- data/lib/kowl/templates/app/views/admin/views/users/_form.html.erb +46 -0
- data/lib/kowl/templates/app/views/admin/views/users/edit.html.erb +36 -0
- data/lib/kowl/templates/app/views/admin/views/users/index.html.erb +66 -0
- data/lib/kowl/templates/app/views/fields/gravatar_field/_form.html.erb +6 -0
- data/lib/kowl/templates/app/views/fields/gravatar_field/_index.html.erb +1 -0
- data/lib/kowl/templates/app/views/fields/gravatar_field/_show.html.erb +1 -0
- data/lib/kowl/templates/app/views/fields/rich_text_area_field/_form.html.erb +6 -0
- data/lib/kowl/templates/app/views/fields/rich_text_area_field/_index.html.erb +1 -0
- data/lib/kowl/templates/app/views/fields/rich_text_area_field/_show.html.erb +1 -0
- data/lib/kowl/templates/app/views/layouts/admin.html.erb.tt +47 -0
- data/lib/kowl/templates/app/views/layouts/devise_mailer.html.erb +14 -0
- data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.erb +18 -0
- data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.haml +17 -0
- data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.slim +17 -0
- data/lib/kowl/templates/app/views/pages/welcome/default.html.erb +0 -0
- data/lib/kowl/templates/app/views/pages/welcome/default.html.haml +0 -0
- data/lib/kowl/templates/app/views/pages/welcome/default.html.slim +0 -0
- data/lib/kowl/templates/app/views/pages/welcome/semantic.html.erb +20 -0
- data/lib/kowl/templates/app/views/pages/welcome/semantic.html.haml +17 -0
- data/lib/kowl/templates/app/views/pages/welcome/semantic.html.slim +17 -0
- data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.erb.tt +5 -0
- data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.haml.tt +3 -0
- data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.slim.tt +3 -0
- data/lib/kowl/templates/app/views/shared/footer/semantic.html.erb.tt +7 -0
- data/lib/kowl/templates/app/views/shared/footer/semantic.html.haml.tt +5 -0
- data/lib/kowl/templates/app/views/shared/footer/semantic.html.slim.tt +5 -0
- data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.erb.tt +51 -0
- data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.haml.tt +36 -0
- data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.slim.tt +36 -0
- data/lib/kowl/templates/app/views/shared/navigation/semantic.html.erb.tt +48 -0
- data/lib/kowl/templates/app/views/shared/navigation/semantic.html.haml.tt +36 -0
- data/lib/kowl/templates/app/views/shared/navigation/semantic.html.slim.tt +36 -0
- data/lib/kowl/templates/app/workers/scheduler/pghero_scheduler.rb +11 -0
- data/lib/kowl/templates/config/autoprefixer.yml +4 -0
- data/lib/kowl/templates/config/db/mysql.yml.tt +43 -0
- data/lib/kowl/templates/config/db/oracle.yml.tt +29 -0
- data/lib/kowl/templates/config/db/postgresql.yml.tt +37 -0
- data/lib/kowl/templates/config/db/sqlite3.yml.tt +20 -0
- data/lib/kowl/templates/config/db/sqlserver.yml.tt +28 -0
- data/lib/kowl/templates/config/initializers/administrate.rb.tt +9 -0
- data/lib/kowl/templates/config/initializers/bullet.rb +21 -0
- data/lib/kowl/templates/config/initializers/devise-security.rb +44 -0
- data/lib/kowl/templates/config/initializers/devise_argon2.rb +29 -0
- data/lib/kowl/templates/config/initializers/faker.rb +6 -0
- data/lib/kowl/templates/config/initializers/generators.rb.tt +31 -0
- data/lib/kowl/templates/config/initializers/geocoder.rb +10 -0
- data/lib/kowl/templates/config/initializers/letter_opener.rb +13 -0
- data/lib/kowl/templates/config/initializers/lockbox.rb +11 -0
- data/lib/kowl/templates/config/initializers/logging.rb +6 -0
- data/lib/kowl/templates/config/initializers/lograge.rb +7 -0
- data/lib/kowl/templates/config/initializers/logstop.rb +4 -0
- data/lib/kowl/templates/config/initializers/middleware.rb +9 -0
- data/lib/kowl/templates/config/initializers/oj.rb +7 -0
- data/lib/kowl/templates/config/initializers/pagy.rb.tt +16 -0
- data/lib/kowl/templates/config/initializers/postmark.rb +8 -0
- data/lib/kowl/templates/config/initializers/rack_attack.rb.tt +71 -0
- data/lib/kowl/templates/config/initializers/sass.rb +5 -0
- data/lib/kowl/templates/config/initializers/sidekiq.rb +11 -0
- data/lib/kowl/templates/config/initializers/simpleform/semantic.rb +225 -0
- data/lib/kowl/templates/config/initializers/slim.rb +6 -0
- data/lib/kowl/templates/config/initializers/sparkpost.rb +13 -0
- data/lib/kowl/templates/config/routes.rb.tt +28 -0
- data/lib/kowl/templates/config/sidekiq.yml.tt +17 -0
- data/lib/kowl/templates/db/migrations/create_action_text_tables.action_text.rb.tt +16 -0
- data/lib/kowl/templates/db/migrations/create_active_storage_tables.active_storage.rb.tt +29 -0
- data/lib/kowl/templates/db/migrations/devise.rb.tt +59 -0
- data/lib/kowl/templates/db/migrations/login_activities.rb.tt +41 -0
- data/lib/kowl/templates/db/seeds.rb.tt +14 -0
- data/lib/kowl/templates/docker/Dockerfile.alpine.tt +92 -0
- data/lib/kowl/templates/docker/Dockerfile.debian.tt +133 -0
- data/lib/kowl/templates/docker/docker-compose.yml.tt +55 -0
- data/lib/kowl/templates/docker/mysql/Dockerfile.tt +15 -0
- data/lib/kowl/templates/dotfiles/Aptfile.tt +34 -0
- data/lib/kowl/templates/dotfiles/Brewfile.tt +49 -0
- data/lib/kowl/templates/dotfiles/Procfile.tt +12 -0
- data/lib/kowl/templates/dotfiles/codeclimate.yml +76 -0
- data/lib/kowl/templates/dotfiles/coffeelint.json +10 -0
- data/lib/kowl/templates/dotfiles/coffeelintignore +15 -0
- data/lib/kowl/templates/dotfiles/dockerignore +23 -0
- data/lib/kowl/templates/dotfiles/editorconfig +13 -0
- data/lib/kowl/templates/dotfiles/env.tt +58 -0
- data/lib/kowl/templates/dotfiles/erb-lint.yml +10 -0
- data/lib/kowl/templates/dotfiles/erdconfig.tt +24 -0
- data/lib/kowl/templates/dotfiles/eslintignore +20 -0
- data/lib/kowl/templates/dotfiles/eslintrc.js +31 -0
- data/lib/kowl/templates/dotfiles/fasterer.yml +14 -0
- data/lib/kowl/templates/dotfiles/foreman +1 -0
- data/lib/kowl/templates/dotfiles/gitattributes +15 -0
- data/lib/kowl/templates/dotfiles/gitignore +69 -0
- data/lib/kowl/templates/dotfiles/haml-lint.yml +23 -0
- data/lib/kowl/templates/dotfiles/jsbeautifyrc +15 -0
- data/lib/kowl/templates/dotfiles/jshintrc +3 -0
- data/lib/kowl/templates/dotfiles/mailmap +3 -0
- data/lib/kowl/templates/dotfiles/nvmrc +1 -0
- data/lib/kowl/templates/dotfiles/prettierignore +21 -0
- data/lib/kowl/templates/dotfiles/prettierrc.js +62 -0
- data/lib/kowl/templates/dotfiles/pryrc +7 -0
- data/lib/kowl/templates/dotfiles/rspec +3 -0
- data/lib/kowl/templates/dotfiles/rubocop.yml.tt +78 -0
- data/lib/kowl/templates/dotfiles/scss-lint.yml +132 -0
- data/lib/kowl/templates/dotfiles/simplecov +19 -0
- data/lib/kowl/templates/dotfiles/slim-lint.yml +23 -0
- data/lib/kowl/templates/dotfiles/slugignore +10 -0
- data/lib/kowl/templates/dotfiles/yamllint +7 -0
- data/lib/kowl/templates/dotfiles/yarnclean +46 -0
- data/lib/kowl/templates/lib/tasks/stats.rake +42 -0
- data/lib/kowl/templates/tests/factories/README.md +0 -0
- data/lib/kowl/templates/tests/factories/login_activity.rb +11 -0
- data/lib/kowl/templates/tests/factories/user.rb +11 -0
- data/lib/kowl/templates/tests/minitest/README.md +3 -0
- data/lib/kowl/templates/tests/minitest/application_system_test_case.rb +7 -0
- data/lib/kowl/templates/tests/minitest/controllers/pages_controller_test.rb +10 -0
- data/lib/kowl/templates/tests/minitest/models/login_activity_test.rb +8 -0
- data/lib/kowl/templates/tests/minitest/models/user_test.rb +15 -0
- data/lib/kowl/templates/tests/minitest/policies/login_activity_policy_test.rb +7 -0
- data/lib/kowl/templates/tests/minitest/policies/user_policy_test.rb +7 -0
- data/lib/kowl/templates/tests/minitest/support/capybara.rb +38 -0
- data/lib/kowl/templates/tests/minitest/support/database_cleaner.rb +20 -0
- data/lib/kowl/templates/tests/minitest/support/database_cleaner_support.rb +15 -0
- data/lib/kowl/templates/tests/minitest/support/deferred_garbage_collection.rb +21 -0
- data/lib/kowl/templates/tests/minitest/support/devise.rb +16 -0
- data/lib/kowl/templates/tests/minitest/support/factories.rb +6 -0
- data/lib/kowl/templates/tests/minitest/support/formulaic.rb +8 -0
- data/lib/kowl/templates/tests/minitest/support/helpers/devise_helper.rb +57 -0
- data/lib/kowl/templates/tests/minitest/support/papertrail.rb +17 -0
- data/lib/kowl/templates/tests/minitest/support/pundit.rb +0 -0
- data/lib/kowl/templates/tests/minitest/support/shoulda.rb +11 -0
- data/lib/kowl/templates/tests/minitest/support/simplecov.rb +8 -0
- data/lib/kowl/templates/tests/minitest/test_helper.rb +17 -0
- data/lib/kowl/templates/tests/rspec/README.md +9 -0
- data/lib/kowl/templates/tests/rspec/controllers/admin/application_controller_spec.rb +12 -0
- data/lib/kowl/templates/tests/rspec/controllers/admin/users_controller_spec.rb +14 -0
- data/lib/kowl/templates/tests/rspec/controllers/pages_controller_spec.rb +10 -0
- data/lib/kowl/templates/tests/rspec/features/README.md +15 -0
- data/lib/kowl/templates/tests/rspec/features/visitor_sign_up_spec.rb +25 -0
- data/lib/kowl/templates/tests/rspec/helpers/application_helper_spec.rb +7 -0
- data/lib/kowl/templates/tests/rspec/helpers/pages_helper_spec.rb +15 -0
- data/lib/kowl/templates/tests/rspec/models/login_activity_spec.rb +11 -0
- data/lib/kowl/templates/tests/rspec/models/user_spec.rb +21 -0
- data/lib/kowl/templates/tests/rspec/policies/login_activity_policy_spec.rb +59 -0
- data/lib/kowl/templates/tests/rspec/policies/user_policy_spec.rb +56 -0
- data/lib/kowl/templates/tests/rspec/rails_helper.rb +72 -0
- data/lib/kowl/templates/tests/rspec/requests/pages_spec.rb +11 -0
- data/lib/kowl/templates/tests/rspec/spec_helper.rb +96 -0
- data/lib/kowl/templates/tests/rspec/support/bullet.rb +17 -0
- data/lib/kowl/templates/tests/rspec/support/capybara.rb +37 -0
- data/lib/kowl/templates/tests/rspec/support/controller_testing.rb +10 -0
- data/lib/kowl/templates/tests/rspec/support/database_cleaner.rb +55 -0
- data/lib/kowl/templates/tests/rspec/support/deferred_garbage_collection.rb +32 -0
- data/lib/kowl/templates/tests/rspec/support/devise.rb +21 -0
- data/lib/kowl/templates/tests/rspec/support/factories.rb +5 -0
- data/lib/kowl/templates/tests/rspec/support/formulaic.rb +8 -0
- data/lib/kowl/templates/tests/rspec/support/helpers/devise_helpers.rb +56 -0
- data/lib/kowl/templates/tests/rspec/support/papertrail.rb +5 -0
- data/lib/kowl/templates/tests/rspec/support/pi_ci.rb +6 -0
- data/lib/kowl/templates/tests/rspec/support/pundit.rb +6 -0
- data/lib/kowl/templates/tests/rspec/support/shoulda.rb +10 -0
- data/lib/kowl/templates/tests/rspec/support/sidekiq.rb +10 -0
- data/lib/kowl/templates/tests/rspec/support/simplecov.rb +7 -0
- data/lib/kowl/templates/tests/rspec/support/warden.rb +8 -0
- data/lib/kowl/templates/text_files/AUTHORS.md +4 -0
- data/lib/kowl/templates/text_files/CHANGELOG.md.tt +12 -0
- data/lib/kowl/templates/text_files/CODE_OF_CONDUCT.md +76 -0
- data/lib/kowl/templates/text_files/TODO.md +7 -0
- data/lib/kowl/templates/text_files/VERSION +1 -0
- data/lib/kowl/templates/text_files/humans.txt.tt +15 -0
- data/lib/kowl/templates/text_files/robots.txt.tt +6 -0
- data/lib/kowl/templates/text_files/security.txt +6 -0
- data/lib/kowl/version.rb +9 -0
- data/lib/kowl.rb +18 -0
- metadata +404 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Modified from => https://github.com/rails/rails/blob/feb97dfabd027a73a41ca8bd2ab7c3196ab76d3d/railties/lib/rails/tasks/statistics.rake
|
4
|
+
# While global constants are bad, many 3rd party tools depend on this one (e.g
|
5
|
+
# rspec-rails & cucumber-rails). So a deprecation warning is needed if we want
|
6
|
+
# to remove it.
|
7
|
+
STATS_FOLDERS = [
|
8
|
+
%w(Controllers app/controllers),
|
9
|
+
%w(Helpers app/helpers),
|
10
|
+
%w(Jobs app/jobs),
|
11
|
+
%w(Models app/models),
|
12
|
+
%w(Mailers app/mailers),
|
13
|
+
%w(Mailboxes app/mailboxes),
|
14
|
+
%w(Channels app/channels),
|
15
|
+
%w(JavaScripts app/assets/javascripts),
|
16
|
+
%w(Webpacker app/javascript),
|
17
|
+
%w(Dashboards app/dashboards),
|
18
|
+
%w(Fields app/fields),
|
19
|
+
%w(Inputs app/inputs),
|
20
|
+
%w(Policies app/policies),
|
21
|
+
%w(Services app/services),
|
22
|
+
%w(Workers app/workers),
|
23
|
+
%w(Libraries lib/),
|
24
|
+
%w(APIs app/apis),
|
25
|
+
%w(Controller\ tests test/controllers),
|
26
|
+
%w(Helper\ tests test/helpers),
|
27
|
+
%w(Model\ tests test/models),
|
28
|
+
%w(Mailer\ tests test/mailers),
|
29
|
+
%w(Mailbox\ tests test/mailboxes),
|
30
|
+
%w(Channel\ tests test/channels),
|
31
|
+
%w(Job\ tests test/jobs),
|
32
|
+
%w(Integration\ tests test/integration),
|
33
|
+
%w(System\ tests test/system),
|
34
|
+
].collect do |name, dir|
|
35
|
+
[ name, "#{File.dirname(Rake.application.rakefile_location)}/#{dir}" ]
|
36
|
+
end.select { |name, dir| File.directory?(dir) }
|
37
|
+
|
38
|
+
desc 'Report code statistics (KLOCs, etc) from the application or engine'
|
39
|
+
task :more_stats do
|
40
|
+
require 'rails/code_statistics'
|
41
|
+
CodeStatistics.new(*STATS_FOLDERS).to_s
|
42
|
+
end
|
File without changes
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :LoginActivity do
|
5
|
+
identity { Faker::Internet.email }
|
6
|
+
ip { Faker::Internet.ip_v4_address }
|
7
|
+
success { Faker::Boolean.boolean }
|
8
|
+
user_type { 'User' }
|
9
|
+
association :user, factory: :user
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :user do
|
5
|
+
email { Faker::Internet.email }
|
6
|
+
role { :user }
|
7
|
+
password { 'Pa$$w0rd!' }
|
8
|
+
password_confirmation { 'Pa$$w0rd!' }
|
9
|
+
# password { Faker::Internet.password(min_length: 6, mix_case: true, special_characters: true) }
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
# https://www.rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda%2FMatchers%2FActiveModel:validate_numericality_of
|
6
|
+
class UserTest < ActiveSupport::TestCase
|
7
|
+
# Associations
|
8
|
+
# should have_many(:login_activies)
|
9
|
+
|
10
|
+
# Validations
|
11
|
+
# should validate_presence_of(:email)
|
12
|
+
# should validate_length_of(:email).is_at_least(5).is_at_most(255)
|
13
|
+
# should validate_presence_of(:role)
|
14
|
+
# should define_enum_for(:role)
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'capybara/rails'
|
4
|
+
require 'capybara/minitest'
|
5
|
+
require 'webdrivers'
|
6
|
+
# Integration testing
|
7
|
+
|
8
|
+
# default capybara/selenium configuration
|
9
|
+
# https://github.com/itmammoth/capybara-bootstrap/blob/master/scrape.rb
|
10
|
+
# https://thoughtbot.com/blog/headless-feature-specs-with-chrome
|
11
|
+
# run as headless mode with set window size
|
12
|
+
Capybara.register_driver :headless_chrome do |app|
|
13
|
+
options = Selenium::WebDriver::Chrome::Options.new(
|
14
|
+
args: %w[headless disable-extensions disable-gpu disable-infobars disable-translate no-sandbox window-size=1280,800]
|
15
|
+
)
|
16
|
+
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
|
17
|
+
end
|
18
|
+
|
19
|
+
Capybara.javascript_driver = :headless_chrome
|
20
|
+
Capybara.configure do |config|
|
21
|
+
config.default_max_wait_time = 5 # seconds
|
22
|
+
config.default_driver = :headless_chrome
|
23
|
+
end
|
24
|
+
|
25
|
+
# used for Integration Testing
|
26
|
+
class ActionDispatch::IntegrationTest
|
27
|
+
# Make the Capybara DSL available in all integration tests
|
28
|
+
include Capybara::DSL
|
29
|
+
# Make `assert_*` methods behave like Minitest assertions
|
30
|
+
include Capybara::Minitest::Assertions
|
31
|
+
|
32
|
+
# Reset sessions and driver between tests
|
33
|
+
# Use super wherever this method is redefined in your individual test classes
|
34
|
+
def teardown
|
35
|
+
Capybara.reset_sessions!
|
36
|
+
Capybara.use_default_driver
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# https://github.com/DatabaseCleaner/database_cleaner
|
4
|
+
# https://medium.com/brief-stops/testing-with-rspec-factorygirl-faker-and-database-cleaner-651c71ca0688
|
5
|
+
# Flush the database during tests to keep test data from clustering or hitting other tests
|
6
|
+
require 'capybara/minitest'
|
7
|
+
require 'database_cleaner'
|
8
|
+
|
9
|
+
if defined?(DatabaseCleaner)
|
10
|
+
DatabaseCleaner.clean_with :truncation
|
11
|
+
DatabaseCleaner.strategy = :transaction
|
12
|
+
|
13
|
+
class ActionDispatch::IntegrationTest
|
14
|
+
include DatabaseCleanerSupport
|
15
|
+
end
|
16
|
+
|
17
|
+
class ActiveSupport::TestCase
|
18
|
+
include DatabaseCleanerSupport
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'database_cleaner'
|
4
|
+
# https://gist.github.com/lujanfernaud/67644f8ea4263f4e638be1090ec85580
|
5
|
+
module DatabaseCleanerSupport
|
6
|
+
def before_setup
|
7
|
+
super
|
8
|
+
DatabaseCleaner.start
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_teardown
|
12
|
+
DatabaseCleaner.clean
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# https://stackoverflow.com/questions/10937366/find-a-list-of-slow-rspec-tests
|
4
|
+
# https://makandracards.com/makandra/950-speed-up-rspec-by-deferring-garbage-collection
|
5
|
+
class DeferredGarbageCollection
|
6
|
+
DEFERRED_GC_THRESHOLD = (ENV['DEFER_GC'] || 10.0).to_f
|
7
|
+
@@last_gc_run = Time.now
|
8
|
+
|
9
|
+
def self.start
|
10
|
+
GC.disable if DEFERRED_GC_THRESHOLD.positive?
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.reconsider
|
14
|
+
return unless DEFERRED_GC_THRESHOLD.positive? && Time.now - @@last_gc_run >= DEFERRED_GC_THRESHOLD
|
15
|
+
|
16
|
+
GC.enable
|
17
|
+
GC.start
|
18
|
+
GC.disable
|
19
|
+
@@last_gc_run = Time.now
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
if defined?(Devise)
|
4
|
+
###
|
5
|
+
# For testing devise_cas
|
6
|
+
# https://github.com/nbudin/devise_cas_authenticatable/wiki/Testing
|
7
|
+
class ActionController::TestCase
|
8
|
+
# include Devise::TestHelpers
|
9
|
+
include Devise::Test::ControllerHelpers
|
10
|
+
end
|
11
|
+
|
12
|
+
class ActionDispatch::IntegrationTest
|
13
|
+
include Warden::Test::Helpers
|
14
|
+
Warden.test_mode!
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'devise'
|
4
|
+
|
5
|
+
module DeviseHelpers
|
6
|
+
# Used for accessing the action as an admin/superuser (a member of devgroup)
|
7
|
+
def login_as_admin
|
8
|
+
user = FactoryBot.create(:user, role: 'superuser')
|
9
|
+
login_as(user)
|
10
|
+
end
|
11
|
+
# EXAMPLE: ----------------------------------------
|
12
|
+
# describe 'GET #index' do
|
13
|
+
# it 'returns http success' do
|
14
|
+
# login_as_admin
|
15
|
+
# get :index
|
16
|
+
# expect(response).to have_http_status(:success)
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
|
20
|
+
def login_as_staff
|
21
|
+
user = FactoryBot.create(:user, role: :staff)
|
22
|
+
login_as(user)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Used for hitting the user as a generic user
|
26
|
+
def login_as_user
|
27
|
+
user = FactoryBot.create(:user)
|
28
|
+
login_as(user)
|
29
|
+
end
|
30
|
+
# EXAMPLE: ----------------------------------------
|
31
|
+
# describe 'GET #index' do
|
32
|
+
# it 'returns http success' do
|
33
|
+
# login_as_user
|
34
|
+
# get :index
|
35
|
+
# expect(response).to have_http_status(:success)
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
|
39
|
+
# Used for simulating a login as the specified user
|
40
|
+
def login_as(user)
|
41
|
+
user = FactoryBot.create(:user) if user.nil?
|
42
|
+
allow(controller).to receive(:authenticate_user!).and_return(true)
|
43
|
+
allow(controller).to receive(:current_user).and_return(user)
|
44
|
+
end
|
45
|
+
# EXAMPLE: ----------------------------------------
|
46
|
+
# This is also good to use if you need to add custom paramters to test against the user
|
47
|
+
# before do
|
48
|
+
# @user = FactoryBot.create(:user, superuser: false, position: 'Nurse', )
|
49
|
+
# end
|
50
|
+
# describe 'GET #index' do
|
51
|
+
# it 'returns http success' do
|
52
|
+
# login_as @user
|
53
|
+
# get :welcome
|
54
|
+
# expect(response).to have_http_status(:success)
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# for enabling versioning to verify event captioning
|
4
|
+
if defined?(PaperTrail)
|
5
|
+
def with_versioning
|
6
|
+
was_enabled = PaperTrail.enabled?
|
7
|
+
was_enabled_for_request = PaperTrail.request.enabled?
|
8
|
+
PaperTrail.enabled = true
|
9
|
+
PaperTrail.request.enabled = true
|
10
|
+
begin
|
11
|
+
yield
|
12
|
+
ensure
|
13
|
+
PaperTrail.enabled = was_enabled
|
14
|
+
PaperTrail.request.enabled = was_enabled_for_request
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
File without changes
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# dsl matchers for controllers, models, and views
|
4
|
+
# Add shoulda test helpers: https://matchers.shoulda.io/
|
5
|
+
require 'shoulda'
|
6
|
+
Shoulda::Matchers.configure do |config|
|
7
|
+
config.integrate do |with|
|
8
|
+
with.test_framework :minitest
|
9
|
+
with.library :rails
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ENV['RAILS_ENV'] ||= 'test'
|
4
|
+
require_relative '../config/environment'
|
5
|
+
require 'rails/test_help'
|
6
|
+
require 'minitest/reporters'
|
7
|
+
Minitest::Reporters.use!
|
8
|
+
|
9
|
+
# load test engines and set their configurations
|
10
|
+
Dir[Rails.root.join('test/support/**/*.rb')].each { |f| require f }
|
11
|
+
|
12
|
+
class ActiveSupport::TestCase
|
13
|
+
# Run tests in parallel with specified workers
|
14
|
+
parallelize(workers: :number_of_processors)
|
15
|
+
|
16
|
+
# Add more helper methods to be used by all tests here...
|
17
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
[RSpec Rails Docs](https://relishapp.com/rspec/rspec-rails/docs)
|
2
|
+
|
3
|
+
[RSpec](https://rspec.info/)
|
4
|
+
|
5
|
+
[Better Specs](http://www.betterspecs.org/)
|
6
|
+
|
7
|
+
[rspec-best-practices](https://github.com/codica2/rspec-best-practices)
|
8
|
+
|
9
|
+
[Rails Testing with RSpec](https://blog.trk.in.rs/2015/11/09/rails-testing/)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe Admin::ApplicationController, type: :controller do
|
6
|
+
describe 'Require authentication' do
|
7
|
+
context 'when requesting /admin/*' do
|
8
|
+
it { is_expected.to use_before_action(:authenticate_user!) }
|
9
|
+
it { is_expected.to use_before_action(:ensure_admin!) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe Admin::UsersController, type: :controller do
|
6
|
+
describe 'When user' do
|
7
|
+
before { login_as_user }
|
8
|
+
|
9
|
+
it 'GET index' do
|
10
|
+
get :index
|
11
|
+
expect(response).to be_redirect
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# RSpec and Capybara
|
2
|
+
|
3
|
+
[RSpec feature tests](https://relishapp.com/rspec/rspec-rails/docs/feature-specs/feature-spec)
|
4
|
+
|
5
|
+
[Capybara Cheatsheet](https://gist.github.com/zhengjia/428105)
|
6
|
+
|
7
|
+
[Integration Tests with Capybara](https://thoughtbot.com/blog/rspec-integration-tests-with-capybara)
|
8
|
+
|
9
|
+
[Writing unit tests as feature tests](https://bhserna.com/writing-unit-tests-as-feature-tests.html)
|
10
|
+
|
11
|
+
[Capybara](https://github.com/teamcapybara/capybara)
|
12
|
+
|
13
|
+
[RSpec/Capybara integration tests: the ultimate guide](https://www.codewithjason.com/rails-integration-tests-rspec-capybara/)
|
14
|
+
|
15
|
+
[Gitlab moving to headless chrome](https://about.gitlab.com/2017/12/19/moving-to-headless-chrome/)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
feature 'Signup User' do
|
6
|
+
scenario 'with valid credentails' do
|
7
|
+
sign_up_user('test@test.com', 'Passw0rd!')
|
8
|
+
|
9
|
+
expect(page).to have_text('Welcome! You have signed up successfully.')
|
10
|
+
end
|
11
|
+
|
12
|
+
scenario 'with invalid credentials' do
|
13
|
+
sign_up_user('test@test.com', 'password')
|
14
|
+
|
15
|
+
expect(page).to have_text('Password must contain at least one digit')
|
16
|
+
end
|
17
|
+
|
18
|
+
def sign_up_user(email, password)
|
19
|
+
visit new_user_registration_path
|
20
|
+
fill_in 'user_email', with: email
|
21
|
+
fill_in 'user_password', with: password
|
22
|
+
fill_in 'user_password_confirmation', with: password
|
23
|
+
click_button 'Sign up'
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
# Specs in this file have access to a helper object that includes
|
4
|
+
# the PagesHelper. For example:
|
5
|
+
#
|
6
|
+
# describe PagesHelper do
|
7
|
+
# describe "string concat" do
|
8
|
+
# it "concats two strings with spaces" do
|
9
|
+
# expect(helper.concat_strings("this","that")).to eq("this that")
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
RSpec.describe PagesHelper, type: :helper do
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe User, type: :model do
|
6
|
+
describe 'validations' do
|
7
|
+
context 'with email' do
|
8
|
+
it { is_expected.to validate_presence_of(:email) }
|
9
|
+
it { is_expected.to validate_length_of(:email).is_at_least(5).is_at_most(255) }
|
10
|
+
# it { is_expected.to validate_uniqueness_of(:email).case_insensitive }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'with roles' do
|
14
|
+
it { is_expected.to define_enum_for(:role).with(described_class.roles.keys) }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with associations' do
|
18
|
+
it { is_expected.to have_many(:login_activities).order(created_at: :desc) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe UserPolicy, type: :policy do
|
6
|
+
subject { described_class.new(member, user) }
|
7
|
+
|
8
|
+
let(:user) { FactoryBot.create(:user) }
|
9
|
+
|
10
|
+
context 'when user' do
|
11
|
+
let(:member) { FactoryBot.create(:user) }
|
12
|
+
|
13
|
+
it { is_expected.to forbid_actions(%i[index show destroy impersonate]) }
|
14
|
+
it { is_expected.to forbid_new_and_create_actions }
|
15
|
+
it { is_expected.to forbid_edit_and_update_actions }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when staff' do
|
19
|
+
let(:member) { FactoryBot.create(:user, role: 'staff') }
|
20
|
+
|
21
|
+
it { is_expected.to forbid_actions(%i[index destroy impersonate]) }
|
22
|
+
it { is_expected.to permit_action(:show) }
|
23
|
+
it { is_expected.to forbid_new_and_create_actions }
|
24
|
+
it { is_expected.to permit_edit_and_update_actions }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when superuser' do
|
28
|
+
let(:member) { FactoryBot.create(:user, role: 'superuser') }
|
29
|
+
|
30
|
+
it { is_expected.to permit_actions(%i[index show destroy impersonate]) }
|
31
|
+
it { is_expected.to forbid_new_and_create_actions }
|
32
|
+
it { is_expected.to permit_edit_and_update_actions }
|
33
|
+
end
|
34
|
+
|
35
|
+
permissions :update? do
|
36
|
+
let(:staff) { FactoryBot.create(:user, role: 'staff') }
|
37
|
+
let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
|
38
|
+
|
39
|
+
context 'when user' do
|
40
|
+
|
41
|
+
describe 'when updating user' do
|
42
|
+
it { expect(described_class).to permit(staff, user) }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'when updating superusers' do
|
46
|
+
it { expect(described_class).not_to permit(staff, superuser) }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
permissions :show? do
|
52
|
+
let(:staff) { FactoryBot.create(:user, role: 'staff') }
|
53
|
+
let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
|
54
|
+
|
55
|
+
it "staff can't view superuser" do
|
56
|
+
expect(described_class).not_to permit(staff, superuser)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe UserPolicy, type: :policy do
|
6
|
+
subject { described_class.new(member, user) }
|
7
|
+
|
8
|
+
let(:user) { FactoryBot.create(:user) }
|
9
|
+
|
10
|
+
context 'when user' do
|
11
|
+
let(:member) { FactoryBot.create(:user) }
|
12
|
+
|
13
|
+
it { is_expected.to forbid_actions(%i[index show destroy impersonate]) }
|
14
|
+
it { is_expected.to forbid_new_and_create_actions }
|
15
|
+
it { is_expected.to forbid_edit_and_update_actions }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when staff' do
|
19
|
+
let(:member) { FactoryBot.create(:user, role: 'staff') }
|
20
|
+
|
21
|
+
it { is_expected.to forbid_actions(%i[index destroy impersonate]) }
|
22
|
+
it { is_expected.to permit_action(:show) }
|
23
|
+
it { is_expected.to forbid_new_and_create_actions }
|
24
|
+
it { is_expected.to permit_edit_and_update_actions }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when superuser' do
|
28
|
+
let(:member) { FactoryBot.create(:user, role: 'superuser') }
|
29
|
+
|
30
|
+
it { is_expected.to permit_actions(%i[index show destroy impersonate]) }
|
31
|
+
it { is_expected.to forbid_new_and_create_actions }
|
32
|
+
it { is_expected.to permit_edit_and_update_actions }
|
33
|
+
end
|
34
|
+
|
35
|
+
permissions :update? do
|
36
|
+
let(:staff) { FactoryBot.create(:user, role: 'staff') }
|
37
|
+
let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
|
38
|
+
|
39
|
+
it 'when staff and updating users' do
|
40
|
+
expect(described_class).to permit(staff, user)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'when staff and updating superusers' do
|
44
|
+
expect(described_class).not_to permit(staff, superuser)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
permissions :show? do
|
49
|
+
let(:staff) { FactoryBot.create(:user, role: 'staff') }
|
50
|
+
let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
|
51
|
+
|
52
|
+
it "staff can't view superuser" do
|
53
|
+
expect(described_class).not_to permit(staff, superuser)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|