cypress-on-rails 1.13.1 → 1.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +6 -0
- data/CHANGELOG.md +13 -1
- data/README.md +107 -67
- data/docs/authentication.md +12 -10
- data/docs/factory_bot_associations.md +11 -11
- data/lib/cypress_on_rails/configuration.rb +2 -0
- data/lib/cypress_on_rails/middleware.rb +1 -1
- data/lib/cypress_on_rails/version.rb +1 -1
- data/lib/generators/cypress_on_rails/install_generator.rb +1 -0
- data/lib/generators/cypress_on_rails/templates/config/initializers/cypress_on_rails.rb.erb +1 -0
- data/lib/generators/cypress_on_rails/update_generator.rb +1 -1
- data/spec/cypress_on_rails/configuration_spec.rb +3 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be4a4a9207812860337d7976f7a97d1c9891f6d6f7f6e42c1b230d64983554db
|
4
|
+
data.tar.gz: d0c64c623d011387a8fd1462f7e51286709442e8486e4f474c41088c749803fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b8ff159ab4deb96dca982e2a57abf0ec3db3e01176b9b4df866eaf04d7e113d05f6fa44c62366bc5e460bc4f3671034bd8bae9887ca17a32e9b426e753f029e
|
7
|
+
data.tar.gz: 7e7d86478a91503298e18242f2046641def314b8a0cc859ac7ac0e433d0dab01e57698b9766dd6342c7e81f7e83e5c1b0c338cdf1e837b9ef0fa5307a1904cd5
|
data/.github/workflows/ruby.yml
CHANGED
@@ -23,6 +23,8 @@ jobs:
|
|
23
23
|
- run: gem install bundler -v '< 2'
|
24
24
|
- name: Run interaction tests
|
25
25
|
run: ./specs_e2e/rails_3_2/test.sh
|
26
|
+
env:
|
27
|
+
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
26
28
|
|
27
29
|
rails_4_2:
|
28
30
|
runs-on: ubuntu-latest
|
@@ -40,6 +42,8 @@ jobs:
|
|
40
42
|
- run: gem install bundler -v '< 2'
|
41
43
|
- name: Run interaction tests
|
42
44
|
run: ./specs_e2e/rails_4_2/test.sh
|
45
|
+
env:
|
46
|
+
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
43
47
|
|
44
48
|
rails_5_2:
|
45
49
|
runs-on: ubuntu-latest
|
@@ -55,3 +59,5 @@ jobs:
|
|
55
59
|
run: bundle exec rake
|
56
60
|
- name: Run interaction tests
|
57
61
|
run: ./specs_e2e/rails_5_2/test.sh
|
62
|
+
env:
|
63
|
+
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## [1.14.0]
|
2
|
+
[Compare]: https://github.com/shakacode/cypress-on-rails/compare/v1.13.1...v1.14.0
|
3
|
+
|
4
|
+
### Changed
|
5
|
+
* Add support for proxy routes through `api_prefix` [PR 130](https://github.com/shakacode/cypress-on-rails/pull/130) by [RomainEndelin]
|
6
|
+
|
7
|
+
### Fixed
|
8
|
+
* Properly copies the cypress_helper file when running the update generator [PR 117](https://github.com/shakacode/cypress-on-rails/pull/117) by [alvincrespo]
|
9
|
+
|
10
|
+
### Tasks
|
11
|
+
* pass cypress record key to github action [PR 110](https://github.com/shakacode/cypress-on-rails/pull/110)
|
12
|
+
|
1
13
|
## [1.13.1]
|
2
14
|
[Compare]: https://github.com/shakacode/cypress-on-rails/compare/v1.13.0...v1.13.1
|
3
15
|
|
@@ -34,7 +46,7 @@
|
|
34
46
|
[Compare]: https://github.com/shakacode/cypress-on-rails/compare/v1.10.1...v1.11.0
|
35
47
|
|
36
48
|
### Changed
|
37
|
-
* improve app command logging on cypress
|
49
|
+
* improve app command logging on cypress
|
38
50
|
* Allow build and build_list commands to be executed against factory bot [PR 87](https://github.com/shakacode/cypress-on-rails/pull/87) by [Alexander-Blair]
|
39
51
|
|
40
52
|
## [1.10.1]
|
data/README.md
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# CypressOnRails
|
2
2
|
|
3
3
|
![Build Status](https://github.com/shakacode/cypress-on-rails/actions/workflows/ruby.yml/badge.svg)
|
4
|
+
[![cypress-on-rails](https://img.shields.io/endpoint?url=https://dashboard.cypress.io/badge/simple/2b6cjr/master&style=plastic&logo=cypress)](https://dashboard.cypress.io/projects/2b6cjr/runs)
|
4
5
|
[![Gem Version](https://badge.fury.io/rb/cypress-on-rails.svg)](https://badge.fury.io/rb/cypress-on-rails)
|
5
6
|
|
6
7
|
----
|
7
8
|
|
8
|
-
This project is sponsored by the software consulting firm [ShakaCode](https://www.shakacode.com), creator of the [React on Rails Gem](https://github.com/shakacode/react_on_rails). We focus on React (with TS or ReScript) front-ends, often with Ruby on Rails or Gatsby. See [our recent work](https://www.shakacode.com/recent-work) and [client engagement model](https://www.shakacode.com/blog/client-engagement-model/). Feel free to engage in discussions around this gem at our [Slack Channel](https://join.slack.com/t/reactrails/shared_invite/enQtNjY3NTczMjczNzYxLTlmYjdiZmY3MTVlMzU2YWE0OWM0MzNiZDI0MzdkZGFiZTFkYTFkOGVjODBmOWEyYWQ3MzA2NGE1YWJjNmVlMGE) or our [forum category for Cypress](https://forum.shakacode.com/c/cypress-on-rails/55).
|
9
|
+
This project is sponsored by the software consulting firm [ShakaCode](https://www.shakacode.com), creator of the [React on Rails Gem](https://github.com/shakacode/react_on_rails). We focus on React (with TS or ReScript) front-ends, often with Ruby on Rails or Gatsby. See [our recent work](https://www.shakacode.com/recent-work) and [client engagement model](https://www.shakacode.com/blog/client-engagement-model/). Feel free to engage in discussions around this gem at our [Slack Channel](https://join.slack.com/t/reactrails/shared_invite/enQtNjY3NTczMjczNzYxLTlmYjdiZmY3MTVlMzU2YWE0OWM0MzNiZDI0MzdkZGFiZTFkYTFkOGVjODBmOWEyYWQ3MzA2NGE1YWJjNmVlMGE) or our [forum category for Cypress](https://forum.shakacode.com/c/cypress-on-rails/55).
|
9
10
|
|
10
11
|
Interested in joining a small team that loves open source? Check our [careers page](https://www.shakacode.com/career/).
|
11
12
|
|
@@ -13,6 +14,9 @@ Need help with cypress-on-rails? Contact [ShakaCode](mailto:justin@shakacode.com
|
|
13
14
|
|
14
15
|
----
|
15
16
|
|
17
|
+
# Playwright.dev support
|
18
|
+
We're working on full support for [Playwright.dev](https://playwright.dev/). See [issue #116](https://github.com/shakacode/cypress-on-rails/issues/116#issuecomment-1523946478) for details.
|
19
|
+
|
16
20
|
# Totally new to Cypress?
|
17
21
|
Suggest you first learn the basics of Cypress before attempting to integrate with Ruby on Rails
|
18
22
|
|
@@ -20,10 +24,10 @@ Suggest you first learn the basics of Cypress before attempting to integrate wit
|
|
20
24
|
|
21
25
|
## Overview
|
22
26
|
|
23
|
-
Gem for using [cypress.io](http://github.com/cypress-io/) in Rails and
|
24
|
-
with the goal of controlling
|
27
|
+
Gem for using [cypress.io](http://github.com/cypress-io/) in Rails and Ruby Rack applications
|
28
|
+
with the goal of controlling state as mentioned in [Cypress Best Practices](https://docs.cypress.io/guides/references/best-practices.html#Organizing-Tests-Logging-In-Controlling-State)
|
25
29
|
|
26
|
-
It allows to run code in the application context when executing cypress tests.
|
30
|
+
It allows you to run code in the application context when executing cypress tests.
|
27
31
|
Do things like:
|
28
32
|
* use database_cleaner before each test
|
29
33
|
* seed the database with default data for each test
|
@@ -42,7 +46,7 @@ Has examples of setting up state with:
|
|
42
46
|
|
43
47
|
## Installation
|
44
48
|
|
45
|
-
Add this to your Gemfile
|
49
|
+
Add this to your `Gemfile`:
|
46
50
|
|
47
51
|
```ruby
|
48
52
|
group :test, :development do
|
@@ -58,6 +62,9 @@ bin/rails g cypress_on_rails:install
|
|
58
62
|
# if you have/want a different cypress folder (default is cypress)
|
59
63
|
bin/rails g cypress_on_rails:install --cypress_folder=spec/cypress
|
60
64
|
|
65
|
+
# if you target the Rails server with a path prefix to your URL
|
66
|
+
bin/rails g cypress_on_rails:install --api_prefix=/api
|
67
|
+
|
61
68
|
# if you want to install cypress with npm
|
62
69
|
bin/rails g cypress_on_rails:install --install_cypress_with=npm
|
63
70
|
|
@@ -70,26 +77,25 @@ bin/rails g cypress_on_rails:update
|
|
70
77
|
|
71
78
|
The generator modifies/adds the following files/directory in your application:
|
72
79
|
* `config/environments/test.rb`
|
73
|
-
* `config/initializers/cypress_on_rails` used to configure
|
80
|
+
* `config/initializers/cypress_on_rails.rb` used to configure Cypress on Rails
|
74
81
|
* `spec/cypress/e2e/` contains your cypress tests
|
75
|
-
* `spec/cypress/support/on-rails.js` contains
|
76
|
-
* `spec/cypress/app_commands/scenarios/` contains your
|
77
|
-
* `spec/cypress/cypress_helper.rb` contains helper code for
|
82
|
+
* `spec/cypress/support/on-rails.js` contains Cypress on Rails support code
|
83
|
+
* `spec/cypress/app_commands/scenarios/` contains your Cypress on Rails scenario definitions
|
84
|
+
* `spec/cypress/cypress_helper.rb` contains helper code for Cypress on Rails app commands
|
78
85
|
|
79
|
-
|
80
|
-
|
86
|
+
If you are not using `database_cleaner` look at `spec/cypress/app_commands/clean.rb`.
|
87
|
+
If you are not using `factory_bot` look at `spec/cypress/app_commands/factory_bot.rb`.
|
81
88
|
|
82
|
-
Now you can create scenarios and commands that are plain
|
89
|
+
Now you can create scenarios and commands that are plain Ruby files that get loaded through middleware, the ruby sky is your limit.
|
83
90
|
|
84
91
|
### Update your database.yml
|
85
92
|
|
86
|
-
When
|
87
|
-
make are picked up without having to restart the server.
|
88
|
-
It's
|
93
|
+
When running `cypress test` on your local computer it's recommended to start your server in development mode so that changes you
|
94
|
+
make are picked up without having to restart the server.
|
95
|
+
It's recommended you update your `database.yml` to check if the `CYPRESS` environment variable is set and switch it to the test database
|
89
96
|
otherwise cypress will keep clearing your development database.
|
90
97
|
|
91
|
-
|
92
|
-
|
98
|
+
For example:
|
93
99
|
```yaml
|
94
100
|
development:
|
95
101
|
<<: *default
|
@@ -112,9 +118,9 @@ Getting started on your local environment
|
|
112
118
|
CYPRESS=1 bin/rails server -p 5017
|
113
119
|
|
114
120
|
# in separate window start cypress
|
115
|
-
yarn cypress open
|
121
|
+
yarn cypress open
|
116
122
|
# or for npm
|
117
|
-
node_modules/.bin/cypress open
|
123
|
+
node_modules/.bin/cypress open
|
118
124
|
# or if you changed the cypress folder to spec/cypress
|
119
125
|
yarn cypress open --project ./spec
|
120
126
|
```
|
@@ -127,7 +133,7 @@ How to run cypress on CI
|
|
127
133
|
|
128
134
|
yarn run cypress run
|
129
135
|
# or for npm
|
130
|
-
node_modules/.bin/cypress run
|
136
|
+
node_modules/.bin/cypress run
|
131
137
|
```
|
132
138
|
|
133
139
|
### Example of using factory bot
|
@@ -136,8 +142,8 @@ You can run your [factory_bot](https://github.com/thoughtbot/factory_bot) direct
|
|
136
142
|
|
137
143
|
```js
|
138
144
|
// spec/cypress/e2e/simple.cy.js
|
139
|
-
describe('My First Test',
|
140
|
-
it('visit root',
|
145
|
+
describe('My First Test', () => {
|
146
|
+
it('visit root', () => {
|
141
147
|
// This calls to the backend to prepare the application state
|
142
148
|
cy.appFactories([
|
143
149
|
['create_list', 'post', 10],
|
@@ -148,7 +154,7 @@ describe('My First Test', function() {
|
|
148
154
|
// Visit the application under test
|
149
155
|
cy.visit('/')
|
150
156
|
|
151
|
-
cy.contains(
|
157
|
+
cy.contains('Hello World')
|
152
158
|
|
153
159
|
// Accessing result
|
154
160
|
cy.appFactories([['create', 'invoice', { paid: false }]]).then((records) => {
|
@@ -157,9 +163,9 @@ describe('My First Test', function() {
|
|
157
163
|
})
|
158
164
|
})
|
159
165
|
```
|
160
|
-
You can check the [association
|
166
|
+
You can check the [association docs](docs/factory_bot_associations.md) on more ways to setup association with the correct data.
|
161
167
|
|
162
|
-
In some cases, using static Cypress fixtures may not provide sufficient flexibility when mocking HTTP response bodies
|
168
|
+
In some cases, using static Cypress fixtures may not provide sufficient flexibility when mocking HTTP response bodies. It's possible to use `FactoryBot.build` to generate Ruby hashes that can then be used as mock JSON responses:
|
163
169
|
```ruby
|
164
170
|
FactoryBot.define do
|
165
171
|
factory :some_web_response, class: Hash do
|
@@ -171,13 +177,13 @@ FactoryBot.define do
|
|
171
177
|
end
|
172
178
|
end
|
173
179
|
|
174
|
-
FactoryBot.build(:some_web_response
|
180
|
+
FactoryBot.build(:some_web_response => { 'id' => 123, 'name' => 'Mr Blobby', 'occupation' => 'Evil pink clown' })
|
175
181
|
```
|
176
182
|
|
177
183
|
This can then be combined with Cypress mocks:
|
178
184
|
```js
|
179
|
-
describe('My First Test',
|
180
|
-
it('visit root',
|
185
|
+
describe('My First Test', () => {
|
186
|
+
it('visit root', () => {
|
181
187
|
// This calls to the backend to generate the mocked response
|
182
188
|
cy.appFactories([
|
183
189
|
['build', 'some_web_response', { name: 'Baby Blobby' }]
|
@@ -190,12 +196,12 @@ describe('My First Test', function() {
|
|
190
196
|
cy.visit('/')
|
191
197
|
})
|
192
198
|
|
193
|
-
cy.contains(
|
199
|
+
cy.contains('Hello World')
|
194
200
|
})
|
195
201
|
})
|
196
202
|
```
|
197
203
|
|
198
|
-
### Example of loading
|
204
|
+
### Example of loading Rails test fixtures
|
199
205
|
```ruby
|
200
206
|
# spec/cypress/app_commands/activerecord_fixtures.rb
|
201
207
|
require "active_record/fixtures"
|
@@ -210,15 +216,15 @@ ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
|
|
210
216
|
|
211
217
|
```js
|
212
218
|
// spec/cypress/e2e/simple.cy.js
|
213
|
-
describe('My First Test',
|
214
|
-
it('visit root',
|
219
|
+
describe('My First Test', () => {
|
220
|
+
it('visit root', () => {
|
215
221
|
// This calls to the backend to prepare the application state
|
216
222
|
cy.appFixtures()
|
217
223
|
|
218
224
|
// Visit the application under test
|
219
225
|
cy.visit('/')
|
220
226
|
|
221
|
-
cy.contains(
|
227
|
+
cy.contains('Hello World')
|
222
228
|
})
|
223
229
|
})
|
224
230
|
```
|
@@ -239,21 +245,21 @@ CypressOnRails::SmartFactoryWrapper.create(:profile, name: "Cypress Hill")
|
|
239
245
|
Then reference the scenario in your test:
|
240
246
|
```js
|
241
247
|
// spec/cypress/e2e/scenario_example.cy.js
|
242
|
-
describe('My First Test',
|
243
|
-
it('visit root',
|
248
|
+
describe('My First Test', () => {
|
249
|
+
it('visit root', () => {
|
244
250
|
// This calls to the backend to prepare the application state
|
245
251
|
cy.appScenario('basic')
|
246
252
|
|
247
253
|
cy.visit('/profiles')
|
248
254
|
|
249
|
-
cy.contains(
|
255
|
+
cy.contains('Cypress Hill')
|
250
256
|
})
|
251
257
|
})
|
252
258
|
```
|
253
259
|
|
254
260
|
### Example of using app commands
|
255
261
|
|
256
|
-
|
262
|
+
Create a Ruby file in the `spec/cypress/app_commands` directory:
|
257
263
|
```ruby
|
258
264
|
# spec/cypress/app_commands/load_seed.rb
|
259
265
|
load "#{Rails.root}/db/seeds.rb"
|
@@ -262,10 +268,10 @@ load "#{Rails.root}/db/seeds.rb"
|
|
262
268
|
Then reference the command in your test with `cy.app('load_seed')`:
|
263
269
|
```js
|
264
270
|
// spec/cypress/e2e/simple.cy.js
|
265
|
-
describe('My First Test',
|
271
|
+
describe('My First Test', () => {
|
266
272
|
beforeEach(() => { cy.app('load_seed') })
|
267
273
|
|
268
|
-
it('visit root',
|
274
|
+
it('visit root', () => {
|
269
275
|
cy.visit('/')
|
270
276
|
|
271
277
|
cy.contains("Seeds")
|
@@ -273,11 +279,11 @@ describe('My First Test', function() {
|
|
273
279
|
})
|
274
280
|
```
|
275
281
|
|
276
|
-
##
|
282
|
+
## Experimental Features (matching npm package)
|
277
283
|
|
278
|
-
Please test and give feedback
|
284
|
+
Please test and give feedback.
|
279
285
|
|
280
|
-
|
286
|
+
Add the npm package:
|
281
287
|
|
282
288
|
```
|
283
289
|
yarn add cypress-on-rails --dev
|
@@ -285,7 +291,7 @@ yarn add cypress-on-rails --dev
|
|
285
291
|
|
286
292
|
### for VCR
|
287
293
|
|
288
|
-
This only works when you start the
|
294
|
+
This only works when you start the Rails server with a single worker and single thread
|
289
295
|
|
290
296
|
#### setup
|
291
297
|
|
@@ -298,13 +304,13 @@ VCR.configure do |config|
|
|
298
304
|
end
|
299
305
|
```
|
300
306
|
|
301
|
-
Add to
|
307
|
+
Add to your `cypress/support/index.js`:
|
302
308
|
|
303
309
|
```js
|
304
310
|
import 'cypress-on-rails/support/index'
|
305
311
|
```
|
306
312
|
|
307
|
-
Add to
|
313
|
+
Add to your `cypress/app_commands/clean.rb`:
|
308
314
|
|
309
315
|
```ruby
|
310
316
|
VCR.eject_cassette # make sure we no cassettes inserted before the next test starts
|
@@ -312,7 +318,7 @@ VCR.turn_off!
|
|
312
318
|
WebMock.disable! if defined?(WebMock)
|
313
319
|
```
|
314
320
|
|
315
|
-
Add to
|
321
|
+
Add to your `config/cypress_on_rails.rb`:
|
316
322
|
|
317
323
|
```ruby
|
318
324
|
c.use_vcr_middleware = !Rails.env.production? && ENV['CYPRESS'].present?
|
@@ -324,10 +330,10 @@ You have `vcr_insert_cassette` and `vcr_eject_cassette` available. https://www.r
|
|
324
330
|
|
325
331
|
|
326
332
|
```js
|
327
|
-
describe('My First Test',
|
333
|
+
describe('My First Test', () => {
|
328
334
|
beforeEach(() => { cy.app('load_seed') })
|
329
335
|
|
330
|
-
it('visit root',
|
336
|
+
it('visit root', () => {
|
331
337
|
cy.app('clean') // have a look at cypress/app_commands/clean.rb
|
332
338
|
|
333
339
|
cy.vcr_insert_cassette('cats', { record: "new_episodes" })
|
@@ -336,7 +342,7 @@ describe('My First Test', function() {
|
|
336
342
|
cy.get('a').contains('Cats').click()
|
337
343
|
cy.contains('Wikipedia has a recording of a cat meowing, because why not?')
|
338
344
|
|
339
|
-
cy.vcr_eject_cassette()
|
345
|
+
cy.vcr_eject_cassette()
|
340
346
|
|
341
347
|
cy.vcr_insert_cassette('cats')
|
342
348
|
cy.visit('/using_vcr/record_cats')
|
@@ -362,30 +368,30 @@ use CypressOnRails::Middleware
|
|
362
368
|
run MyApp
|
363
369
|
```
|
364
370
|
|
365
|
-
add the following file to
|
371
|
+
add the following file to Cypress
|
366
372
|
|
367
373
|
```js
|
368
374
|
// test/cypress/support/on-rails.js
|
369
|
-
// CypressOnRails:
|
370
|
-
Cypress.Commands.add('appCommands',
|
375
|
+
// CypressOnRails: don't remove these commands
|
376
|
+
Cypress.Commands.add('appCommands', (body) => {
|
371
377
|
cy.request({
|
372
378
|
method: 'POST',
|
373
|
-
url:
|
379
|
+
url: '/__cypress__/command',
|
374
380
|
body: JSON.stringify(body),
|
375
381
|
log: true,
|
376
382
|
failOnStatusCode: true
|
377
383
|
})
|
378
384
|
});
|
379
385
|
|
380
|
-
Cypress.Commands.add('app',
|
386
|
+
Cypress.Commands.add('app', (name, command_options) => {
|
381
387
|
cy.appCommands({name: name, options: command_options})
|
382
388
|
});
|
383
389
|
|
384
|
-
Cypress.Commands.add('appScenario',
|
390
|
+
Cypress.Commands.add('appScenario', (name) => {
|
385
391
|
cy.app('scenarios/' + name)
|
386
392
|
});
|
387
393
|
|
388
|
-
Cypress.Commands.add('appFactories',
|
394
|
+
Cypress.Commands.add('appFactories', (options) => {
|
389
395
|
cy.app('factory_bot', options)
|
390
396
|
});
|
391
397
|
// CypressOnRails: end
|
@@ -396,6 +402,17 @@ beforeEach(() => {
|
|
396
402
|
});
|
397
403
|
```
|
398
404
|
|
405
|
+
## API Prefix
|
406
|
+
|
407
|
+
If your Rails server is exposed under a proxy, typically https://my-local.dev/api, you can use the `api_prefix` option.
|
408
|
+
In `config/initializers/cypress_on_rails.rb`, add this line:
|
409
|
+
```ruby
|
410
|
+
CypressOnRails.configure do |c|
|
411
|
+
# ...
|
412
|
+
c.api_prefix = '/api'
|
413
|
+
end
|
414
|
+
```
|
415
|
+
|
399
416
|
## Contributing
|
400
417
|
|
401
418
|
1. Fork it ( https://github.com/shakacode/cypress-on-rails/fork )
|
@@ -404,14 +421,37 @@ beforeEach(() => {
|
|
404
421
|
4. Push to the branch (`git push origin my-new-feature`)
|
405
422
|
5. Create a new Pull Request
|
406
423
|
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
424
|
+
## Supporters
|
425
|
+
|
426
|
+
<a href="https://www.jetbrains.com">
|
427
|
+
<img src="https://user-images.githubusercontent.com/4244251/184881139-42e4076b-024b-4b30-8c60-c3cd0e758c0a.png" alt="JetBrains" height="120px">
|
428
|
+
</a>
|
429
|
+
<a href="https://scoutapp.com">
|
430
|
+
<picture>
|
431
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/4244251/184881147-0d077438-3978-40da-ace9-4f650d2efe2e.png">
|
432
|
+
<source media="(prefers-color-scheme: light)" srcset="https://user-images.githubusercontent.com/4244251/184881152-9f2d8fba-88ac-4ba6-873b-22387f8711c5.png">
|
433
|
+
<img alt="ScoutAPM" src="https://user-images.githubusercontent.com/4244251/184881152-9f2d8fba-88ac-4ba6-873b-22387f8711c5.png" height="120px">
|
434
|
+
</picture>
|
435
|
+
</a>
|
436
|
+
<br />
|
437
|
+
<a href="https://www.browserstack.com">
|
438
|
+
<picture>
|
439
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/4244251/184881122-407dcc29-df78-4b20-a9ad-f597b56f6cdb.png">
|
440
|
+
<source media="(prefers-color-scheme: light)" srcset="https://user-images.githubusercontent.com/4244251/184881129-e1edf4b7-3ae1-4ea8-9e6d-3595cf01609e.png">
|
441
|
+
<img alt="BrowserStack" src="https://user-images.githubusercontent.com/4244251/184881129-e1edf4b7-3ae1-4ea8-9e6d-3595cf01609e.png" height="55px">
|
442
|
+
</picture>
|
443
|
+
</a>
|
444
|
+
<a href="https://railsautoscale.com">
|
445
|
+
<img src="https://user-images.githubusercontent.com/4244251/184881144-95c2c25c-9879-4069-864d-4e67d6ed39d2.png" alt="Rails Autoscale" height="55px">
|
446
|
+
</a>
|
447
|
+
<a href="https://www.honeybadger.io">
|
448
|
+
<img src="https://user-images.githubusercontent.com/4244251/184881133-79ee9c3c-8165-4852-958e-31687b9536f4.png" alt="Honeybadger" height="55px">
|
449
|
+
</a>
|
450
|
+
<a href="https://reviewable.io">
|
451
|
+
<img src="https://user-images.githubusercontent.com/20628911/230848305-c94510a4-82d7-468f-bf9f-eeb81d3f2ce0.png" alt="Reviewable" height="55px">
|
452
|
+
</a>
|
453
|
+
|
454
|
+
<br />
|
455
|
+
<br />
|
456
|
+
|
457
|
+
The following companies support our open source projects, and ShakaCode uses their products!
|
data/docs/authentication.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Example for Authenticating a User
|
2
2
|
|
3
|
-
|
3
|
+
In `config/routes.rb`:
|
4
4
|
```rb
|
5
5
|
Rails.application.routes.draw do
|
6
6
|
# ...... your other routes
|
@@ -12,7 +12,7 @@ Rails.application.routes.draw do
|
|
12
12
|
end
|
13
13
|
```
|
14
14
|
|
15
|
-
app/controllers/cypress_controller.rb
|
15
|
+
`app/controllers/cypress_controller.rb`:
|
16
16
|
```rb
|
17
17
|
class CypressController < ApplicationController
|
18
18
|
skip_before_action :verify_authenticity_token
|
@@ -29,21 +29,23 @@ class CypressController < ApplicationController
|
|
29
29
|
end
|
30
30
|
```
|
31
31
|
|
32
|
-
|
32
|
+
In `cypress/support/on-rails.js`:
|
33
33
|
```js
|
34
|
-
Cypress.Commands.add(
|
35
|
-
if(!details)
|
34
|
+
Cypress.Commands.add('forceLogin', (details) => {
|
35
|
+
if (!details) {
|
36
36
|
details = {}
|
37
|
+
}
|
37
38
|
|
38
|
-
if(!details.redirect_to)
|
39
|
+
if (!details.redirect_to) {
|
39
40
|
details.redirect_to = '/'
|
41
|
+
}
|
40
42
|
|
41
|
-
cy.visit(
|
42
|
-
{ method:
|
43
|
-
})
|
43
|
+
cy.visit('__cypress__/forceLogin',
|
44
|
+
{ method: 'POST', body: { email: details.email, redirect_to: details.redirect_to } })
|
45
|
+
})
|
44
46
|
```
|
45
47
|
|
46
|
-
|
48
|
+
Examples of usage in Cypress specs:
|
47
49
|
```js
|
48
50
|
cy.forceLogin()
|
49
51
|
cy.forceLogin({redirect_to: '/profile'})
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Setting up associations with the correct data
|
2
2
|
|
3
|
-
You cannot access associations directly from Cypress like you can do with
|
3
|
+
You cannot access associations directly from Cypress like you can do with Ruby tests.
|
4
4
|
So setting up associations has to be done differently from within Cypress.
|
5
5
|
|
6
6
|
There are a few ways you can setup associations with the correct data using Cypress and FactoryBot.
|
@@ -27,7 +27,7 @@ You can do the following:
|
|
27
27
|
|
28
28
|
## 1. Setting the foreign keys
|
29
29
|
|
30
|
-
factories.rb
|
30
|
+
`factories.rb`:
|
31
31
|
```rb
|
32
32
|
FactoryBot.define do
|
33
33
|
factory :author do
|
@@ -45,13 +45,13 @@ then in Cypress
|
|
45
45
|
```js
|
46
46
|
// example with overriding the defaults
|
47
47
|
cy.appFactories([['create', 'author', { name: 'James' }]]).then((records) => {
|
48
|
-
cy.appFactories([['create', 'post', { title: 'Cypress is cool', author_id: records[0].id }]]
|
49
|
-
})
|
48
|
+
cy.appFactories([['create', 'post', { title: 'Cypress is cool', author_id: records[0].id }]])
|
49
|
+
})
|
50
50
|
|
51
51
|
// example without overriding anything
|
52
52
|
cy.appFactories([['create', 'author']]).then((records) => {
|
53
|
-
cy.appFactories([['create', 'post', { author_id: records[0].id }]]
|
54
|
-
})
|
53
|
+
cy.appFactories([['create', 'post', { author_id: records[0].id }]])
|
54
|
+
})
|
55
55
|
```
|
56
56
|
|
57
57
|
## 2. Using transient attributes
|
@@ -75,10 +75,10 @@ end
|
|
75
75
|
then in Cypress
|
76
76
|
```js
|
77
77
|
// example with overriding the defaults
|
78
|
-
cy.appFactories([['create', 'post', { title: 'Cypress is cool', author_name: 'James' }]]
|
78
|
+
cy.appFactories([['create', 'post', { title: 'Cypress is cool', author_name: 'James' }]])
|
79
79
|
|
80
80
|
// example without overriding
|
81
|
-
cy.appFactories([['create', 'post']]
|
81
|
+
cy.appFactories([['create', 'post']])
|
82
82
|
```
|
83
83
|
|
84
84
|
## 3. Using Nested Attributes
|
@@ -99,11 +99,11 @@ end
|
|
99
99
|
then in Cypress
|
100
100
|
```js
|
101
101
|
// example with overriding the defaults
|
102
|
-
cy.appFactories([['create', 'post', { title: 'Cypress is cool', author_attributes: { name: 'James' } }]]
|
102
|
+
cy.appFactories([['create', 'post', { title: 'Cypress is cool', author_attributes: { name: 'James' } }]])
|
103
103
|
|
104
104
|
// example without overriding
|
105
|
-
cy.appFactories([['create', 'post']]
|
105
|
+
cy.appFactories([['create', 'post']])
|
106
106
|
|
107
107
|
// example of creating author with multiple posts
|
108
|
-
cy.appFactories([['create', 'author', { name: 'James', posts_attributes: [{ name: 'Cypress is cool' }, {name: 'Rails is awesome' }] ]]
|
108
|
+
cy.appFactories([['create', 'author', { name: 'James', posts_attributes: [{ name: 'Cypress is cool' }, {name: 'Rails is awesome' }] }]])
|
109
109
|
```
|
@@ -3,6 +3,7 @@ require 'logger'
|
|
3
3
|
module CypressOnRails
|
4
4
|
class Configuration
|
5
5
|
attr_accessor :cypress_folder
|
6
|
+
attr_accessor :api_prefix
|
6
7
|
attr_accessor :use_middleware
|
7
8
|
attr_accessor :use_vcr_middleware
|
8
9
|
attr_accessor :logger
|
@@ -16,6 +17,7 @@ module CypressOnRails
|
|
16
17
|
|
17
18
|
def reset
|
18
19
|
self.cypress_folder = 'spec/cypress'
|
20
|
+
self.api_prefix = ''
|
19
21
|
self.use_middleware = true
|
20
22
|
self.use_vcr_middleware = false
|
21
23
|
self.logger = Logger.new(STDOUT)
|
@@ -16,7 +16,7 @@ module CypressOnRails
|
|
16
16
|
|
17
17
|
def call(env)
|
18
18
|
request = Rack::Request.new(env)
|
19
|
-
if request.path.start_with?(
|
19
|
+
if request.path.start_with?("#{configuration.api_prefix}/__cypress__/command")
|
20
20
|
configuration.tagged_logged { handle_command(request) }
|
21
21
|
else
|
22
22
|
@app.call(env)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module CypressOnRails
|
2
2
|
class InstallGenerator < Rails::Generators::Base
|
3
3
|
class_option :cypress_folder, type: :string, default: 'cypress'
|
4
|
+
class_option :api_prefix, type: :string, default: ''
|
4
5
|
class_option :install_cypress, type: :boolean, default: true
|
5
6
|
class_option :install_cypress_with, type: :string, default: 'yarn'
|
6
7
|
class_option :experimental, type: :boolean, default: false
|
@@ -5,6 +5,7 @@ if defined?(CypressOnRails)
|
|
5
5
|
# please use with extra caution if enabling on hosted servers or starting your local server on 0.0.0.0
|
6
6
|
c.use_middleware = !Rails.env.production?
|
7
7
|
<% unless options.experimental %># <% end %> c.use_vcr_middleware = !Rails.env.production?
|
8
|
+
c.api_prefix = "<%= options.api_prefix %>"
|
8
9
|
c.logger = Rails.logger
|
9
10
|
end
|
10
11
|
|
@@ -5,7 +5,7 @@ module CypressOnRails
|
|
5
5
|
|
6
6
|
def update_generated_files
|
7
7
|
template "config/initializers/cypress_on_rails.rb.erb", "config/initializers/cypress_on_rails.rb"
|
8
|
-
|
8
|
+
template "spec/cypress/cypress_helper.rb.erb", "#{options.cypress_folder}/cypress_helper.rb"
|
9
9
|
copy_file "spec/cypress/support/on-rails.js", "#{options.cypress_folder}/support/on-rails.js"
|
10
10
|
directory 'spec/cypress/app_commands', "#{options.cypress_folder}/app_commands"
|
11
11
|
end
|
@@ -5,6 +5,7 @@ RSpec.describe CypressOnRails::Configuration do
|
|
5
5
|
CypressOnRails.configure { |config| config.reset }
|
6
6
|
|
7
7
|
expect(CypressOnRails.configuration.cypress_folder).to eq('spec/cypress')
|
8
|
+
expect(CypressOnRails.configuration.api_prefix).to eq('')
|
8
9
|
expect(CypressOnRails.configuration.use_middleware?).to eq(true)
|
9
10
|
expect(CypressOnRails.configuration.logger).to_not be_nil
|
10
11
|
end
|
@@ -13,10 +14,12 @@ RSpec.describe CypressOnRails::Configuration do
|
|
13
14
|
my_logger = Logger.new(STDOUT)
|
14
15
|
CypressOnRails.configure do |config|
|
15
16
|
config.cypress_folder = 'my/path'
|
17
|
+
config.api_prefix = '/api'
|
16
18
|
config.use_middleware = false
|
17
19
|
config.logger = my_logger
|
18
20
|
end
|
19
21
|
expect(CypressOnRails.configuration.cypress_folder).to eq('my/path')
|
22
|
+
expect(CypressOnRails.configuration.api_prefix).to eq('/api')
|
20
23
|
expect(CypressOnRails.configuration.use_middleware?).to eq(false)
|
21
24
|
expect(CypressOnRails.configuration.logger).to eq(my_logger)
|
22
25
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cypress-on-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- miceportal team
|
8
8
|
- Grant Petersen-Speelman
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -330,8 +330,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
330
330
|
- !ruby/object:Gem::Version
|
331
331
|
version: '0'
|
332
332
|
requirements: []
|
333
|
-
rubygems_version: 3.
|
334
|
-
signing_key:
|
333
|
+
rubygems_version: 3.4.7
|
334
|
+
signing_key:
|
335
335
|
specification_version: 4
|
336
336
|
summary: Integrates cypress with rails or rack applications
|
337
337
|
test_files: []
|