potassium 6.1.0 → 6.5.0

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +103 -38
  3. data/.circleci/setup-rubygems.sh +3 -0
  4. data/.gitignore +2 -1
  5. data/.node-version +1 -1
  6. data/.rubocop.yml +530 -0
  7. data/CHANGELOG.md +50 -1
  8. data/README.md +11 -3
  9. data/lib/potassium/assets/.circleci/config.yml.erb +107 -40
  10. data/lib/potassium/assets/.pryrc +0 -6
  11. data/lib/potassium/assets/.rubocop.yml +13 -0
  12. data/lib/potassium/assets/README.yml +45 -8
  13. data/lib/potassium/assets/active_admin/policies/admin_user_policy.rb +2 -0
  14. data/lib/potassium/assets/active_admin/policies/comment_policy.rb +2 -0
  15. data/lib/potassium/assets/active_admin/policies/default_policy.rb +49 -0
  16. data/lib/potassium/assets/active_admin/policies/page_policy.rb +2 -0
  17. data/lib/potassium/assets/app/javascript/app.spec.js +1 -1
  18. data/lib/potassium/assets/app/views/shared/_gtm_body.html.erb +4 -0
  19. data/lib/potassium/assets/app/views/shared/_gtm_head.html.erb +7 -0
  20. data/lib/potassium/assets/testing/.rspec +1 -0
  21. data/lib/potassium/assets/testing/devise_config.rb +6 -0
  22. data/lib/potassium/assets/testing/factory_bot_config.rb +3 -0
  23. data/lib/potassium/assets/testing/faker_config.rb +1 -0
  24. data/lib/potassium/assets/testing/power_types_config.rb +1 -0
  25. data/lib/potassium/assets/testing/rails_helper.rb +130 -49
  26. data/lib/potassium/assets/testing/shoulda_matchers_config.rb +8 -0
  27. data/lib/potassium/assets/testing/simplecov_config.rb +64 -0
  28. data/lib/potassium/assets/testing/system_tests_config.rb +6 -0
  29. data/lib/potassium/cli_options.rb +19 -3
  30. data/lib/potassium/helpers/template-helpers.rb +4 -0
  31. data/lib/potassium/recipes/admin.rb +27 -17
  32. data/lib/potassium/recipes/api.rb +2 -0
  33. data/lib/potassium/recipes/background_processor.rb +43 -32
  34. data/lib/potassium/recipes/ci.rb +9 -39
  35. data/lib/potassium/recipes/coverage.rb +35 -0
  36. data/lib/potassium/recipes/file_storage.rb +1 -1
  37. data/lib/potassium/recipes/front_end.rb +26 -13
  38. data/lib/potassium/recipes/google_tag_manager.rb +94 -0
  39. data/lib/potassium/recipes/heroku.rb +43 -31
  40. data/lib/potassium/recipes/mailer.rb +18 -5
  41. data/lib/potassium/recipes/monitoring.rb +5 -0
  42. data/lib/potassium/recipes/pundit.rb +29 -10
  43. data/lib/potassium/recipes/rails.rb +0 -4
  44. data/lib/potassium/recipes/schedule.rb +16 -1
  45. data/lib/potassium/recipes/spring.rb +9 -0
  46. data/lib/potassium/recipes/style.rb +2 -2
  47. data/lib/potassium/recipes/testing.rb +75 -18
  48. data/lib/potassium/templates/application.rb +7 -2
  49. data/lib/potassium/version.rb +7 -4
  50. data/potassium.gemspec +3 -1
  51. data/spec/features/background_processor_spec.rb +7 -5
  52. data/spec/features/ci_spec.rb +7 -4
  53. data/spec/features/coverage_spec.rb +26 -0
  54. data/spec/features/front_end_spec.rb +18 -1
  55. data/spec/features/google_tag_manager_spec.rb +36 -0
  56. data/spec/features/heroku_spec.rb +0 -4
  57. data/spec/features/mailer_spec.rb +16 -0
  58. data/spec/features/node_spec.rb +1 -1
  59. data/spec/features/pundit_spec.rb +34 -0
  60. data/spec/features/schedule_spec.rb +11 -4
  61. data/spec/features/testing_spec.rb +56 -0
  62. data/spec/support/potassium_test_helpers.rb +2 -3
  63. data/tmp/.keep +0 -0
  64. metadata +64 -15
  65. data/lib/potassium/assets/Dockerfile.ci +0 -6
  66. data/lib/potassium/assets/active_admin/admin_user_policy.rb +0 -2
  67. data/lib/potassium/assets/active_admin/comment_policy.rb +0 -2
  68. data/lib/potassium/assets/active_admin/pundit_page_policy.rb +0 -5
  69. data/lib/potassium/assets/bin/cibuild.erb +0 -117
  70. data/lib/potassium/assets/docker-compose.ci.yml +0 -12
  71. data/lib/potassium/assets/sidekiq_scheduler.yml +0 -9
@@ -1,47 +1,58 @@
1
- version: 2
2
- jobs:
3
- test:
4
- working_directory: ~/app
5
-
1
+ version: 2.1
2
+
3
+ ruby-image: &ruby-image cimg/ruby:<%= ruby_version %>
4
+ <%- if selected?(:database, :postgresql) -%>
5
+ postgres-image: &postgres-image postgres:<%= Potassium::POSTGRES_VERSION %>
6
+ <%- end -%>
7
+ <%- if selected?(:background_processor) -%>
8
+ redis-image: &redis-image redis
9
+ <%- end -%>
10
+ env-vars: &env-vars
11
+ BUNDLE_JOBS: 4
12
+ BUNDLE_PATH: vendor/bundle
13
+ RAILS_ENV: test
14
+
15
+ orbs:
16
+ browser-tools: circleci/browser-tools@1.1
17
+
18
+ executors:
19
+ test-executor:
6
20
  docker:
7
- - image: platanus/compose:1.22.0
8
-
9
- steps:
10
- - checkout
11
- - setup_remote_docker
12
-
13
- - run: docker info
14
- - run: docker-compose -f docker-compose.ci.yml pull
15
- - run: docker-compose -f docker-compose.ci.yml build test
16
- - run: bin/cibuild services
17
- - run: bin/cibuild deps
18
-
19
- - run: bin/cibuild db
20
- - run: bin/cibuild tests
21
- <% if selected?(:front_end, :vue) %>
22
- - run: bin/cibuild js_tests
23
- <% end %>
24
-
25
- lint:
21
+ - image: *ruby-image
22
+ environment: *env-vars
23
+ <%- if selected?(:database, :postgresql) -%>
24
+ - image: *postgres-image
25
+ <%- end -%>
26
+ <%- if selected?(:background_processor) -%>
27
+ - image: *redis-image
28
+ <%- end -%>
29
+
30
+ lint-executor:
26
31
  docker:
27
- - image: circleci/ruby:2.7-node
28
- environment:
29
- BUNDLE_JOBS: 4
30
- BUNDLE_RETRY: 3
31
- BUNDLE_PATH: vendor/bundle
32
+ - image: *ruby-image
33
+ environment: *env-vars
34
+
35
+ commands:
36
+ setup:
37
+ description: checkout code, restore cache, install dependencies, save cache
32
38
  steps:
33
39
  - checkout
34
40
 
35
41
  - restore_cache:
36
42
  keys:
37
- - bundle-dependencies-{{ checksum "Gemfile.lock" }}
43
+ - bundle-dependencies-{{ .Environment.BUNDLE_CACHE_VERSION }}-{{ checksum "Gemfile.lock" }}
38
44
  - bundle-dependencies-
39
45
 
40
46
  - restore_cache:
41
47
  keys:
42
- - yarn-dependencies-{{ checksum "yarn.lock" }}
48
+ - yarn-dependencies-{{ .Environment.YARN_CACHE_VERSION }}-{{ checksum "yarn.lock" }}
43
49
  - yarn-dependencies-
44
50
 
51
+ - run:
52
+ name: Install reviewdog
53
+ command: |
54
+ curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b ./bin
55
+
45
56
  - run:
46
57
  name: Install bundle dependencies
47
58
  command: |
@@ -49,24 +60,81 @@ jobs:
49
60
  gem install bundler:$BUNDLER_VERSION
50
61
  bundle _$(echo $BUNDLER_VERSION)_ install
51
62
 
63
+ - run:
64
+ name: Install yarn dependencies
65
+ command: |
66
+ curl -sL https://deb.nodesource.com/setup_$(cat .node-version).x | sudo -E bash -
67
+ sudo apt-get install -y nodejs
68
+ curl -o- -sL https://yarnpkg.com/install.sh | bash
69
+ sudo ln -s $HOME/.yarn/bin/yarn /usr/local/bin/yarn
70
+ yarn install --frozen-lockfile
71
+
52
72
  - save_cache:
53
- key: bundle-dependencies-{{ checksum "Gemfile.lock" }}
73
+ key: bundle-dependencies-{{ .Environment.BUNDLE_CACHE_VERSION }}-{{ checksum "Gemfile.lock" }}
54
74
  paths:
55
75
  - vendor/bundle
56
76
 
57
- - run:
58
- name: Install yarn dependencies
59
- command: yarn install --frozen-lockfile
60
-
61
77
  - save_cache:
62
- key: yarn-dependencies-{{ checksum "yarn.lock" }}
78
+ key: yarn-dependencies-{{ .Environment.YARN_CACHE_VERSION }}-{{ checksum "yarn.lock" }}
63
79
  paths:
64
80
  - node_modules
65
81
 
82
+ jobs:
83
+ test:
84
+ executor: test-executor
85
+ steps:
86
+ - setup
87
+ - browser-tools/install-chrome
88
+ - browser-tools/install-chromedriver
89
+
90
+ <%- if selected?(:background_processor) -%>
66
91
  - run:
67
- name: Install reviewdog
92
+ name: Wait for redis service
93
+ command: dockerize -wait tcp://localhost:6379 -timeout 1m
94
+ <%- end -%>
95
+ <%- if selected?(:database, :postgresql) -%>
96
+ - run:
97
+ name: Wait for postgres service
98
+ command: dockerize -wait tcp://localhost:5432 -timeout 1m
99
+
100
+ - run:
101
+ name: Setup database
102
+ command: bundle exec rails db:create db:schema:load
103
+ <%- end -%>
104
+
105
+ - run:
106
+ name: Run RSpec unit tests
68
107
  command: |
69
- curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b ./bin
108
+ RSPEC_JUNIT_ARGS="-r rspec_junit_formatter -f RspecJunitFormatter -o test_results/rspec.xml"
109
+ RSPEC_FORMAT_ARGS="-f progress --no-color -p 10"
110
+ bundle exec rspec spec $RSPEC_FORMAT_ARGS $RSPEC_JUNIT_ARGS
111
+
112
+ - run:
113
+ name: Run RSpec system tests
114
+ command: |
115
+ RSPEC_JUNIT_ARGS="-r rspec_junit_formatter -f RspecJunitFormatter -o test_results/rspec-system.xml"
116
+ RSPEC_FORMAT_ARGS="--tag type:system -f progress --no-color -p 10"
117
+ bundle exec rspec spec $RSPEC_FORMAT_ARGS $RSPEC_JUNIT_ARGS
118
+
119
+ - run:
120
+ name: Run simplecov
121
+ shell: /bin/bash
122
+ command: |
123
+ cat coverage/coverage.txt | ./bin/reviewdog -reporter=github-pr-review -efm="%f:%l:%c: %m"
124
+
125
+ <%- if selected?(:front_end, :vue) -%>
126
+ - run:
127
+ name: Run jest
128
+ command: yarn run test
129
+ <%- end -%>
130
+
131
+ - store_test_results:
132
+ path: test_results
133
+
134
+ lint:
135
+ executor: lint-executor
136
+ steps:
137
+ - setup
70
138
 
71
139
  - run:
72
140
  name: Get files to lint
@@ -94,7 +162,6 @@ jobs:
94
162
  | ./bin/reviewdog -reporter=github-pr-review -f=stylelint
95
163
 
96
164
  workflows:
97
- version: 2
98
165
  test_and_lint:
99
166
  jobs:
100
167
  - test
@@ -4,9 +4,3 @@ if defined?(PryByebug)
4
4
  Pry.commands.alias_command 'n', 'next'
5
5
  Pry.commands.alias_command 'f', 'finish'
6
6
  end
7
-
8
- if defined?(Rails)
9
- require 'rails/console/app'
10
- require 'rails/console/helpers'
11
- include Rails::ConsoleMethods # rubocop:disable Style/MixinUsage
12
- end
@@ -502,6 +502,19 @@ Performance/RedundantBlockCall:
502
502
  Description: Use `yield` instead of `block.call`.
503
503
  Reference: https://github.com/JuanitoFatas/fast-ruby#proccall-vs-yield-code
504
504
  Enabled: false
505
+ Style/OptionalBooleanParameter:
506
+ Description: 'Use keyword arguments when defining method with boolean argument.'
507
+ Enabled: false
508
+ Lint/MissingSuper:
509
+ Description: >-
510
+ This cop checks for the presence of constructors and lifecycle callbacks
511
+ without calls to `super`'.
512
+ Enabled: false
513
+ Style/RedundantFileExtensionInRequire:
514
+ Description: >-
515
+ Checks for the presence of superfluous `.rb` extension in
516
+ the filename provided to `require` and `require_relative`.
517
+ Enabled: false
505
518
  RSpec/MultipleExpectations:
506
519
  Max: 5
507
520
  RSpec/NestedGroups:
@@ -42,10 +42,7 @@ readme:
42
42
  The project is setup to run tests
43
43
  in [CircleCI](https://circleci.com/gh/platanus/<%= get(:dasherized_app_name) %>/tree/master)
44
44
 
45
- You can also run the test locally simulating the production environment using docker.
46
- Just make sure you have docker installed and run:
47
-
48
- bin/cibuild
45
+ You can also run the test locally simulating the production environment using [CircleCI's method](https://circleci.com/docs/2.0/local-cli/).
49
46
  deployment:
50
47
  title: "Deployment"
51
48
  body: |
@@ -112,9 +109,6 @@ readme:
112
109
  pundit:
113
110
  title: "Authorization"
114
111
  body: "For defining which parts of the system each user has access to, we have chosen to include the [Pundit](https://github.com/elabs/pundit) gem, by [Elabs](http://elabs.se/)."
115
- delayed_job:
116
- title: "Queue System"
117
- body: "For managing tasks in the background, this project uses [DelayedJob](https://github.com/collectiveidea/delayed_job)"
118
112
  sidekiq:
119
113
  title: "Queue System"
120
114
  body: "For managing tasks in the background, this project uses [Sidekiq](https://github.com/mperham/sidekiq)"
@@ -129,7 +123,7 @@ readme:
129
123
  body: "This project uses [Draper](https://github.com/drapergem/draper) to add an object-oriented layer of presentation logic"
130
124
  power_types:
131
125
  title: "Rails pattern enforcing types"
132
- body: "This projects uses [Power-Types](https://github.com/platanus/power-types) to generate Services, Commands, Utils and Values."
126
+ body: "This project uses [Power-Types](https://github.com/platanus/power-types) to generate Services, Commands, Utils and Values."
133
127
  power_api:
134
128
  title: "API Support"
135
129
  body: "This projects uses [Power API](https://github.com/platanus/power_api). It's a Rails engine that gathers a set of gems and configurations designed to build incredible REST APIs."
@@ -159,8 +153,51 @@ readme:
159
153
  ```
160
154
  - You can also use **any** vue bindings such as `v-for` , `:key` etc.
161
155
  <% end %>
156
+ <% if get(:authorization) %>
157
+ It uses the [ActiveAdmin's Pundit adapter](https://activeadmin.info/13-authorization-adapter.html).
158
+ - Policies for admin resources must inherit from `BackOffice::DefaultPolicy` and be placed inside the `app/policies/back_office` directory.
159
+ - For example:
160
+
161
+ `app/admin/clients.rb`:
162
+
163
+ ```ruby
164
+ ActiveAdmin.register Client do
165
+ # ...
166
+ end
167
+ ```
168
+
169
+ `app/policies/back_office/client_policy.rb`:
170
+
171
+ ```ruby
172
+ class BackOffice::ClientPolicy < BackOffice::DefaultPolicy
173
+ end
174
+ ```
175
+ <% end %>
162
176
  seeds:
163
177
  title: "Seeds"
164
178
  body: |
165
179
  To populate your database with initial data you can add, inside the `/db/seeds.rb` file, the code to generate **only the necessary data** to run the application.
166
180
  If you need to generate data with **development purposes**, you can customize the `lib/fake_data_loader.rb` module and then to run the `rake load_fake_data` task from your terminal.
181
+ testing:
182
+ title: "Testing"
183
+ body: |
184
+ We use:
185
+ - [RSpec](https://github.com/rspec/rspec-rails): the testing framework.
186
+ - [Shoulda Matchers](https://github.com/thoughtbot/shoulda-matchers): one-liners to test common Rails functionality that, if written by hand, would be much longer, more complex, and error-prone.
187
+ - [Factory Bot](https://github.com/thoughtbot/factory_bot_rails): a fixtures replacement with a straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance.
188
+ - [Faker](https://github.com/faker-ruby/faker): a port of Perl's Data::Faker library that generates fake data.
189
+ - [Guard](https://github.com/guard/guard): automates various tasks by running custom rules whenever file or directories are modified. We use it to run RSpec when files change.
190
+
191
+ Place your unit tests inside the `spec` directory.
192
+
193
+ To run unit tests: `bin/guard`
194
+
195
+ #### System tests
196
+
197
+ We use, in addition to the previous gems:
198
+ - [Capybara](https://github.com/teamcapybara/capybara): helps you test web applications by simulating how a real user would interact with your app. It is agnostic about the driver running your tests and comes with Rack::Test and Selenium support built in. WebKit is supported through an external gem.
199
+ - [Webdrivers](https://github.com/titusfortner/webdrivers): run Selenium tests more easily with automatic installation and updates for all supported webdrivers.
200
+
201
+ Place your system tests inside the `spec/system` directory.
202
+
203
+ To run system tests: `bin/rspec --tag type:system`
@@ -0,0 +1,2 @@
1
+ class BackOffice::AdminUserPolicy < BackOffice::DefaultPolicy
2
+ end
@@ -0,0 +1,2 @@
1
+ class BackOffice::ActiveAdmin::CommentPolicy < BackOffice::DefaultPolicy
2
+ end
@@ -0,0 +1,49 @@
1
+ class BackOffice::DefaultPolicy
2
+ attr_reader :admin_user, :record
3
+
4
+ def initialize(admin_user, record)
5
+ @admin_user = admin_user
6
+ @record = record
7
+ end
8
+
9
+ def index?
10
+ true
11
+ end
12
+
13
+ def show?
14
+ true
15
+ end
16
+
17
+ def create?
18
+ true
19
+ end
20
+
21
+ def new?
22
+ create?
23
+ end
24
+
25
+ def update?
26
+ true
27
+ end
28
+
29
+ def edit?
30
+ update?
31
+ end
32
+
33
+ def destroy?
34
+ true
35
+ end
36
+
37
+ class Scope
38
+ attr_reader :admin_user, :scope
39
+
40
+ def initialize(admin_user, scope)
41
+ @admin_user = admin_user
42
+ @scope = scope
43
+ end
44
+
45
+ def resolve
46
+ scope.all
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,2 @@
1
+ class BackOffice::ActiveAdmin::PagePolicy < BackOffice::DefaultPolicy
2
+ end
@@ -4,7 +4,7 @@ import App from 'app';
4
4
  describe('App', () => {
5
5
  test('is a Vue instance', () => {
6
6
  const wrapper = shallowMount(App);
7
- expect(wrapper.isVueInstance()).toBeTruthy();
7
+ expect(wrapper.vm).toBeTruthy();
8
8
  });
9
9
 
10
10
  it('displays message on load', () => {
@@ -0,0 +1,4 @@
1
+ <!-- Google Tag Manager (noscript) -->
2
+ <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=<%= ENV['GTM_CONTAINER_ID'] %>"
3
+ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
+ <!-- End Google Tag Manager (noscript) -->
@@ -0,0 +1,7 @@
1
+ <!-- Google Tag Manager -->
2
+ <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
3
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
4
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
5
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
6
+ })(window,document,'script','dataLayer','<%=ENV['GTM_CONTAINER_ID']%>');</script>
7
+ <!-- End Google Tag Manager -->
@@ -2,3 +2,4 @@
2
2
  --require rails_helper
3
3
  --format=doc
4
4
  --format=Nc
5
+ --tag ~type:system
@@ -0,0 +1,6 @@
1
+ require 'devise'
2
+
3
+ RSpec.configure do |config|
4
+ config.include Devise::Test::ControllerHelpers, type: :controller
5
+ config.include Devise::Test::IntegrationHelpers, type: :request
6
+ end
@@ -0,0 +1,3 @@
1
+ RSpec.configure do |config|
2
+ config.include FactoryBot::Syntax::Methods
3
+ end
@@ -0,0 +1 @@
1
+ require 'faker'
@@ -0,0 +1 @@
1
+ PowerTypes::Observable.observable_disabled = true
@@ -1,60 +1,141 @@
1
- # This file is copied to spec/ when you run 'rails generate rspec:install'
2
1
  ENV['RACK_ENV'] ||= 'test'
3
2
  require File.expand_path('../config/environment', __dir__)
4
3
  require 'rspec/rails'
5
4
  require 'spec_helper'
6
- require 'shoulda/matchers'
7
- require 'faker'
8
- # Add additional requires below this line. Rails is not loaded until this point!
9
-
10
- # Requires supporting ruby files with custom matchers and macros, etc, in
11
- # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
12
- # run as spec files by default. This means that files in spec/support that end
13
- # in _spec.rb will both be required and run as specs, causing the specs to be
14
- # run twice. It is recommended that you do not name files matching this glob to
15
- # end with _spec.rb. You can configure this pattern with the --pattern
16
- # option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
17
- #
18
- # The following line is provided for convenience purposes. It has the downside
19
- # of increasing the boot-up time by auto-requiring all files in the support
20
- # directory. Alternatively, in the individual `*_spec.rb` files, manually
21
- # require only the support files necessary.
22
- #
23
- Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
24
-
25
- # Checks for pending migrations before tests are run.
26
- # If you are not using ActiveRecord, you can remove this line.
27
- ActiveRecord::Migration.maintain_test_schema!
28
5
 
29
- PowerTypes::Observable.observable_disabled = true
6
+ =begin
30
7
 
31
- RSpec.configure do |config|
32
- # If you're not using ActiveRecord, or you'd prefer not to run each of your
33
- # examples within a transaction, remove the following line or assign false
34
- # instead of true.
35
- config.use_transactional_fixtures = true
8
+ General
9
+ =======
36
10
 
37
- # RSpec Rails can automatically mix in different behaviours to your tests
38
- # based on their file location, for example enabling you to call `get` and
39
- # `post` in specs under `spec/controllers`.
40
- #
41
- # You can disable this behaviour by removing the line below, and instead
42
- # explicitly tag your specs with their type, e.g.:
43
- #
44
- # RSpec.describe UsersController, :type => :controller do
45
- # # ...
46
- # end
47
- #
48
- # The different available types are documented in the features, such as in
49
- # https://relishapp.com/rspec/rspec-rails/docs
50
- config.infer_spec_type_from_file_location!
11
+ 1) Place your unit tests inside the "spec" directory.
12
+ 2) Run unit tests executing `bin/guard`.
13
+ 3) Use support directories to add helpers and settings.
14
+ You can only put RSpec configuration on this file.
51
15
 
52
- config.include FactoryBot::Syntax::Methods
53
- end
16
+ Support
17
+ -------
18
+
19
+ * spec/support/configurations: put testing related gem settings here.
20
+
21
+ For example: spec/support/configurations/shoulda_matchers_config.rb
22
+
23
+ ----------------------------------------
24
+ require 'shoulda/matchers'
25
+
26
+ Shoulda::Matchers.configure do |config|
27
+ config.integrate do |with|
28
+ with.test_framework :rspec
29
+ with.library :rails
30
+ end
31
+ end
32
+ ----------------------------------------
33
+
34
+ * spec/support/helpers: place here helpers created by you to use in your unit tests.
35
+
36
+ For example: spec/support/helpers/attachments_helpers.rb
37
+
38
+ ----------------------------------------------------------------------------------
39
+ module AttachmentsHelpers
40
+ extend ActiveSupport::Concern
41
+
42
+ included do
43
+ def create_attachment_file(filename: "pikachu.png", content_type: "image/png")
44
+ Rack::Test::UploadedFile.new(file_fixture(filename), content_type)
45
+ end
46
+ end
47
+ end
48
+
49
+ RSpec.configure do |config|
50
+ config.fixture_path = "#{::Rails.root}/spec/assets"
51
+ config.file_fixture_path = "#{::Rails.root}/spec/assets"
52
+
53
+ config.include AttachmentsHelpers
54
+ end
55
+ ----------------------------------------------------------------------------------
56
+
57
+ * spec/support/custom_matchers: place here your custom matchers
58
+ (https://relishapp.com/rspec/rspec-expectations/v/3-10/docs/custom-matchers)
59
+
60
+ * spec/support/shared_examples: place here your shared examples
61
+ (https://relishapp.com/rspec/rspec-core/v/3-10/docs/example-groups/shared-examples)
62
+
63
+ System Tests
64
+ ============
65
+
66
+ 1) Place your system tests inside the "spec/system" directory.
67
+ 2) Run system tests executing `bin/rspec --tag type:system`.
68
+
69
+ Support
70
+ -------
71
+
72
+ * spec/support/configurations/system_tests_config.rb: on this file you will find the
73
+ general configuration of the system tests. Keep in mind that this type of test will
74
+ run with the `selenium_chrome_headless` driver unless you put the `no_js` tag.
54
75
 
55
- Shoulda::Matchers.configure do |config|
56
- config.integrate do |with|
57
- with.test_framework :rspec
58
- with.library :rails
76
+ For example: spec/system/login_spec.rb
77
+
78
+ ----------------------------------------------------------------------------
79
+ require "rails_helper"
80
+
81
+ RSpec.describe "Login" do
82
+ let!(:user) { create(:user, email: "lean@platan.us") }
83
+
84
+ context "without logged user", :no_js do # will use :rack_test driver
85
+ before { visit("/") }
86
+
87
+ it { expect(page).to have_text("Ingresa") }
88
+ end
89
+
90
+ context "with logged user" do # will use :selenium_chrome_headless driver
91
+ before { sign_in(user) }
92
+
93
+ it { expect(page).to have_text("Hola!") }
94
+ end
95
+ end
96
+ ----------------------------------------------------------------------------
97
+
98
+ * spec/support/helpers/system: place here helpers created by you
99
+ to use in your system tests.
100
+
101
+ For example: spec/support/helpers/login_helpers.rb
102
+
103
+ ------------------------------------------------
104
+ module LoginHelpers
105
+ extend ActiveSupport::Concern
106
+
107
+ included do
108
+ def sign_in(email, password)
109
+ visit('/users/sign_in')
110
+
111
+ within(:xpath, '//*[@id="new_user"]') do
112
+ fill_in('Email', with: email)
113
+ fill_in('Contraseña', with: password)
114
+ end
115
+
116
+ click_button('Ingresar')
117
+ end
118
+
119
+ def logout
120
+ visit('/users/sign_out')
121
+ end
122
+ end
123
+ end
124
+
125
+ RSpec.configure do |config|
126
+ config.include LoginHelpers, type: :system
59
127
  end
128
+ ------------------------------------------------
129
+
130
+ Remember to include the system helpers with the tag `type: :system`
131
+ =end
132
+
133
+ Dir[Rails.root.join("spec/support/**/*.rb")].sort.each { |f| require f }
134
+
135
+ ActiveRecord::Migration.maintain_test_schema!
136
+
137
+ RSpec.configure do |config|
138
+ config.use_transactional_fixtures = true
139
+ config.infer_spec_type_from_file_location!
140
+ config.filter_run_when_matching :focus unless Rails.env.production?
60
141
  end
@@ -0,0 +1,8 @@
1
+ require 'shoulda/matchers'
2
+
3
+ Shoulda::Matchers.configure do |config|
4
+ config.integrate do |with|
5
+ with.test_framework :rspec
6
+ with.library :rails
7
+ end
8
+ end