From e65ec4d9612425f1c40d57b4a0139e56e65df704 Mon Sep 17 00:00:00 2001 From: rebuilt Date: Tue, 11 Jul 2023 06:07:55 -0700 Subject: [PATCH] Added cypress to the codebase but haven't yet integrated it into workflow --- Gemfile | 4 +- Gemfile.lock | 15 +- config/environments/test.rb | 12 +- cypress.config.js | 17 + cypress/e2e/1-getting-started/todo.cy.js | 143 +++ cypress/e2e/2-advanced-examples/actions.cy.js | 299 ++++++ .../e2e/2-advanced-examples/aliasing.cy.js | 38 + .../e2e/2-advanced-examples/assertions.cy.js | 176 ++++ .../e2e/2-advanced-examples/connectors.cy.js | 98 ++ cypress/e2e/2-advanced-examples/cookies.cy.js | 118 +++ .../e2e/2-advanced-examples/cypress_api.cy.js | 185 ++++ cypress/e2e/2-advanced-examples/files.cy.js | 85 ++ .../e2e/2-advanced-examples/location.cy.js | 32 + cypress/e2e/2-advanced-examples/misc.cy.js | 104 +++ .../e2e/2-advanced-examples/navigation.cy.js | 56 ++ .../network_requests.cy.js | 163 ++++ .../e2e/2-advanced-examples/querying.cy.js | 114 +++ .../spies_stubs_clocks.cy.js | 201 ++++ cypress/e2e/2-advanced-examples/storage.cy.js | 110 +++ .../e2e/2-advanced-examples/traversal.cy.js | 121 +++ .../e2e/2-advanced-examples/utilities.cy.js | 108 +++ .../e2e/2-advanced-examples/viewport.cy.js | 59 ++ cypress/e2e/2-advanced-examples/waiting.cy.js | 31 + cypress/e2e/2-advanced-examples/window.cy.js | 22 + cypress/e2e/canary.cy.js | 5 + cypress/plugins/index.js | 14 + yarn.lock | 858 +++++++++++++++++- 27 files changed, 3160 insertions(+), 28 deletions(-) create mode 100644 cypress.config.js create mode 100644 cypress/e2e/1-getting-started/todo.cy.js create mode 100644 cypress/e2e/2-advanced-examples/actions.cy.js create mode 100644 cypress/e2e/2-advanced-examples/aliasing.cy.js create mode 100644 cypress/e2e/2-advanced-examples/assertions.cy.js create mode 100644 cypress/e2e/2-advanced-examples/connectors.cy.js create mode 100644 cypress/e2e/2-advanced-examples/cookies.cy.js create mode 100644 cypress/e2e/2-advanced-examples/cypress_api.cy.js create mode 100644 cypress/e2e/2-advanced-examples/files.cy.js create mode 100644 cypress/e2e/2-advanced-examples/location.cy.js create mode 100644 cypress/e2e/2-advanced-examples/misc.cy.js create mode 100644 cypress/e2e/2-advanced-examples/navigation.cy.js create mode 100644 cypress/e2e/2-advanced-examples/network_requests.cy.js create mode 100644 cypress/e2e/2-advanced-examples/querying.cy.js create mode 100644 cypress/e2e/2-advanced-examples/spies_stubs_clocks.cy.js create mode 100644 cypress/e2e/2-advanced-examples/storage.cy.js create mode 100644 cypress/e2e/2-advanced-examples/traversal.cy.js create mode 100644 cypress/e2e/2-advanced-examples/utilities.cy.js create mode 100644 cypress/e2e/2-advanced-examples/viewport.cy.js create mode 100644 cypress/e2e/2-advanced-examples/waiting.cy.js create mode 100644 cypress/e2e/2-advanced-examples/window.cy.js create mode 100644 cypress/e2e/canary.cy.js create mode 100644 cypress/plugins/index.js diff --git a/Gemfile b/Gemfile index 63b2a195..4c0027f2 100644 --- a/Gemfile +++ b/Gemfile @@ -40,8 +40,6 @@ gem "devise" gem "omniauth" -gem "twilio-ruby", "~> 4.11.1" - gem "activerecord-import" gem "jsbundling-rails" @@ -63,6 +61,8 @@ gem "standard_deviation" group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem "byebug", platform: :mri + gem "cypress-rails" + gem "dotenv-rails" gem "factory_bot_rails" gem "parallel_tests" gem "rack-mini-profiler" diff --git a/Gemfile.lock b/Gemfile.lock index 82eb7eac..51e23957 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -108,6 +108,9 @@ GEM cuprite (0.14.3) capybara (~> 3.0) ferrum (~> 0.13.0) + cypress-rails (0.6.0) + puma (>= 3.8.0) + railties (>= 5.2.0) database_cleaner (2.0.2) database_cleaner-active_record (>= 2, < 3) database_cleaner-active_record (2.1.0) @@ -123,6 +126,10 @@ GEM warden (~> 1.2.3) diff-lcs (1.5.0) docile (1.4.0) + dotenv (2.8.1) + dotenv-rails (2.8.1) + dotenv (= 2.8.1) + railties (>= 3.2) e2mmap (0.1.0) ed25519 (1.3.0) em-websocket (0.5.3) @@ -194,7 +201,6 @@ GEM jsbundling-rails (1.1.1) railties (>= 6.0.0) json (2.6.3) - jwt (1.5.6) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) @@ -414,10 +420,6 @@ GEM actionpack (>= 6.0.0) activejob (>= 6.0.0) railties (>= 6.0.0) - twilio-ruby (4.11.1) - builder (>= 2.1.2) - jwt (~> 1.0) - multi_json (>= 1.3.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uglifier (4.2.0) @@ -459,8 +461,10 @@ DEPENDENCIES capybara cssbundling-rails cuprite + cypress-rails database_cleaner devise + dotenv-rails ed25519 erb_lint erblint-github @@ -500,7 +504,6 @@ DEPENDENCIES stimulus-rails timecop turbo-rails - twilio-ruby (~> 4.11.1) tzinfo-data uglifier (>= 1.3.0) watir diff --git a/config/environments/test.rb b/config/environments/test.rb index 54e083ad..668d20cb 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -13,7 +13,7 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. config.cache_classes = false - config.action_view.cache_template_loading = true + config.action_view.cache_template_loading = false # Do not eager load code on boot. This avoids loading your whole application # just for the purpose of running a single test. If you are using a tool that @@ -23,11 +23,11 @@ Rails.application.configure do # Configure public file server for tests with Cache-Control for performance. config.public_file_server.enabled = true config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + "Cache-Control" => "public, max-age=#{1.hour.to_i}" } # Show full error reports and disable caching. - config.consider_all_requests_local = true + config.consider_all_requests_local = true config.action_controller.perform_caching = false config.cache_store = :null_store @@ -55,7 +55,7 @@ Rails.application.configure do config.action_controller.include_all_helpers = false - config.active_record.encryption.primary_key = 'test' - config.active_record.encryption.deterministic_key = 'test' - config.active_record.encryption.key_derivation_salt = 'test' + config.active_record.encryption.primary_key = "test" + config.active_record.encryption.deterministic_key = "test" + config.active_record.encryption.key_derivation_salt = "test" end diff --git a/cypress.config.js b/cypress.config.js new file mode 100644 index 00000000..4cc7b56e --- /dev/null +++ b/cypress.config.js @@ -0,0 +1,17 @@ +const { defineConfig } = require('cypress') + +module.exports = defineConfig({ + // setupNodeEvents can be defined in either + // the e2e or component configuration + e2e: { + setupNodeEvents(on, config) { + on('before:browser:launch', (browser = {}, launchOptions) => { + /* ... */ + }) + }, + supportFile: false + }, + screenshotsFolder: "tmp/cypress_screenshots", + videosFolder: "tmp/cypress_videos", + trashAssetsBeforeRuns: false +}) diff --git a/cypress/e2e/1-getting-started/todo.cy.js b/cypress/e2e/1-getting-started/todo.cy.js new file mode 100644 index 00000000..4768ff92 --- /dev/null +++ b/cypress/e2e/1-getting-started/todo.cy.js @@ -0,0 +1,143 @@ +/// + +// Welcome to Cypress! +// +// This spec file contains a variety of sample tests +// for a todo list app that are designed to demonstrate +// the power of writing tests in Cypress. +// +// To learn more about how Cypress works and +// what makes it such an awesome testing tool, +// please read our getting started guide: +// https://on.cypress.io/introduction-to-cypress + +describe('example to-do app', () => { + beforeEach(() => { + // Cypress starts out with a blank slate for each test + // so we must tell it to visit our website with the `cy.visit()` command. + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + cy.visit('https://example.cypress.io/todo') + }) + + it('displays two todo items by default', () => { + // We use the `cy.get()` command to get all elements that match the selector. + // Then, we use `should` to assert that there are two matched items, + // which are the two default items. + cy.get('.todo-list li').should('have.length', 2) + + // We can go even further and check that the default todos each contain + // the correct text. We use the `first` and `last` functions + // to get just the first and last matched elements individually, + // and then perform an assertion with `should`. + cy.get('.todo-list li').first().should('have.text', 'Pay electric bill') + cy.get('.todo-list li').last().should('have.text', 'Walk the dog') + }) + + it('can add new todo items', () => { + // We'll store our item text in a variable so we can reuse it + const newItem = 'Feed the cat' + + // Let's get the input element and use the `type` command to + // input our new list item. After typing the content of our item, + // we need to type the enter key as well in order to submit the input. + // This input has a data-test attribute so we'll use that to select the + // element in accordance with best practices: + // https://on.cypress.io/selecting-elements + cy.get('[data-test=new-todo]').type(`${newItem}{enter}`) + + // Now that we've typed our new item, let's check that it actually was added to the list. + // Since it's the newest item, it should exist as the last element in the list. + // In addition, with the two default items, we should have a total of 3 elements in the list. + // Since assertions yield the element that was asserted on, + // we can chain both of these assertions together into a single statement. + cy.get('.todo-list li') + .should('have.length', 3) + .last() + .should('have.text', newItem) + }) + + it('can check off an item as completed', () => { + // In addition to using the `get` command to get an element by selector, + // we can also use the `contains` command to get an element by its contents. + // However, this will yield the