Chore: Initialize Cypress tests (#1078)
Addresses: #412 Co-authored-by: Pranav Raj S <pranav@thoughtwoot.com>
This commit is contained in:
4
spec/cypress.json
Normal file
4
spec/cypress.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"baseUrl": "http://localhost:5050",
|
||||
"defaultCommandTimeout": 10000
|
||||
}
|
||||
22
spec/cypress/app_commands/activerecord_fixtures.rb
Normal file
22
spec/cypress/app_commands/activerecord_fixtures.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
# you can delete this file if you don't use Rails Test Fixtures
|
||||
|
||||
fixtures_dir = command_options.try(:[], 'fixtures_dir')
|
||||
fixture_files = command_options.try(:[], 'fixtures')
|
||||
|
||||
if defined?(ActiveRecord)
|
||||
require 'active_record/fixtures'
|
||||
|
||||
fixtures_dir ||= ActiveRecord::Tasks::DatabaseTasks.fixtures_path
|
||||
fixture_files ||= Dir["#{fixtures_dir}/**/*.yml"].map { |f| f[(fixtures_dir.size + 1)..-5] }
|
||||
|
||||
logger.debug "loading fixtures: { dir: #{fixtures_dir}, files: #{fixture_files} }"
|
||||
ActiveRecord::FixtureSet.reset_cache
|
||||
ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
|
||||
'Fixtures Done' # this gets returned
|
||||
else # this else part can be removed
|
||||
logger.error 'Looks like activerecord_fixtures has to be modified to suite your need'
|
||||
Post.create(title: 'MyCypressFixtures')
|
||||
Post.create(title: 'MyCypressFixtures2')
|
||||
Post.create(title: 'MyRailsFixtures')
|
||||
Post.create(title: 'MyRailsFixtures2')
|
||||
end
|
||||
10
spec/cypress/app_commands/clean.rb
Normal file
10
spec/cypress/app_commands/clean.rb
Normal file
@@ -0,0 +1,10 @@
|
||||
if defined?(DatabaseCleaner)
|
||||
# cleaning the database using database_cleaner
|
||||
DatabaseCleaner.strategy = :truncation
|
||||
DatabaseCleaner.clean
|
||||
else
|
||||
logger.warn 'add database_cleaner or update cypress/app_commands/clean.rb'
|
||||
Post.delete_all if defined?(Post)
|
||||
end
|
||||
|
||||
Rails.logger.info 'APPCLEANED' # used by log_fail.rb
|
||||
1
spec/cypress/app_commands/eval.rb
Normal file
1
spec/cypress/app_commands/eval.rb
Normal file
@@ -0,0 +1 @@
|
||||
Kernel.eval(command_options) unless command_options.nil?
|
||||
12
spec/cypress/app_commands/factory_bot.rb
Normal file
12
spec/cypress/app_commands/factory_bot.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
Array.wrap(command_options).map do |factory_options|
|
||||
factory_method = factory_options.shift
|
||||
begin
|
||||
logger.debug "running #{factory_method}, #{factory_options}"
|
||||
CypressOnRails::SmartFactoryWrapper.public_send(factory_method, *factory_options)
|
||||
rescue StandardError => e
|
||||
logger.error "#{e.class}: #{e.message}"
|
||||
logger.error e.backtrace.join("\n")
|
||||
logger.error e.record.inspect.to_s if e.is_a?(ActiveRecord::RecordInvalid)
|
||||
raise e
|
||||
end
|
||||
end
|
||||
1
spec/cypress/app_commands/load_seed.rb
Normal file
1
spec/cypress/app_commands/load_seed.rb
Normal file
@@ -0,0 +1 @@
|
||||
Rails.application.load_seed
|
||||
23
spec/cypress/app_commands/log_fail.rb
Normal file
23
spec/cypress/app_commands/log_fail.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
# This file is called when a cypress spec fails and allows for extra logging to be captured
|
||||
filename = command_options.fetch('runnable_full_title', 'no title').gsub(/[^[:print:]]/, '')
|
||||
|
||||
# grab last lines until "APPCLEANED" (Make sure in clean.rb to log the text "APPCLEANED")
|
||||
system "tail -n 10000 -r log/#{Rails.env}.log | sed \"/APPCLEANED/ q\" | sed 'x;1!H;$!d;x' > 'log/#{filename}.log'"
|
||||
|
||||
# create a json debug file for server debugging
|
||||
json_result = {}
|
||||
json_result['error'] = command_options.fetch('error_message', 'no error message')
|
||||
|
||||
if defined?(ActiveRecord::Base)
|
||||
json_result['records'] =
|
||||
ActiveRecord::Base.descendants.each_with_object({}) do |record_class, records|
|
||||
records[record_class.to_s] = record_class.limit(100).map(&:attributes)
|
||||
rescue StandardError => e
|
||||
Rails.logger.info e.message
|
||||
end
|
||||
end
|
||||
|
||||
filename = command_options.fetch('runnable_full_title', 'no title').gsub(/[^[:print:]]/, '')
|
||||
File.open(Rails.root.join("log/#{filename}.json"), 'w+') do |file|
|
||||
file << JSON.pretty_generate(json_result)
|
||||
end
|
||||
1
spec/cypress/app_commands/scenarios/default.rb
Normal file
1
spec/cypress/app_commands/scenarios/default.rb
Normal file
@@ -0,0 +1 @@
|
||||
Rails.application.load_seed
|
||||
33
spec/cypress/cypress_helper.rb
Normal file
33
spec/cypress/cypress_helper.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
# This is loaded once before the first command is executed
|
||||
|
||||
begin
|
||||
require 'database_cleaner'
|
||||
rescue LoadError => e
|
||||
puts e.message
|
||||
end
|
||||
|
||||
begin
|
||||
require 'factory_bot_rails'
|
||||
rescue LoadError => e
|
||||
puts e.message
|
||||
begin
|
||||
require 'factory_girl_rails'
|
||||
rescue LoadError => e
|
||||
puts e.message
|
||||
end
|
||||
end
|
||||
|
||||
require 'cypress_on_rails/smart_factory_wrapper'
|
||||
|
||||
factory = CypressOnRails::SimpleRailsFactory
|
||||
factory = FactoryBot if defined?(FactoryBot)
|
||||
factory = FactoryGirl if defined?(FactoryGirl)
|
||||
|
||||
CypressOnRails::SmartFactoryWrapper.configure(
|
||||
always_reload: !Rails.configuration.cache_classes,
|
||||
factory: factory,
|
||||
files: [
|
||||
Rails.root.join('spec/factories.rb'),
|
||||
Rails.root.join('spec/factories/**/*.rb')
|
||||
]
|
||||
)
|
||||
@@ -0,0 +1,20 @@
|
||||
describe('AdminDashboardAuthentication', function() {
|
||||
before(() => {
|
||||
cy.app('clean');
|
||||
cy.appScenario('default')
|
||||
});
|
||||
|
||||
it('authenticates an admin ', function() {
|
||||
cy.visit('/');
|
||||
|
||||
cy.get("[data-testid='email_input']")
|
||||
.clear()
|
||||
.type('john@acme.inc');
|
||||
cy.get("[data-testid='password_input']")
|
||||
.clear()
|
||||
.type('123456');
|
||||
|
||||
cy.get("[data-testid='submit_button']").click();
|
||||
cy.contains('Conversations');
|
||||
});
|
||||
});
|
||||
21
spec/cypress/plugins/index.js
Normal file
21
spec/cypress/plugins/index.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/// <reference types="cypress" />
|
||||
// ***********************************************************
|
||||
// This example plugins/index.js can be used to load plugins
|
||||
//
|
||||
// You can change the location of this file or turn off loading
|
||||
// the plugins file with the 'pluginsFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/plugins-guide
|
||||
// ***********************************************************
|
||||
|
||||
// This function is called when a project is opened or re-opened (e.g. due to
|
||||
// the project's config changing)
|
||||
|
||||
/**
|
||||
* @type {Cypress.PluginConfig}
|
||||
*/
|
||||
module.exports = (on, config) => {
|
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
}
|
||||
25
spec/cypress/support/commands.js
Normal file
25
spec/cypress/support/commands.js
Normal file
@@ -0,0 +1,25 @@
|
||||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add("login", (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
|
||||
21
spec/cypress/support/index.js
Normal file
21
spec/cypress/support/index.js
Normal file
@@ -0,0 +1,21 @@
|
||||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
import './on-rails'
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
54
spec/cypress/support/on-rails.js
Normal file
54
spec/cypress/support/on-rails.js
Normal file
@@ -0,0 +1,54 @@
|
||||
// CypressOnRails: dont remove these command
|
||||
Cypress.Commands.add('appCommands', function (body) {
|
||||
cy.log("APP: " + JSON.stringify(body))
|
||||
return cy.request({
|
||||
method: 'POST',
|
||||
url: "/__cypress__/command",
|
||||
body: JSON.stringify(body),
|
||||
log: true,
|
||||
failOnStatusCode: true
|
||||
}).then((response) => {
|
||||
return response.body
|
||||
});
|
||||
});
|
||||
|
||||
Cypress.Commands.add('app', function (name, command_options) {
|
||||
return cy.appCommands({name: name, options: command_options}).then((body) => {
|
||||
return body[0]
|
||||
});
|
||||
});
|
||||
|
||||
Cypress.Commands.add('appScenario', function (name, options = {}) {
|
||||
return cy.app('scenarios/' + name, options)
|
||||
});
|
||||
|
||||
Cypress.Commands.add('appEval', function (code) {
|
||||
return cy.app('eval', code)
|
||||
});
|
||||
|
||||
Cypress.Commands.add('appFactories', function (options) {
|
||||
return cy.app('factory_bot', options)
|
||||
});
|
||||
|
||||
Cypress.Commands.add('appFixtures', function (options) {
|
||||
cy.app('activerecord_fixtures', options)
|
||||
});
|
||||
// CypressOnRails: end
|
||||
|
||||
// The next is optional
|
||||
// beforeEach(() => {
|
||||
// cy.app('clean') // have a look at cypress/app_commands/clean.rb
|
||||
// });
|
||||
|
||||
// comment this out if you do not want to attempt to log additional info on test fail
|
||||
Cypress.on('fail', (err, runnable) => {
|
||||
// allow app to generate additional logging data
|
||||
Cypress.$.ajax({
|
||||
url: '/__cypress__/command',
|
||||
data: JSON.stringify({name: 'log_fail', options: {error_message: err.message, runnable_full_title: runnable.fullTitle() }}),
|
||||
async: false,
|
||||
method: 'POST'
|
||||
});
|
||||
|
||||
throw err;
|
||||
});
|
||||
Reference in New Issue
Block a user