kowl 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|