From 5cece6ab854b37c55f672c7500f4934735aaa677 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Wed, 4 Sep 2019 14:06:52 -0700 Subject: [PATCH 01/12] added new petergate test and commented out code in gemfile --- .ruby-version | 1 - Gemfile | 80 ++--- petergate_test/.gitignore | 31 ++ petergate_test/.ruby-version | 1 + petergate_test/Gemfile | 64 ++++ petergate_test/README.md | 24 ++ petergate_test/Rakefile | 6 + petergate_test/app/assets/config/manifest.js | 3 + petergate_test/app/assets/images/.keep | 0 .../app/assets/javascripts/application.js | 16 + .../app/assets/javascripts/cable.js | 13 + .../app/assets/javascripts/channels/.keep | 0 .../app/assets/stylesheets/application.css | 15 + .../app/channels/application_cable/channel.rb | 4 + .../channels/application_cable/connection.rb | 4 + .../app/controllers/application_controller.rb | 2 + .../app/controllers/blogs_controller.rb | 75 +++++ petergate_test/app/controllers/concerns/.keep | 0 .../app/controllers/inheritance_controller.rb | 3 + .../app/helpers/application_helper.rb | 2 + petergate_test/app/jobs/application_job.rb | 2 + .../app/mailers/application_mailer.rb | 4 + .../app/models/application_record.rb | 3 + petergate_test/app/models/blog.rb | 3 + petergate_test/app/models/concerns/.keep | 0 petergate_test/app/models/user.rb | 16 + petergate_test/app/views/blogs/_form.html.erb | 25 ++ petergate_test/app/views/blogs/edit.html.erb | 6 + petergate_test/app/views/blogs/index.html.erb | 27 ++ .../app/views/blogs/index.json.jbuilder | 4 + petergate_test/app/views/blogs/new.html.erb | 5 + petergate_test/app/views/blogs/show.html.erb | 14 + .../app/views/blogs/show.json.jbuilder | 1 + .../app/views/layouts/application.html.erb | 17 + .../app/views/layouts/mailer.html.erb | 13 + .../app/views/layouts/mailer.text.erb | 1 + petergate_test/bin/bundle | 3 + petergate_test/bin/rails | 9 + petergate_test/bin/rake | 9 + petergate_test/bin/setup | 36 +++ petergate_test/bin/spring | 17 + petergate_test/bin/update | 31 ++ petergate_test/bin/yarn | 11 + petergate_test/config.ru | 5 + petergate_test/config/application.rb | 19 ++ petergate_test/config/boot.rb | 4 + petergate_test/config/cable.yml | 10 + petergate_test/config/credentials.yml.enc | 1 + petergate_test/config/database.yml | 25 ++ petergate_test/config/environment.rb | 5 + .../config/environments/development.rb | 62 ++++ .../config/environments/production.rb | 94 ++++++ petergate_test/config/environments/test.rb | 46 +++ .../application_controller_renderer.rb | 8 + petergate_test/config/initializers/assets.rb | 14 + .../initializers/backtrace_silencers.rb | 7 + .../initializers/content_security_policy.rb | 25 ++ .../config/initializers/cookies_serializer.rb | 5 + petergate_test/config/initializers/devise.rb | 299 ++++++++++++++++++ .../initializers/filter_parameter_logging.rb | 4 + .../config/initializers/inflections.rb | 16 + .../config/initializers/mime_types.rb | 4 + .../config/initializers/wrap_parameters.rb | 14 + petergate_test/config/locales/devise.en.yml | 65 ++++ petergate_test/config/locales/en.yml | 33 ++ petergate_test/config/puma.rb | 34 ++ petergate_test/config/routes.rb | 60 ++++ petergate_test/config/spring.rb | 6 + petergate_test/config/storage.yml | 34 ++ .../db/migrate/20141117063228_create_blogs.rb | 10 + .../20141117064643_devise_create_users.rb | 42 +++ .../20141117064807_add_roles_to_users.rb | 5 + petergate_test/db/schema.rb | 40 +++ petergate_test/db/seeds.rb | 7 + petergate_test/lib/assets/.keep | 0 petergate_test/lib/tasks/.keep | 0 petergate_test/log/.keep | 0 petergate_test/package.json | 5 + petergate_test/public/404.html | 67 ++++ petergate_test/public/422.html | 67 ++++ petergate_test/public/500.html | 66 ++++ .../public/apple-touch-icon-precomposed.png | 0 petergate_test/public/apple-touch-icon.png | 0 petergate_test/public/favicon.ico | 0 petergate_test/public/robots.txt | 1 + petergate_test/storage/.keep | 0 .../test/application_system_test_case.rb | 5 + petergate_test/test/controllers/.keep | 0 petergate_test/test/fixtures/.keep | 0 petergate_test/test/fixtures/files/.keep | 0 petergate_test/test/helpers/.keep | 0 petergate_test/test/integration/.keep | 0 petergate_test/test/mailers/.keep | 0 petergate_test/test/models/.keep | 0 petergate_test/test/system/.keep | 0 petergate_test/test/test_helper.rb | 10 + petergate_test/tmp/.keep | 0 petergate_test/vendor/.keep | 0 98 files changed, 1784 insertions(+), 41 deletions(-) delete mode 100644 .ruby-version create mode 100644 petergate_test/.gitignore create mode 100644 petergate_test/.ruby-version create mode 100644 petergate_test/Gemfile create mode 100644 petergate_test/README.md create mode 100644 petergate_test/Rakefile create mode 100644 petergate_test/app/assets/config/manifest.js create mode 100644 petergate_test/app/assets/images/.keep create mode 100644 petergate_test/app/assets/javascripts/application.js create mode 100644 petergate_test/app/assets/javascripts/cable.js create mode 100644 petergate_test/app/assets/javascripts/channels/.keep create mode 100644 petergate_test/app/assets/stylesheets/application.css create mode 100644 petergate_test/app/channels/application_cable/channel.rb create mode 100644 petergate_test/app/channels/application_cable/connection.rb create mode 100644 petergate_test/app/controllers/application_controller.rb create mode 100644 petergate_test/app/controllers/blogs_controller.rb create mode 100644 petergate_test/app/controllers/concerns/.keep create mode 100644 petergate_test/app/controllers/inheritance_controller.rb create mode 100644 petergate_test/app/helpers/application_helper.rb create mode 100644 petergate_test/app/jobs/application_job.rb create mode 100644 petergate_test/app/mailers/application_mailer.rb create mode 100644 petergate_test/app/models/application_record.rb create mode 100644 petergate_test/app/models/blog.rb create mode 100644 petergate_test/app/models/concerns/.keep create mode 100644 petergate_test/app/models/user.rb create mode 100644 petergate_test/app/views/blogs/_form.html.erb create mode 100644 petergate_test/app/views/blogs/edit.html.erb create mode 100644 petergate_test/app/views/blogs/index.html.erb create mode 100644 petergate_test/app/views/blogs/index.json.jbuilder create mode 100644 petergate_test/app/views/blogs/new.html.erb create mode 100644 petergate_test/app/views/blogs/show.html.erb create mode 100644 petergate_test/app/views/blogs/show.json.jbuilder create mode 100644 petergate_test/app/views/layouts/application.html.erb create mode 100644 petergate_test/app/views/layouts/mailer.html.erb create mode 100644 petergate_test/app/views/layouts/mailer.text.erb create mode 100755 petergate_test/bin/bundle create mode 100755 petergate_test/bin/rails create mode 100755 petergate_test/bin/rake create mode 100755 petergate_test/bin/setup create mode 100755 petergate_test/bin/spring create mode 100755 petergate_test/bin/update create mode 100755 petergate_test/bin/yarn create mode 100644 petergate_test/config.ru create mode 100644 petergate_test/config/application.rb create mode 100644 petergate_test/config/boot.rb create mode 100644 petergate_test/config/cable.yml create mode 100644 petergate_test/config/credentials.yml.enc create mode 100644 petergate_test/config/database.yml create mode 100644 petergate_test/config/environment.rb create mode 100644 petergate_test/config/environments/development.rb create mode 100644 petergate_test/config/environments/production.rb create mode 100644 petergate_test/config/environments/test.rb create mode 100644 petergate_test/config/initializers/application_controller_renderer.rb create mode 100644 petergate_test/config/initializers/assets.rb create mode 100644 petergate_test/config/initializers/backtrace_silencers.rb create mode 100644 petergate_test/config/initializers/content_security_policy.rb create mode 100644 petergate_test/config/initializers/cookies_serializer.rb create mode 100644 petergate_test/config/initializers/devise.rb create mode 100644 petergate_test/config/initializers/filter_parameter_logging.rb create mode 100644 petergate_test/config/initializers/inflections.rb create mode 100644 petergate_test/config/initializers/mime_types.rb create mode 100644 petergate_test/config/initializers/wrap_parameters.rb create mode 100644 petergate_test/config/locales/devise.en.yml create mode 100644 petergate_test/config/locales/en.yml create mode 100644 petergate_test/config/puma.rb create mode 100644 petergate_test/config/routes.rb create mode 100644 petergate_test/config/spring.rb create mode 100644 petergate_test/config/storage.yml create mode 100644 petergate_test/db/migrate/20141117063228_create_blogs.rb create mode 100644 petergate_test/db/migrate/20141117064643_devise_create_users.rb create mode 100644 petergate_test/db/migrate/20141117064807_add_roles_to_users.rb create mode 100644 petergate_test/db/schema.rb create mode 100644 petergate_test/db/seeds.rb create mode 100644 petergate_test/lib/assets/.keep create mode 100644 petergate_test/lib/tasks/.keep create mode 100644 petergate_test/log/.keep create mode 100644 petergate_test/package.json create mode 100644 petergate_test/public/404.html create mode 100644 petergate_test/public/422.html create mode 100644 petergate_test/public/500.html create mode 100644 petergate_test/public/apple-touch-icon-precomposed.png create mode 100644 petergate_test/public/apple-touch-icon.png create mode 100644 petergate_test/public/favicon.ico create mode 100644 petergate_test/public/robots.txt create mode 100644 petergate_test/storage/.keep create mode 100644 petergate_test/test/application_system_test_case.rb create mode 100644 petergate_test/test/controllers/.keep create mode 100644 petergate_test/test/fixtures/.keep create mode 100644 petergate_test/test/fixtures/files/.keep create mode 100644 petergate_test/test/helpers/.keep create mode 100644 petergate_test/test/integration/.keep create mode 100644 petergate_test/test/mailers/.keep create mode 100644 petergate_test/test/models/.keep create mode 100644 petergate_test/test/system/.keep create mode 100644 petergate_test/test/test_helper.rb create mode 100644 petergate_test/tmp/.keep create mode 100644 petergate_test/vendor/.keep diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index 2bf1c1c..0000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.3.1 diff --git a/Gemfile b/Gemfile index 76716f5..c3c7236 100644 --- a/Gemfile +++ b/Gemfile @@ -1,45 +1,45 @@ source 'https://rubygems.org' -ruby '2.3.1' +# ruby '2.3.1' # Specify your gem's dependencies in petergate.gemspec gemspec # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 4.2.7.1' - -# Use sqlite3 as the database for Active Record -gem 'sqlite3' -# Use SCSS for stylesheets -gem 'sass-rails', '~> 4.0.3' -# Use Uglifier as compressor for JavaScript assets -gem 'uglifier', '>= 1.3.0' -# Use CoffeeScript for .js.coffee assets and views -gem 'coffee-rails', '~> 4.0.0' -# See https://github.com/sstephenson/execjs#readme for more supported runtimes -# gem 'therubyracer', platforms: :ruby - -# Use jquery as the JavaScript library -gem 'jquery-rails' -# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks -gem 'turbolinks' -gem "minitest-rails" -gem "minitest-reporters" -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.0' -# bundle exec rake doc:rails generates the API under doc/api. -gem 'sdoc', '~> 0.4.0', group: :doc - -# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring -gem 'devise' - -# Use ActiveModel has_secure_password -# gem 'bcrypt', '~> 3.1.7' - -# Use unicorn as the app server -# gem 'unicorn' - -# Use Capistrano for deployment -# gem 'capistrano-rails', group: :development - -# Use debugger -# gem 'debugger', group: [:development, :test] - +# gem 'rails', '~> 4.2.7.1' +# +# # Use sqlite3 as the database for Active Record +# gem 'sqlite3' +# # Use SCSS for stylesheets +# gem 'sass-rails', '~> 4.0.3' +# # Use Uglifier as compressor for JavaScript assets +# gem 'uglifier', '>= 1.3.0' +# # Use CoffeeScript for .js.coffee assets and views +# gem 'coffee-rails', '~> 4.0.0' +# # See https://github.com/sstephenson/execjs#readme for more supported runtimes +# # gem 'therubyracer', platforms: :ruby +# +# # Use jquery as the JavaScript library +# gem 'jquery-rails' +# # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks +# gem 'turbolinks' +# gem "minitest-rails" +# gem "minitest-reporters" +# # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +# gem 'jbuilder', '~> 2.0' +# # bundle exec rake doc:rails generates the API under doc/api. +# gem 'sdoc', '~> 0.4.0', group: :doc +# +# # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring +# gem 'devise' +# +# # Use ActiveModel has_secure_password +# # gem 'bcrypt', '~> 3.1.7' +# +# # Use unicorn as the app server +# # gem 'unicorn' +# +# # Use Capistrano for deployment +# # gem 'capistrano-rails', group: :development +# +# # Use debugger +# # gem 'debugger', group: [:development, :test] +# diff --git a/petergate_test/.gitignore b/petergate_test/.gitignore new file mode 100644 index 0000000..81452db --- /dev/null +++ b/petergate_test/.gitignore @@ -0,0 +1,31 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore the default SQLite database. +/db/*.sqlite3 +/db/*.sqlite3-journal + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore uploaded files in development +/storage/* +!/storage/.keep + +/node_modules +/yarn-error.log + +/public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/petergate_test/.ruby-version b/petergate_test/.ruby-version new file mode 100644 index 0000000..4fd0fe3 --- /dev/null +++ b/petergate_test/.ruby-version @@ -0,0 +1 @@ +2.5.1 \ No newline at end of file diff --git a/petergate_test/Gemfile b/petergate_test/Gemfile new file mode 100644 index 0000000..043ff8f --- /dev/null +++ b/petergate_test/Gemfile @@ -0,0 +1,64 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.5.1' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.2' +# Use sqlite3 as the database for Active Record +gem 'sqlite3' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'mini_racer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false +gem 'devise' +gem 'petergate', path: '../' + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of chromedriver to run system tests with Chrome + gem 'chromedriver-helper' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/petergate_test/README.md b/petergate_test/README.md new file mode 100644 index 0000000..7db80e4 --- /dev/null +++ b/petergate_test/README.md @@ -0,0 +1,24 @@ +# README + +This README would normally document whatever steps are necessary to get the +application up and running. + +Things you may want to cover: + +* Ruby version + +* System dependencies + +* Configuration + +* Database creation + +* Database initialization + +* How to run the test suite + +* Services (job queues, cache servers, search engines, etc.) + +* Deployment instructions + +* ... diff --git a/petergate_test/Rakefile b/petergate_test/Rakefile new file mode 100644 index 0000000..e85f913 --- /dev/null +++ b/petergate_test/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/petergate_test/app/assets/config/manifest.js b/petergate_test/app/assets/config/manifest.js new file mode 100644 index 0000000..b16e53d --- /dev/null +++ b/petergate_test/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/petergate_test/app/assets/images/.keep b/petergate_test/app/assets/images/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/assets/javascripts/application.js b/petergate_test/app/assets/javascripts/application.js new file mode 100644 index 0000000..82e6f0f --- /dev/null +++ b/petergate_test/app/assets/javascripts/application.js @@ -0,0 +1,16 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's +// vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require rails-ujs +//= require activestorage +//= require turbolinks +//= require_tree . diff --git a/petergate_test/app/assets/javascripts/cable.js b/petergate_test/app/assets/javascripts/cable.js new file mode 100644 index 0000000..739aa5f --- /dev/null +++ b/petergate_test/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/petergate_test/app/assets/javascripts/channels/.keep b/petergate_test/app/assets/javascripts/channels/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/assets/stylesheets/application.css b/petergate_test/app/assets/stylesheets/application.css new file mode 100644 index 0000000..d05ea0f --- /dev/null +++ b/petergate_test/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/petergate_test/app/channels/application_cable/channel.rb b/petergate_test/app/channels/application_cable/channel.rb new file mode 100644 index 0000000..d672697 --- /dev/null +++ b/petergate_test/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/petergate_test/app/channels/application_cable/connection.rb b/petergate_test/app/channels/application_cable/connection.rb new file mode 100644 index 0000000..0ff5442 --- /dev/null +++ b/petergate_test/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/petergate_test/app/controllers/application_controller.rb b/petergate_test/app/controllers/application_controller.rb new file mode 100644 index 0000000..09705d1 --- /dev/null +++ b/petergate_test/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/petergate_test/app/controllers/blogs_controller.rb b/petergate_test/app/controllers/blogs_controller.rb new file mode 100644 index 0000000..d51481f --- /dev/null +++ b/petergate_test/app/controllers/blogs_controller.rb @@ -0,0 +1,75 @@ +class BlogsController < InheritanceController + before_action :set_blog, only: [:show, :edit, :update, :destroy] + # access all: [:index], user: [:index, :show], company_admin: {except: [:destroy]} + + # GET /blogs + # GET /blogs.json + def index + @blogs = Blog.all + end + + # GET /blogs/1 + # GET /blogs/1.json + def show + end + + # GET /blogs/new + def new + @blog = Blog.new + end + + # GET /blogs/1/edit + def edit + end + + # POST /blogs + # POST /blogs.json + def create + @blog = Blog.new(blog_params) + + respond_to do |format| + if @blog.save + format.html { redirect_to @blog, notice: 'Blog was successfully created.' } + format.json { render :show, status: :created, location: @blog } + else + format.html { render :new } + format.json { render json: @blog.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /blogs/1 + # PATCH/PUT /blogs/1.json + def update + respond_to do |format| + if @blog.update(blog_params) + format.html { redirect_to @blog, notice: 'Blog was successfully updated.' } + format.json { render :show, status: :ok, location: @blog } + else + format.html { render :edit } + format.json { render json: @blog.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /blogs/1 + # DELETE /blogs/1.json + def destroy + @blog.destroy + respond_to do |format| + format.html { redirect_to blogs_url, notice: 'Blog was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_blog + @blog = Blog.find(params[:id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def blog_params + params.require(:blog).permit(:title, :content) + end +end diff --git a/petergate_test/app/controllers/concerns/.keep b/petergate_test/app/controllers/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/controllers/inheritance_controller.rb b/petergate_test/app/controllers/inheritance_controller.rb new file mode 100644 index 0000000..95db07e --- /dev/null +++ b/petergate_test/app/controllers/inheritance_controller.rb @@ -0,0 +1,3 @@ +class InheritanceController < ApplicationController + access all: [:index], user: [:index, :show], company_admin: {except: [:destroy]} +end diff --git a/petergate_test/app/helpers/application_helper.rb b/petergate_test/app/helpers/application_helper.rb new file mode 100644 index 0000000..de6be79 --- /dev/null +++ b/petergate_test/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/petergate_test/app/jobs/application_job.rb b/petergate_test/app/jobs/application_job.rb new file mode 100644 index 0000000..a009ace --- /dev/null +++ b/petergate_test/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/petergate_test/app/mailers/application_mailer.rb b/petergate_test/app/mailers/application_mailer.rb new file mode 100644 index 0000000..286b223 --- /dev/null +++ b/petergate_test/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/petergate_test/app/models/application_record.rb b/petergate_test/app/models/application_record.rb new file mode 100644 index 0000000..10a4cba --- /dev/null +++ b/petergate_test/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/petergate_test/app/models/blog.rb b/petergate_test/app/models/blog.rb new file mode 100644 index 0000000..0fcce79 --- /dev/null +++ b/petergate_test/app/models/blog.rb @@ -0,0 +1,3 @@ +class Blog < ApplicationRecord +end + diff --git a/petergate_test/app/models/concerns/.keep b/petergate_test/app/models/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/models/user.rb b/petergate_test/app/models/user.rb new file mode 100644 index 0000000..c74a793 --- /dev/null +++ b/petergate_test/app/models/user.rb @@ -0,0 +1,16 @@ +class User < ApplicationRecord + ############################################################################################ + ## PeterGate Roles ## + ## The :user role is added by default and shouldn't be included in this list. ## + ## The :root_admin can access any page regardless of access settings. Use with caution! ## + ## The multiple option can be set to true if you need users to have multiple roles. ## + petergate(roles: [:root_admin, :company_admin], multiple: true) ## + ############################################################################################ + + + # Include default devise modules. Others available are: + # :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :trackable, :validatable +end + diff --git a/petergate_test/app/views/blogs/_form.html.erb b/petergate_test/app/views/blogs/_form.html.erb new file mode 100644 index 0000000..22cebc9 --- /dev/null +++ b/petergate_test/app/views/blogs/_form.html.erb @@ -0,0 +1,25 @@ +<%= form_for(@blog) do |f| %> + <% if @blog.errors.any? %> +
+

<%= pluralize(@blog.errors.count, "error") %> prohibited this blog from being saved:

+ + +
+ <% end %> + +
+ <%= f.label :title %>
+ <%= f.text_field :title %> +
+
+ <%= f.label :content %>
+ <%= f.text_area :content %> +
+
+ <%= f.submit %> +
+<% end %> diff --git a/petergate_test/app/views/blogs/edit.html.erb b/petergate_test/app/views/blogs/edit.html.erb new file mode 100644 index 0000000..567dea1 --- /dev/null +++ b/petergate_test/app/views/blogs/edit.html.erb @@ -0,0 +1,6 @@ +

Editing blog

+ +<%= render 'form' %> + +<%= link_to 'Show', @blog %> | +<%= link_to 'Back', blogs_path %> diff --git a/petergate_test/app/views/blogs/index.html.erb b/petergate_test/app/views/blogs/index.html.erb new file mode 100644 index 0000000..975e0b5 --- /dev/null +++ b/petergate_test/app/views/blogs/index.html.erb @@ -0,0 +1,27 @@ +

Listing blogs

+ + + + + + + + + + + + <% @blogs.each do |blog| %> + + + + + + + + <% end %> + +
TitleContent
<%= blog.title %><%= blog.content %><%= link_to 'Show', blog %><%= link_to 'Edit', edit_blog_path(blog) %><%= link_to 'Destroy', blog, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New Blog', new_blog_path %> diff --git a/petergate_test/app/views/blogs/index.json.jbuilder b/petergate_test/app/views/blogs/index.json.jbuilder new file mode 100644 index 0000000..6ad723c --- /dev/null +++ b/petergate_test/app/views/blogs/index.json.jbuilder @@ -0,0 +1,4 @@ +json.array!(@blogs) do |blog| + json.extract! blog, :id, :title, :content + json.url blog_url(blog, format: :json) +end diff --git a/petergate_test/app/views/blogs/new.html.erb b/petergate_test/app/views/blogs/new.html.erb new file mode 100644 index 0000000..842f418 --- /dev/null +++ b/petergate_test/app/views/blogs/new.html.erb @@ -0,0 +1,5 @@ +

New blog

+ +<%= render 'form' %> + +<%= link_to 'Back', blogs_path %> diff --git a/petergate_test/app/views/blogs/show.html.erb b/petergate_test/app/views/blogs/show.html.erb new file mode 100644 index 0000000..834f127 --- /dev/null +++ b/petergate_test/app/views/blogs/show.html.erb @@ -0,0 +1,14 @@ +

<%= notice %>

+ +

+ Title: + <%= @blog.title %> +

+ +

+ Content: + <%= @blog.content %> +

+ +<%= link_to 'Edit', edit_blog_path(@blog) %> | +<%= link_to 'Back', blogs_path %> diff --git a/petergate_test/app/views/blogs/show.json.jbuilder b/petergate_test/app/views/blogs/show.json.jbuilder new file mode 100644 index 0000000..c324ac2 --- /dev/null +++ b/petergate_test/app/views/blogs/show.json.jbuilder @@ -0,0 +1 @@ +json.extract! @blog, :id, :title, :content, :created_at, :updated_at diff --git a/petergate_test/app/views/layouts/application.html.erb b/petergate_test/app/views/layouts/application.html.erb new file mode 100644 index 0000000..4064847 --- /dev/null +++ b/petergate_test/app/views/layouts/application.html.erb @@ -0,0 +1,17 @@ + + + + PetergateTest + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + +

<%= notice %>

+

<%= alert %>

+ <%= yield %> + + diff --git a/petergate_test/app/views/layouts/mailer.html.erb b/petergate_test/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000..cbd34d2 --- /dev/null +++ b/petergate_test/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/petergate_test/app/views/layouts/mailer.text.erb b/petergate_test/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000..37f0bdd --- /dev/null +++ b/petergate_test/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/petergate_test/bin/bundle b/petergate_test/bin/bundle new file mode 100755 index 0000000..f19acf5 --- /dev/null +++ b/petergate_test/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +load Gem.bin_path('bundler', 'bundle') diff --git a/petergate_test/bin/rails b/petergate_test/bin/rails new file mode 100755 index 0000000..5badb2f --- /dev/null +++ b/petergate_test/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/petergate_test/bin/rake b/petergate_test/bin/rake new file mode 100755 index 0000000..d87d5f5 --- /dev/null +++ b/petergate_test/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/petergate_test/bin/setup b/petergate_test/bin/setup new file mode 100755 index 0000000..94fd4d7 --- /dev/null +++ b/petergate_test/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/petergate_test/bin/spring b/petergate_test/bin/spring new file mode 100755 index 0000000..d89ee49 --- /dev/null +++ b/petergate_test/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads Spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == 'spring' } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/petergate_test/bin/update b/petergate_test/bin/update new file mode 100755 index 0000000..58bfaed --- /dev/null +++ b/petergate_test/bin/update @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/petergate_test/bin/yarn b/petergate_test/bin/yarn new file mode 100755 index 0000000..460dd56 --- /dev/null +++ b/petergate_test/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/petergate_test/config.ru b/petergate_test/config.ru new file mode 100644 index 0000000..f7ba0b5 --- /dev/null +++ b/petergate_test/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/petergate_test/config/application.rb b/petergate_test/config/application.rb new file mode 100644 index 0000000..5593023 --- /dev/null +++ b/petergate_test/config/application.rb @@ -0,0 +1,19 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module PetergateTest + class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.2 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + end +end diff --git a/petergate_test/config/boot.rb b/petergate_test/config/boot.rb new file mode 100644 index 0000000..b9e460c --- /dev/null +++ b/petergate_test/config/boot.rb @@ -0,0 +1,4 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/petergate_test/config/cable.yml b/petergate_test/config/cable.yml new file mode 100644 index 0000000..e92422f --- /dev/null +++ b/petergate_test/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: petergate_test_production diff --git a/petergate_test/config/credentials.yml.enc b/petergate_test/config/credentials.yml.enc new file mode 100644 index 0000000..352bbd5 --- /dev/null +++ b/petergate_test/config/credentials.yml.enc @@ -0,0 +1 @@ +bdEHtHG0qweH4Gtiyrsg3FK/W5oo6Ny/nt7Dx5m7fXTFkPIDK8D15PLrl1iYD72npW50KhUY8IJFoTPQXbAmi0nQ0fPC3WSnpJfTU9Jb2VIP8rbAzqsTTAlaYLFkj0zp/0VmF2W0nOqOKgNx6siUhZo4Pa9b7+RVPHHIONm8oJM/uKS7h4ZCciCWN4cvB001hjNp1fhqbu2P0XTNdPV/kfwvEH+sZwhdyF+otCVtcnfYI1dCk7gtRGcSJ0RreV1EsqRvSDSQXmPepelytbcL6aNerNteIZefYodwRl/a7fGLV13cSnALmf6m3LNOReOisBfSj25/g9UseVYPNzNQhGMiIQ098/HuYJ9qvFo9YsMiIqUDtWhODBFM+FJ5PkEXZPaTYpC5Q11SJ3tni6ym5CijsdwHglRTOPo5--n3H7WcTrQAVwaNRu--GKpIvDJDuK2ccKAqch+BgA== \ No newline at end of file diff --git a/petergate_test/config/database.yml b/petergate_test/config/database.yml new file mode 100644 index 0000000..0d02f24 --- /dev/null +++ b/petergate_test/config/database.yml @@ -0,0 +1,25 @@ +# SQLite version 3.x +# gem install sqlite3 +# +# Ensure the SQLite 3 gem is defined in your Gemfile +# gem 'sqlite3' +# +default: &default + adapter: sqlite3 + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + timeout: 5000 + +development: + <<: *default + database: db/development.sqlite3 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: db/test.sqlite3 + +production: + <<: *default + database: db/production.sqlite3 diff --git a/petergate_test/config/environment.rb b/petergate_test/config/environment.rb new file mode 100644 index 0000000..426333b --- /dev/null +++ b/petergate_test/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/petergate_test/config/environments/development.rb b/petergate_test/config/environments/development.rb new file mode 100644 index 0000000..208b2dd --- /dev/null +++ b/petergate_test/config/environments/development.rb @@ -0,0 +1,62 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/petergate_test/config/environments/production.rb b/petergate_test/config/environments/production.rb new file mode 100644 index 0000000..a25cb75 --- /dev/null +++ b/petergate_test/config/environments/production.rb @@ -0,0 +1,94 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "petergate_test_#{Rails.env}" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/petergate_test/config/environments/test.rb b/petergate_test/config/environments/test.rb new file mode 100644 index 0000000..0a38fd3 --- /dev/null +++ b/petergate_test/config/environments/test.rb @@ -0,0 +1,46 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # 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 + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # 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}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/petergate_test/config/initializers/application_controller_renderer.rb b/petergate_test/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000..89d2efa --- /dev/null +++ b/petergate_test/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/petergate_test/config/initializers/assets.rb b/petergate_test/config/initializers/assets.rb new file mode 100644 index 0000000..4b828e8 --- /dev/null +++ b/petergate_test/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/petergate_test/config/initializers/backtrace_silencers.rb b/petergate_test/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..59385cd --- /dev/null +++ b/petergate_test/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/petergate_test/config/initializers/content_security_policy.rb b/petergate_test/config/initializers/content_security_policy.rb new file mode 100644 index 0000000..d3bcaa5 --- /dev/null +++ b/petergate_test/config/initializers/content_security_policy.rb @@ -0,0 +1,25 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/petergate_test/config/initializers/cookies_serializer.rb b/petergate_test/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000..5a6a32d --- /dev/null +++ b/petergate_test/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/petergate_test/config/initializers/devise.rb b/petergate_test/config/initializers/devise.rb new file mode 100644 index 0000000..98536d7 --- /dev/null +++ b/petergate_test/config/initializers/devise.rb @@ -0,0 +1,299 @@ +# frozen_string_literal: true + +# Use this hook to configure devise mailer, warden hooks and so forth. +# Many of these configuration options can be set straight in your model. +Devise.setup do |config| + # The secret key used by Devise. Devise uses this key to generate + # random tokens. Changing this key will render invalid all existing + # confirmation, reset password and unlock tokens in the database. + # Devise will use the `secret_key_base` as its `secret_key` + # by default. You can change it below and use your own secret key. + # config.secret_key = '8386a86098dfe71bfd6dc636cdd7f3a54a973205bcd8a1042c1310cc08f5754858ee4394124b2cd29809bb22aff2cf9386bcbc56bc78459cf75f1f7f7ee18e23' + + # ==> Controller configuration + # Configure the parent class to the devise controllers. + # config.parent_controller = 'DeviseController' + + # ==> Mailer Configuration + # Configure the e-mail address which will be shown in Devise::Mailer, + # note that it will be overwritten if you use your own mailer class + # with default "from" parameter. + config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com' + + # Configure the class responsible to send e-mails. + # config.mailer = 'Devise::Mailer' + + # Configure the parent class responsible to send e-mails. + # config.parent_mailer = 'ActionMailer::Base' + + # ==> ORM configuration + # Load and configure the ORM. Supports :active_record (default) and + # :mongoid (bson_ext recommended) by default. Other ORMs may be + # available as additional gems. + require 'devise/orm/active_record' + + # ==> Configuration for any authentication mechanism + # Configure which keys are used when authenticating a user. The default is + # just :email. You can configure it to use [:username, :subdomain], so for + # authenticating a user, both parameters are required. Remember that those + # parameters are used only when authenticating and not when retrieving from + # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. + # config.authentication_keys = [:email] + + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [:email] + + # Configure which authentication keys should have whitespace stripped. + # These keys will have whitespace before and after removed upon creating or + # modifying a user and when used to authenticate or find a user. Default is :email. + config.strip_whitespace_keys = [:email] + + # Tell if authentication through request.params is enabled. True by default. + # It can be set to an array that will enable params authentication only for the + # given strategies, for example, `config.params_authenticatable = [:database]` will + # enable it only for database (email + password) authentication. + # config.params_authenticatable = true + + # Tell if authentication through HTTP Auth is enabled. False by default. + # It can be set to an array that will enable http authentication only for the + # given strategies, for example, `config.http_authenticatable = [:database]` will + # enable it only for database authentication. The supported strategies are: + # :database = Support basic authentication with authentication key + password + # config.http_authenticatable = false + + # If 401 status code should be returned for AJAX requests. True by default. + # config.http_authenticatable_on_xhr = true + + # The realm used in Http Basic Authentication. 'Application' by default. + # config.http_authentication_realm = 'Application' + + # It will change confirmation, password recovery and other workflows + # to behave the same regardless if the e-mail provided was right or wrong. + # Does not affect registerable. + # config.paranoid = true + + # By default Devise will store the user in session. You can skip storage for + # particular strategies by setting this option. + # Notice that if you are skipping storage for all authentication paths, you + # may want to disable generating routes to Devise's sessions controller by + # passing skip: :sessions to `devise_for` in your config/routes.rb + config.skip_session_storage = [:http_auth] + + # By default, Devise cleans up the CSRF token on authentication to + # avoid CSRF token fixation attacks. This means that, when using AJAX + # requests for sign in and sign up, you need to get a new CSRF token + # from the server. You can disable this option at your own risk. + # config.clean_up_csrf_token_on_authentication = true + + # When false, Devise will not attempt to reload routes on eager load. + # This can reduce the time taken to boot the app but if your application + # requires the Devise mappings to be loaded during boot time the application + # won't boot properly. + # config.reload_routes = true + + # ==> Configuration for :database_authenticatable + # For bcrypt, this is the cost for hashing the password and defaults to 11. If + # using other algorithms, it sets how many times you want the password to be hashed. + # + # Limiting the stretches to just one in testing will increase the performance of + # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use + # a value less than 10 in other environments. Note that, for bcrypt (the default + # algorithm), the cost increases exponentially with the number of stretches (e.g. + # a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation). + config.stretches = Rails.env.test? ? 1 : 11 + + # Set up a pepper to generate the hashed password. + # config.pepper = '1666f7a84aa372aeed81801a225dc02ca29463d19a53fabb7c82bc192b6ff6d3c41adf5fe807efc3fd7521c7cbfbdfd6dde019d261e6e3139fed34cd63a0c7e2' + + # Send a notification to the original email when the user's email is changed. + # config.send_email_changed_notification = false + + # Send a notification email when the user's password is changed. + # config.send_password_change_notification = false + + # ==> Configuration for :confirmable + # A period that the user is allowed to access the website even without + # confirming their account. For instance, if set to 2.days, the user will be + # able to access the website for two days without confirming their account, + # access will be blocked just in the third day. + # You can also set it to nil, which will allow the user to access the website + # without confirming their account. + # Default is 0.days, meaning the user cannot access the website without + # confirming their account. + # config.allow_unconfirmed_access_for = 2.days + + # A period that the user is allowed to confirm their account before their + # token becomes invalid. For example, if set to 3.days, the user can confirm + # their account within 3 days after the mail was sent, but on the fourth day + # their account can't be confirmed with the token any more. + # Default is nil, meaning there is no restriction on how long a user can take + # before confirming their account. + # config.confirm_within = 3.days + + # If true, requires any email changes to be confirmed (exactly the same way as + # initial account confirmation) to be applied. Requires additional unconfirmed_email + # db field (see migrations). Until confirmed, new email is stored in + # unconfirmed_email column, and copied to email column on successful confirmation. + config.reconfirmable = true + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [:email] + + # ==> Configuration for :rememberable + # The time the user will be remembered without asking for credentials again. + # config.remember_for = 2.weeks + + # Invalidates all the remember me tokens when the user signs out. + config.expire_all_remember_me_on_sign_out = true + + # If true, extends the user's remember period when remembered via cookie. + # config.extend_remember_period = false + + # Options to be passed to the created cookie. For instance, you can set + # secure: true in order to force SSL only cookies. + # config.rememberable_options = {} + + # ==> Configuration for :validatable + # Range for password length. + config.password_length = 6..128 + + # Email regex used to validate email formats. It simply asserts that + # one (and only one) @ exists in the given string. This is mainly + # to give user feedback and not to assert the e-mail validity. + config.email_regexp = /\A[^@\s]+@[^@\s]+\z/ + + # ==> Configuration for :timeoutable + # The time you want to timeout the user session without activity. After this + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # ==> Configuration for :lockable + # Defines which strategy will be used to lock an account. + # :failed_attempts = Locks an account after a number of failed attempts to sign in. + # :none = No lock strategy. You should handle locking by yourself. + # config.lock_strategy = :failed_attempts + + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [:email] + + # Defines which strategy will be used to unlock an account. + # :email = Sends an unlock link to the user email + # :time = Re-enables login after a certain amount of time (see :unlock_in below) + # :both = Enables both strategies + # :none = No unlock strategy. You should handle unlocking by yourself. + # config.unlock_strategy = :both + + # Number of authentication tries before locking an account if lock_strategy + # is failed attempts. + # config.maximum_attempts = 20 + + # Time interval to unlock the account if :time is enabled as unlock_strategy. + # config.unlock_in = 1.hour + + # Warn on the last attempt before the account is locked. + # config.last_attempt_warning = true + + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [:email] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 6.hours + + # When set to false, does not sign a user in automatically after their password is + # reset. Defaults to true, so a user is signed in automatically after a reset. + # config.sign_in_after_reset_password = true + + # ==> Configuration for :encryptable + # Allow you to use another hashing or encryption algorithm besides bcrypt (default). + # You can use :sha1, :sha512 or algorithms from others authentication tools as + # :clearance_sha1, :authlogic_sha512 (then you should set stretches above to 20 + # for default behavior) and :restful_authentication_sha1 (then you should set + # stretches to 10, and copy REST_AUTH_SITE_KEY to pepper). + # + # Require the `devise-encryptable` gem when using anything other than bcrypt + # config.encryptor = :sha512 + + # ==> Scopes configuration + # Turn scoped views on. Before rendering "sessions/new", it will first check for + # "users/sessions/new". It's turned off by default because it's slower if you + # are using only default views. + # config.scoped_views = false + + # Configure the default scope given to Warden. By default it's the first + # devise role declared in your routes (usually :user). + # config.default_scope = :user + + # Set this configuration to false if you want /users/sign_out to sign out + # only the current scope. By default, Devise signs out all scopes. + # config.sign_out_all_scopes = true + + # ==> Navigation configuration + # Lists the formats that should be treated as navigational. Formats like + # :html, should redirect to the sign in page when the user does not have + # access, but formats like :xml or :json, should return 401. + # + # If you have any extra navigational formats, like :iphone or :mobile, you + # should add them to the navigational formats lists. + # + # The "*/*" below is required to match Internet Explorer requests. + # config.navigational_formats = ['*/*', :html] + + # The default HTTP method used to sign out a resource. Default is :delete. + config.sign_out_via = :delete + + # ==> OmniAuth + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo' + + # ==> Warden configuration + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. + # + # config.warden do |manager| + # manager.intercept_401 = false + # manager.default_strategies(scope: :user).unshift :some_external_strategy + # end + + # ==> Mountable engine configurations + # When using Devise inside an engine, let's call it `MyEngine`, and this engine + # is mountable, there are some extra configurations to be taken into account. + # The following options are available, assuming the engine is mounted as: + # + # mount MyEngine, at: '/my_engine' + # + # The router that invoked `devise_for`, in the example above, would be: + # config.router_name = :my_engine + # + # When using OmniAuth, Devise cannot automatically set OmniAuth path, + # so you need to do it manually. For the users scope, it would be: + # config.omniauth_path_prefix = '/my_engine/users/auth' + + # ==> Turbolinks configuration + # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly: + # + # ActiveSupport.on_load(:devise_failure_app) do + # include Turbolinks::Controller + # end + + # ==> Configuration for :registerable + + # When set to false, does not sign a user in automatically after their password is + # changed. Defaults to true, so a user is signed in automatically after changing a password. + # config.sign_in_after_change_password = true +end diff --git a/petergate_test/config/initializers/filter_parameter_logging.rb b/petergate_test/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000..4a994e1 --- /dev/null +++ b/petergate_test/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/petergate_test/config/initializers/inflections.rb b/petergate_test/config/initializers/inflections.rb new file mode 100644 index 0000000..ac033bf --- /dev/null +++ b/petergate_test/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/petergate_test/config/initializers/mime_types.rb b/petergate_test/config/initializers/mime_types.rb new file mode 100644 index 0000000..dc18996 --- /dev/null +++ b/petergate_test/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/petergate_test/config/initializers/wrap_parameters.rb b/petergate_test/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000..bbfc396 --- /dev/null +++ b/petergate_test/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/petergate_test/config/locales/devise.en.yml b/petergate_test/config/locales/devise.en.yml new file mode 100644 index 0000000..55617bd --- /dev/null +++ b/petergate_test/config/locales/devise.en.yml @@ -0,0 +1,65 @@ +# Additional translations at https://github.com/plataformatec/devise/wiki/I18n + +en: + devise: + confirmations: + confirmed: "Your email address has been successfully confirmed." + send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes." + send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes." + failure: + already_authenticated: "You are already signed in." + inactive: "Your account is not activated yet." + invalid: "Invalid %{authentication_keys} or password." + locked: "Your account is locked." + last_attempt: "You have one more attempt before your account is locked." + not_found_in_database: "Invalid %{authentication_keys} or password." + timeout: "Your session expired. Please sign in again to continue." + unauthenticated: "You need to sign in or sign up before continuing." + unconfirmed: "You have to confirm your email address before continuing." + mailer: + confirmation_instructions: + subject: "Confirmation instructions" + reset_password_instructions: + subject: "Reset password instructions" + unlock_instructions: + subject: "Unlock instructions" + email_changed: + subject: "Email Changed" + password_change: + subject: "Password Changed" + omniauth_callbacks: + failure: "Could not authenticate you from %{kind} because \"%{reason}\"." + success: "Successfully authenticated from %{kind} account." + passwords: + no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." + send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." + send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." + updated: "Your password has been changed successfully. You are now signed in." + updated_not_active: "Your password has been changed successfully." + registrations: + destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon." + signed_up: "Welcome! You have signed up successfully." + signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." + signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." + signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account." + update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address." + updated: "Your account has been updated successfully." + updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again" + sessions: + signed_in: "Signed in successfully." + signed_out: "Signed out successfully." + already_signed_out: "Signed out successfully." + unlocks: + send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes." + send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes." + unlocked: "Your account has been unlocked successfully. Please sign in to continue." + errors: + messages: + already_confirmed: "was already confirmed, please try signing in" + confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one" + expired: "has expired, please request a new one" + not_found: "not found" + not_locked: "was not locked" + not_saved: + one: "1 error prohibited this %{resource} from being saved:" + other: "%{count} errors prohibited this %{resource} from being saved:" diff --git a/petergate_test/config/locales/en.yml b/petergate_test/config/locales/en.yml new file mode 100644 index 0000000..decc5a8 --- /dev/null +++ b/petergate_test/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/petergate_test/config/puma.rb b/petergate_test/config/puma.rb new file mode 100644 index 0000000..a5eccf8 --- /dev/null +++ b/petergate_test/config/puma.rb @@ -0,0 +1,34 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/petergate_test/config/routes.rb b/petergate_test/config/routes.rb new file mode 100644 index 0000000..f28fa4f --- /dev/null +++ b/petergate_test/config/routes.rb @@ -0,0 +1,60 @@ +Rails.application.routes.draw do + devise_for :users + resources :blogs + get 'test_forbidden' => 'test#index' + + # The priority is based upon order of creation: first created -> highest priority. + # See how all your routes lay out with "rake routes". + + # You can have the root of your site routed with "root" + root 'blogs#index' + + # Example of regular route: + # get 'products/:id' => 'catalog#view' + + # Example of named route that can be invoked with purchase_url(id: product.id) + # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase + + # Example resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Example resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Example resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Example resource route with more complex sub-resources: + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', on: :collection + # end + # end + + # Example resource route with concerns: + # concern :toggleable do + # post 'toggle' + # end + # resources :posts, concerns: :toggleable + # resources :photos, concerns: :toggleable + + # Example resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end +end diff --git a/petergate_test/config/spring.rb b/petergate_test/config/spring.rb new file mode 100644 index 0000000..9fa7863 --- /dev/null +++ b/petergate_test/config/spring.rb @@ -0,0 +1,6 @@ +%w[ + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +].each { |path| Spring.watch(path) } diff --git a/petergate_test/config/storage.yml b/petergate_test/config/storage.yml new file mode 100644 index 0000000..d32f76e --- /dev/null +++ b/petergate_test/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/petergate_test/db/migrate/20141117063228_create_blogs.rb b/petergate_test/db/migrate/20141117063228_create_blogs.rb new file mode 100644 index 0000000..bbe9e92 --- /dev/null +++ b/petergate_test/db/migrate/20141117063228_create_blogs.rb @@ -0,0 +1,10 @@ +class CreateBlogs < ActiveRecord::Migration[5.1] + def change + create_table :blogs do |t| + t.string :title + t.text :content + + t.timestamps + end + end +end diff --git a/petergate_test/db/migrate/20141117064643_devise_create_users.rb b/petergate_test/db/migrate/20141117064643_devise_create_users.rb new file mode 100644 index 0000000..731e5da --- /dev/null +++ b/petergate_test/db/migrate/20141117064643_devise_create_users.rb @@ -0,0 +1,42 @@ +class DeviseCreateUsers < ActiveRecord::Migration[5.1] + def change + create_table(:users) do |t| + ## Database authenticatable + t.string :email, null: false, default: "" + t.string :encrypted_password, null: false, default: "" + + ## Recoverable + t.string :reset_password_token + t.datetime :reset_password_sent_at + + ## Rememberable + t.datetime :remember_created_at + + ## Trackable + t.integer :sign_in_count, default: 0, null: false + t.datetime :current_sign_in_at + t.datetime :last_sign_in_at + t.string :current_sign_in_ip + t.string :last_sign_in_ip + + ## Confirmable + # t.string :confirmation_token + # t.datetime :confirmed_at + # t.datetime :confirmation_sent_at + # t.string :unconfirmed_email # Only if using reconfirmable + + ## Lockable + # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts + # t.string :unlock_token # Only if unlock strategy is :email or :both + # t.datetime :locked_at + + + t.timestamps + end + + add_index :users, :email, unique: true + add_index :users, :reset_password_token, unique: true + # add_index :users, :confirmation_token, unique: true + # add_index :users, :unlock_token, unique: true + end +end diff --git a/petergate_test/db/migrate/20141117064807_add_roles_to_users.rb b/petergate_test/db/migrate/20141117064807_add_roles_to_users.rb new file mode 100644 index 0000000..526c833 --- /dev/null +++ b/petergate_test/db/migrate/20141117064807_add_roles_to_users.rb @@ -0,0 +1,5 @@ +class AddRolesToUsers < ActiveRecord::Migration[5.1] + def change + add_column :users, :roles, :string + end +end diff --git a/petergate_test/db/schema.rb b/petergate_test/db/schema.rb new file mode 100644 index 0000000..b060d46 --- /dev/null +++ b/petergate_test/db/schema.rb @@ -0,0 +1,40 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2014_11_17_064807) do + + create_table "blogs", force: :cascade do |t| + t.string "title" + t.text "content" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "users", force: :cascade do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.integer "sign_in_count", default: 0, null: false + t.datetime "current_sign_in_at" + t.datetime "last_sign_in_at" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "roles" + t.index ["email"], name: "index_users_on_email", unique: true + t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true + end + +end diff --git a/petergate_test/db/seeds.rb b/petergate_test/db/seeds.rb new file mode 100644 index 0000000..1beea2a --- /dev/null +++ b/petergate_test/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/petergate_test/lib/assets/.keep b/petergate_test/lib/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/lib/tasks/.keep b/petergate_test/lib/tasks/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/log/.keep b/petergate_test/log/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/package.json b/petergate_test/package.json new file mode 100644 index 0000000..88544fd --- /dev/null +++ b/petergate_test/package.json @@ -0,0 +1,5 @@ +{ + "name": "petergate_test", + "private": true, + "dependencies": {} +} diff --git a/petergate_test/public/404.html b/petergate_test/public/404.html new file mode 100644 index 0000000..2be3af2 --- /dev/null +++ b/petergate_test/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/petergate_test/public/422.html b/petergate_test/public/422.html new file mode 100644 index 0000000..c08eac0 --- /dev/null +++ b/petergate_test/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/petergate_test/public/500.html b/petergate_test/public/500.html new file mode 100644 index 0000000..78a030a --- /dev/null +++ b/petergate_test/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/petergate_test/public/apple-touch-icon-precomposed.png b/petergate_test/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/public/apple-touch-icon.png b/petergate_test/public/apple-touch-icon.png new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/public/favicon.ico b/petergate_test/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/public/robots.txt b/petergate_test/public/robots.txt new file mode 100644 index 0000000..37b576a --- /dev/null +++ b/petergate_test/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/petergate_test/storage/.keep b/petergate_test/storage/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/application_system_test_case.rb b/petergate_test/test/application_system_test_case.rb new file mode 100644 index 0000000..d19212a --- /dev/null +++ b/petergate_test/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/petergate_test/test/controllers/.keep b/petergate_test/test/controllers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/fixtures/.keep b/petergate_test/test/fixtures/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/fixtures/files/.keep b/petergate_test/test/fixtures/files/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/helpers/.keep b/petergate_test/test/helpers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/integration/.keep b/petergate_test/test/integration/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/mailers/.keep b/petergate_test/test/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/models/.keep b/petergate_test/test/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/system/.keep b/petergate_test/test/system/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/test_helper.rb b/petergate_test/test/test_helper.rb new file mode 100644 index 0000000..3ab84e3 --- /dev/null +++ b/petergate_test/test/test_helper.rb @@ -0,0 +1,10 @@ +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/petergate_test/tmp/.keep b/petergate_test/tmp/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/vendor/.keep b/petergate_test/vendor/.keep new file mode 100644 index 0000000..e69de29 From 0035b7d889a3956266a54de7f364793d3b8410e1 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Wed, 4 Sep 2019 17:13:49 -0700 Subject: [PATCH 02/12] fixed tests minus referrer test --- petergate_test/Gemfile | 3 + .../app/controllers/blogs_controller.rb | 2 +- .../.keep => app/views/blogs/create.js.erb} | 0 .../views/blogs/create.json.jbuilder} | 0 petergate_test/app/views/blogs/create.xml | 0 petergate_test/app/views/blogs/destroy.js.erb | 0 .../app/views/blogs/destroy.json.jbuilder | 0 petergate_test/app/views/blogs/destroy.xml | 0 .../app/views/blogs/index.json.jbuilder | 4 - petergate_test/app/views/blogs/new.js.erb | 0 .../app/views/blogs/new.json.jbuilder | 0 petergate_test/app/views/blogs/new.xml | 0 petergate_test/app/views/blogs/update.js.erb | 0 .../app/views/blogs/update.json.jbuilder | 0 petergate_test/app/views/blogs/update.xml | 0 petergate_test/app/views/test/index.js | 0 petergate_test/config/routes.rb | 2 +- .../test/application_system_test_case.rb | 5 - .../test/controllers/base_controller_test.rb | 7 + .../blogs_multiple_controller_test.rb | 251 ++++++++++++++++++ .../blogs_singular_controller_test.rb | 192 ++++++++++++++ .../test/controllers/test_controller_test.rb | 46 ++++ petergate_test/test/fixtures/blogs.yml | 10 + petergate_test/test/fixtures/users.yml | 4 + petergate_test/test/models/blog_test.rb | 9 + petergate_test/test/models/user_test.rb | 12 + petergate_test/test/test_helper.rb | 51 +++- 27 files changed, 582 insertions(+), 16 deletions(-) rename petergate_test/{test/fixtures/files/.keep => app/views/blogs/create.js.erb} (100%) rename petergate_test/{test/system/.keep => app/views/blogs/create.json.jbuilder} (100%) create mode 100644 petergate_test/app/views/blogs/create.xml create mode 100644 petergate_test/app/views/blogs/destroy.js.erb create mode 100644 petergate_test/app/views/blogs/destroy.json.jbuilder create mode 100644 petergate_test/app/views/blogs/destroy.xml delete mode 100644 petergate_test/app/views/blogs/index.json.jbuilder create mode 100644 petergate_test/app/views/blogs/new.js.erb create mode 100644 petergate_test/app/views/blogs/new.json.jbuilder create mode 100644 petergate_test/app/views/blogs/new.xml create mode 100644 petergate_test/app/views/blogs/update.js.erb create mode 100644 petergate_test/app/views/blogs/update.json.jbuilder create mode 100644 petergate_test/app/views/blogs/update.xml create mode 100644 petergate_test/app/views/test/index.js delete mode 100644 petergate_test/test/application_system_test_case.rb create mode 100644 petergate_test/test/controllers/base_controller_test.rb create mode 100644 petergate_test/test/controllers/blogs_multiple_controller_test.rb create mode 100644 petergate_test/test/controllers/blogs_singular_controller_test.rb create mode 100644 petergate_test/test/controllers/test_controller_test.rb create mode 100644 petergate_test/test/fixtures/blogs.yml create mode 100644 petergate_test/test/fixtures/users.yml create mode 100644 petergate_test/test/models/blog_test.rb create mode 100644 petergate_test/test/models/user_test.rb diff --git a/petergate_test/Gemfile b/petergate_test/Gemfile index 043ff8f..47762bc 100644 --- a/petergate_test/Gemfile +++ b/petergate_test/Gemfile @@ -41,6 +41,7 @@ gem 'petergate', path: '../' group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + gem 'pry', platforms: [:mri, :mingw, :x64_mingw] end group :development do @@ -58,6 +59,8 @@ group :test do gem 'selenium-webdriver' # Easy installation and use of chromedriver to run system tests with Chrome gem 'chromedriver-helper' + gem "minitest-rails" + gem "minitest-reporters" end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/petergate_test/app/controllers/blogs_controller.rb b/petergate_test/app/controllers/blogs_controller.rb index d51481f..219156d 100644 --- a/petergate_test/app/controllers/blogs_controller.rb +++ b/petergate_test/app/controllers/blogs_controller.rb @@ -58,7 +58,7 @@ def destroy @blog.destroy respond_to do |format| format.html { redirect_to blogs_url, notice: 'Blog was successfully destroyed.' } - format.json { head :no_content } + format.json { render body: blogs_url } end end diff --git a/petergate_test/test/fixtures/files/.keep b/petergate_test/app/views/blogs/create.js.erb similarity index 100% rename from petergate_test/test/fixtures/files/.keep rename to petergate_test/app/views/blogs/create.js.erb diff --git a/petergate_test/test/system/.keep b/petergate_test/app/views/blogs/create.json.jbuilder similarity index 100% rename from petergate_test/test/system/.keep rename to petergate_test/app/views/blogs/create.json.jbuilder diff --git a/petergate_test/app/views/blogs/create.xml b/petergate_test/app/views/blogs/create.xml new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/destroy.js.erb b/petergate_test/app/views/blogs/destroy.js.erb new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/destroy.json.jbuilder b/petergate_test/app/views/blogs/destroy.json.jbuilder new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/destroy.xml b/petergate_test/app/views/blogs/destroy.xml new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/index.json.jbuilder b/petergate_test/app/views/blogs/index.json.jbuilder deleted file mode 100644 index 6ad723c..0000000 --- a/petergate_test/app/views/blogs/index.json.jbuilder +++ /dev/null @@ -1,4 +0,0 @@ -json.array!(@blogs) do |blog| - json.extract! blog, :id, :title, :content - json.url blog_url(blog, format: :json) -end diff --git a/petergate_test/app/views/blogs/new.js.erb b/petergate_test/app/views/blogs/new.js.erb new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/new.json.jbuilder b/petergate_test/app/views/blogs/new.json.jbuilder new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/new.xml b/petergate_test/app/views/blogs/new.xml new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/update.js.erb b/petergate_test/app/views/blogs/update.js.erb new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/update.json.jbuilder b/petergate_test/app/views/blogs/update.json.jbuilder new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/blogs/update.xml b/petergate_test/app/views/blogs/update.xml new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/app/views/test/index.js b/petergate_test/app/views/test/index.js new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/config/routes.rb b/petergate_test/config/routes.rb index f28fa4f..732dd50 100644 --- a/petergate_test/config/routes.rb +++ b/petergate_test/config/routes.rb @@ -1,7 +1,7 @@ Rails.application.routes.draw do devise_for :users resources :blogs - get 'test_forbidden' => 'test#index' + get 'test_forbidden', to: 'test#index', as: 'test' # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/petergate_test/test/application_system_test_case.rb b/petergate_test/test/application_system_test_case.rb deleted file mode 100644 index d19212a..0000000 --- a/petergate_test/test/application_system_test_case.rb +++ /dev/null @@ -1,5 +0,0 @@ -require "test_helper" - -class ApplicationSystemTestCase < ActionDispatch::SystemTestCase - driven_by :selenium, using: :chrome, screen_size: [1400, 1400] -end diff --git a/petergate_test/test/controllers/base_controller_test.rb b/petergate_test/test/controllers/base_controller_test.rb new file mode 100644 index 0000000..aef1d5a --- /dev/null +++ b/petergate_test/test/controllers/base_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe "ActionController::Base" do + it "must have ALLREST as an array" do + ActionController::Base::ALLREST.must_be_instance_of(Array) + end +end diff --git a/petergate_test/test/controllers/blogs_multiple_controller_test.rb b/petergate_test/test/controllers/blogs_multiple_controller_test.rb new file mode 100644 index 0000000..e704307 --- /dev/null +++ b/petergate_test/test/controllers/blogs_multiple_controller_test.rb @@ -0,0 +1,251 @@ +require "test_helper" +describe BlogsController do + ################################################################################ + # ADMIN ROLE + ################################################################################ + describe "Multiple: Test that everything works if admin is logged in" do + before do + User.petergate(roles: [:root_admin, :company_admin], multiple: true) + create_admin_and_login + end + + let(:blog) { blogs :one } + + it "gets index" do + get blogs_url + assert_response :success + assert_not_equal 0, Blog.count + end + + it "gets new" do + get new_blog_url + assert_response :success + end + + it "creates blog" do + assert_difference('Blog.count') do + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + end + + assert_redirected_to blog_path(Blog.last) + end + + it "shows blog" do + get blog_url blog + assert_response :success + end + + it "gets edit" do + get edit_blog_url blog + assert_response :success + end + + it "updates blog" do + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) + end + + it "destroys blog" do + assert_difference('Blog.count', -1) do + delete blog_url blog + end + + assert_redirected_to blogs_path + end + end + + ################################################################################ + # USER ROLE + ################################################################################ + describe "Multiple: Make sure plain users can't see what they shouldn't." do + before do + User.petergate(roles: [:root_admin, :company_admin], multiple: true) + create_user_and_login + end + + let(:blog) { blogs :one } + + it "plain user can see index" do + get blogs_url + assert_response :success + assert_not_equal 0, Blog.count + end + + it "gets permission denied on new" do + get new_blog_url + assert_response 302 + flash[:notice].must_equal "Permission Denied" + end + + it "gets forbidden and no redirect with json format on new" do + assert_webservice_is_forbiddden do |format| + get new_blog_url(format: format) + end + end + + it "doesn't allow plain user to create blog post" do + assert_no_difference('Blog.count') do + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to root_path + + assert_webservice_is_forbiddden do |format| + post blogs_url(format: format), params: { blog: { content: blog.content, title: blog.title } } + end + end + end + + it "can see show blog" do + get blog_url blog + assert_response :success + end + + it "can't get to edit page" do + get edit_blog_url blog + assert_response 302 + end + + it "can't update blog" do + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to root_path + + assert_webservice_is_forbiddden do |format| + put blog_url(blog, format: format), params: { blog: { content: blog.content, title: blog.title } } + end + end + + it "can't destroy blog" do + assert_no_difference('Blog.count') do + delete blog_url blog + assert_redirected_to root_path + + assert_webservice_is_forbiddden do |format| + delete blog_url blog + delete blog_url(blog, format: format) + end + end + end + end + + ################################################################################ + # GUEST ROLE + ################################################################################ + describe "Multiple: Make sure guests can't see what they shouldn't." do + let(:blog) { blogs :one } + + it "guest can see index" do + get blogs_url + assert_response :success + assert_not_equal 0, Blog.count + end + + it "gets permission denied on new" do + get new_blog_url + assert_response 302 + end + + it "json gets permission denied on new" do + assert_webservice_is_unauthorized do |format| + get new_blog_url(format: format) + end + end + + it "doesn't allow plain user to create blog post" do + assert_no_difference('Blog.count') do + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to "/users/sign_in" + end + end + + it "doesn't show blog" do + get blog_url blog + assert_response 302 + end + + it "can't get to edit page" do + get edit_blog_url blog + assert_response 302 + end + + it "can't update blog" do + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to "/users/sign_in" + end + + it "can't destroy blog" do + assert_no_difference('Blog.count') do + delete blog_url blog + assert_redirected_to "/users/sign_in" + end + end + end + + ################################################################################ + # COMPANY_ADMIN ROLE + ################################################################################ + describe "Multiple: Test that everything works if company_admin is logged in" do + before do + User.petergate(roles: [:root_admin, :company_admin], multiple: true) + create_company_admin_and_login + end + + let(:blog) { blogs :one } + + it "gets index" do + get blogs_url + assert_response :success + assert_not_equal 0, Blog.count + end + + it "gets new" do + get new_blog_url + assert_response :success + end + + it "creates blog" do + assert_difference('Blog.count') do + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + end + + assert_redirected_to blog_path(Blog.last) + end + + it "shows blog" do + get blog_url blog + assert_response :success + end + + it "gets edit" do + get edit_blog_url blog + assert_response :success + end + + it "updates blog" do + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) + end + + it "can't destroy blog" do + assert_no_difference('Blog.count', -1) do + delete blog_url blog + end + + assert_redirected_to root_path + end + end + + private + + def assert_webservice_is_forbiddden(&block) + [:js, :json, :xml].each do |format| + block.call format + assert_response :forbidden + end + end + + def assert_webservice_is_unauthorized(&block) + [:js, :json, :xml].each do |format| + block.call format + assert_response :unauthorized + end + end +end diff --git a/petergate_test/test/controllers/blogs_singular_controller_test.rb b/petergate_test/test/controllers/blogs_singular_controller_test.rb new file mode 100644 index 0000000..4750c22 --- /dev/null +++ b/petergate_test/test/controllers/blogs_singular_controller_test.rb @@ -0,0 +1,192 @@ +require "test_helper" + +describe BlogsController do + ################################################################################ + # ADMIN ROLE + ################################################################################ + describe "Singular: Test that everything works if admin is logged in" do + before do + User.petergate(roles: [:root_admin, :company_admin], multiple: false) + create_admin_and_login + end + + let(:blog) { blogs :one } + + it "gets index" do + get blogs_url + assert_response :success + assert_not_equal 0, Blog.count + end + + it "gets new" do + get new_blog_url + assert_response :success + end + + it "creates blog" do + assert_difference('Blog.count') do + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + end + + assert_redirected_to blog_path(Blog.last) + end + + it "shows blog" do + get blog_url blog + assert_response :success + end + + it "gets edit" do + get edit_blog_url blog + assert_response :success + end + + it "updates blog" do + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) + end + + it "destroys blog" do + assert_difference('Blog.count', -1) do + delete blog_url blog + end + + assert_redirected_to blogs_path + end + end + + ################################################################################ + # USER ROLE + ################################################################################ + describe "Singular: Make sure plain users can't see what they shouldn't." do + before do + User.petergate(roles: [:root_admin, :company_admin], multiple: false) + create_user_and_login + end + + let(:blog) { blogs :one } + + it "plain user can see index" do + get blogs_url + assert_response :success + assert_not_equal 0, Blog.count + end + + it "gets permission denied on new" do + get new_blog_url + assert_response 302 + flash[:notice].must_equal "Permission Denied" + end + + it "gets forbidden and no redirect with json format on new" do + assert_webservice_is_forbiddden do |format| + get new_blog_url(format: format) + end + end + + it "doesn't allow plain user to create blog post" do + assert_no_difference('Blog.count') do + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to root_path + + assert_webservice_is_forbiddden do |format| + post blogs_url(format: format), params: { blog: { content: blog.content, title: blog.title } } + end + end + end + + it "can see show blog" do + get blog_url blog + assert_response :success + end + + it "can't get to edit page" do + get edit_blog_url blog + assert_response 302 + end + + it "can't update blog" do + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to root_path + + assert_webservice_is_forbiddden do |format| + put blog_url(blog, format: format), params: { blog: { content: blog.content, title: blog.title } } + end + end + + it "can't destroy blog" do + assert_no_difference('Blog.count') do + delete blog_url blog + assert_redirected_to root_path + + assert_webservice_is_forbiddden do |format| + delete blog_url blog + delete blog_url(blog, format: format) + end + end + end + end + + ################################################################################# + # COMPANY_ADMIN ROLE + ################################################################################# + describe "Singular: Test that everything works if company_admin is logged in" do + before do + User.petergate(roles: [:root_admin, :company_admin], multiple: false) + create_company_admin_and_login + end + + let(:blog) { blogs :one } + + it "gets index" do + get blogs_url + assert_response :success + assert_not_equal 0, Blog.count + end + + it "gets new" do + get new_blog_url + assert_response :success + end + + it "creates blog" do + assert_difference('Blog.count') do + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + end + + assert_redirected_to blog_path(Blog.last) + end + + it "shows blog" do + get blog_url blog + assert_response :success + end + + it "gets edit" do + get edit_blog_url blog + assert_response :success + end + + it "updates blog" do + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) + end + + it "can't destroy blog" do + assert_no_difference('Blog.count', -1) do + delete blog_url blog + end + + assert_redirected_to root_path + end + end + + private + + def assert_webservice_is_forbiddden(&block) + [:js, :json, :xml].each do |format| + block.call format + assert_response :forbidden + end + end +end diff --git a/petergate_test/test/controllers/test_controller_test.rb b/petergate_test/test/controllers/test_controller_test.rb new file mode 100644 index 0000000..452ba17 --- /dev/null +++ b/petergate_test/test/controllers/test_controller_test.rb @@ -0,0 +1,46 @@ +require "test_helper" + +class TestController < ApplicationController + skip_before_action :verify_authenticity_token + + def index + forbidden! params[:msg] + end +end + +describe "TestController", '#forbidden!' do + let(:admin) { users(:admin) } + before { sign_in admin } + + describe 'with html format request' do + it 'redirect to referrer' do + skip + @request.env['HTTP_REFERER'] = 'http://referrer-page.com' + get test_url + assert_redirected_to 'http://referrer-page.com' + end + + it 'redirect to after_sign_in_path_for' do + get test_url + assert_redirected_to root_path + end + + it 'redirect to root_path if not signed in' do + sign_out admin + get test_url + assert_redirected_to root_url + end + + it 'uses the msg when supplied' do + get test_url, params: { msg: 'custom message' } + assert_equal('custom message', flash[:notice]) + end + end + + describe 'with xhr format request' do + it 'respond with forbidden status' do + get test_url(format: :js) + assert_response :forbidden + end + end +end diff --git a/petergate_test/test/fixtures/blogs.yml b/petergate_test/test/fixtures/blogs.yml new file mode 100644 index 0000000..8bd60d5 --- /dev/null +++ b/petergate_test/test/fixtures/blogs.yml @@ -0,0 +1,10 @@ +# Read about fixtures at +# http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + title: MyString + content: MyText + +two: + title: MyString + content: MyText diff --git a/petergate_test/test/fixtures/users.yml b/petergate_test/test/fixtures/users.yml new file mode 100644 index 0000000..ad6b923 --- /dev/null +++ b/petergate_test/test/fixtures/users.yml @@ -0,0 +1,4 @@ +admin: + email: admin@example.com + roles: + - root_admin diff --git a/petergate_test/test/models/blog_test.rb b/petergate_test/test/models/blog_test.rb new file mode 100644 index 0000000..19c68d3 --- /dev/null +++ b/petergate_test/test/models/blog_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Blog do + let(:blog) { Blog.new } + + it "must be valid" do + blog.must_be :valid? + end +end diff --git a/petergate_test/test/models/user_test.rb b/petergate_test/test/models/user_test.rb new file mode 100644 index 0000000..b06087e --- /dev/null +++ b/petergate_test/test/models/user_test.rb @@ -0,0 +1,12 @@ +require "test_helper" + +describe Blog do + let(:user) { + User.petergate(roles: [:root_admin, :company_admin], multiple: false) + User.create(email: "company_admin2@example.com", password: "password1", password_confirmation: "password1", role: :company_admin) + } + + it "must be valid" do + user.must_be :valid? + end +end diff --git a/petergate_test/test/test_helper.rb b/petergate_test/test/test_helper.rb index 3ab84e3..cd90821 100644 --- a/petergate_test/test/test_helper.rb +++ b/petergate_test/test/test_helper.rb @@ -1,10 +1,51 @@ -ENV['RAILS_ENV'] ||= 'test' -require_relative '../config/environment' -require 'rails/test_help' +ENV['RAILS_ENV'] = 'test' +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails" +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +require "minitest/pride" +require "minitest/reporters" +require "minitest/autorun" class ActiveSupport::TestCase - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + ActiveRecord::Migration.check_pending! fixtures :all - # Add more helper methods to be used by all tests here... + # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. +end + +class ActionController::TestCase + include Devise::TestHelpers +end + +def create_user_and_login(email: "user@example.com", password: "youllneverguess") + u = User.create(email: email, password: password, password_confirmation: password, roles: :user) + sign_in(u) +end + +def create_admin_and_login(email: "user@example.com", password: "youllneverguess") + u = User.create(email: email, password: password, password_confirmation: password, roles: :root_admin) + sign_in(u) +end + +def create_company_admin_and_login(email: "user@example.com", password: "youllneverguess") + u = User.create(email: email, password: password, password_confirmation: password, roles: :company_admin) + sign_in(u) +end + +def sign_in(u) + post( user_session_url, + params: { + 'user[email]' => u.email, + 'user[password]' => 'youllneverguess' + } + ) +end + +def sign_out(u) + delete(destroy_user_session_url) end From 39ca12c947925a01bac7eb44adecc31664c25943 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Wed, 4 Sep 2019 17:14:42 -0700 Subject: [PATCH 03/12] added auth_class class variable --- lib/petergate.rb | 6 ++++++ lib/petergate/active_record/base.rb | 2 ++ 2 files changed, 8 insertions(+) diff --git a/lib/petergate.rb b/lib/petergate.rb index af146c1..88bceb3 100644 --- a/lib/petergate.rb +++ b/lib/petergate.rb @@ -4,5 +4,11 @@ require 'petergate/active_record/base' module Petergate + def self.auth_class + @@auth_class + end + def self.auth_class=(v) + @@auth_class ||= v + end end diff --git a/lib/petergate/active_record/base.rb b/lib/petergate/active_record/base.rb index 82b4d4a..b49f3a1 100644 --- a/lib/petergate/active_record/base.rb +++ b/lib/petergate/active_record/base.rb @@ -7,6 +7,8 @@ def self.included(base) module ClassMethods def petergate(roles: [:admin], multiple: true) + Petergate.auth_class = self.to_s + if multiple serialize :roles after_initialize do From 05c9604c9dc00474c8ece4ae46ae2a7d8e0049b2 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Wed, 4 Sep 2019 17:25:32 -0700 Subject: [PATCH 04/12] added dynamic current_#{auth_class} getter for models named other than user --- lib/petergate/action_controller/base.rb | 14 +++++++++----- lib/petergate/active_record/base.rb | 2 +- petergate_test/app/models/user.rb | 1 - 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/petergate/action_controller/base.rb b/lib/petergate/action_controller/base.rb index 30e9550..f31b213 100644 --- a/lib/petergate/action_controller/base.rb +++ b/lib/petergate/action_controller/base.rb @@ -47,7 +47,7 @@ def inherited(subclass) unless logged_in?(:root_admin) message = permissions(self.class.controller_rules) if message == false || message.is_a?(String) - if current_user || @user + if get_current_auth_model || instance_variable_get("@" + Petergate.auth_class) forbidden! message else unauthorized! @@ -87,18 +87,18 @@ def parse_permission_rules(rules) def permissions(rules = {all: [:index, :show], customer: [], wiring: []}) rules = parse_permission_rules(rules) allowances = [rules[:all]] - current_user.roles.each do |role| + get_current_auth_model.roles.each do |role| allowances << rules[role] end if user_logged_in? allowances.flatten.compact.include?(action_name.to_sym) end def logged_in?(*roles) - current_user && current_user.has_roles?(*roles) + get_current_auth_model && get_current_auth_model.has_roles?(*roles) end def user_logged_in? - !!current_user + !!get_current_auth_model end def custom_message @@ -118,11 +118,15 @@ def forbidden!(msg = nil) respond_to do |format| format.any(:js, :json, :xml) { render nothing: true, status: :forbidden } format.html do - destination = current_user.present? ? request.referrer || after_sign_in_path_for(current_user) : root_path + destination = get_current_auth_model.present? ? request.referrer || after_sign_in_path_for(get_current_auth_model) : root_path redirect_to destination, notice: (msg || custom_message) end end end + + def get_current_auth_model + self.send("current_" + Petergate.auth_class) + end end end end diff --git a/lib/petergate/active_record/base.rb b/lib/petergate/active_record/base.rb index b49f3a1..39b7ddf 100644 --- a/lib/petergate/active_record/base.rb +++ b/lib/petergate/active_record/base.rb @@ -7,7 +7,7 @@ def self.included(base) module ClassMethods def petergate(roles: [:admin], multiple: true) - Petergate.auth_class = self.to_s + Petergate.auth_class = self.to_s.downcase if multiple serialize :roles diff --git a/petergate_test/app/models/user.rb b/petergate_test/app/models/user.rb index c74a793..4df26aa 100644 --- a/petergate_test/app/models/user.rb +++ b/petergate_test/app/models/user.rb @@ -13,4 +13,3 @@ class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable end - From 7dde873b09c2c89741eb8519240d52788174eba1 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Wed, 4 Sep 2019 17:29:48 -0700 Subject: [PATCH 05/12] remove get in method name --- lib/petergate/action_controller/base.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/petergate/action_controller/base.rb b/lib/petergate/action_controller/base.rb index f31b213..53d920e 100644 --- a/lib/petergate/action_controller/base.rb +++ b/lib/petergate/action_controller/base.rb @@ -47,7 +47,7 @@ def inherited(subclass) unless logged_in?(:root_admin) message = permissions(self.class.controller_rules) if message == false || message.is_a?(String) - if get_current_auth_model || instance_variable_get("@" + Petergate.auth_class) + if current_auth_model || instance_variable_get("@" + Petergate.auth_class) forbidden! message else unauthorized! @@ -87,18 +87,18 @@ def parse_permission_rules(rules) def permissions(rules = {all: [:index, :show], customer: [], wiring: []}) rules = parse_permission_rules(rules) allowances = [rules[:all]] - get_current_auth_model.roles.each do |role| + current_auth_model.roles.each do |role| allowances << rules[role] end if user_logged_in? allowances.flatten.compact.include?(action_name.to_sym) end def logged_in?(*roles) - get_current_auth_model && get_current_auth_model.has_roles?(*roles) + current_auth_model && current_auth_model.has_roles?(*roles) end def user_logged_in? - !!get_current_auth_model + !!current_auth_model end def custom_message @@ -118,13 +118,13 @@ def forbidden!(msg = nil) respond_to do |format| format.any(:js, :json, :xml) { render nothing: true, status: :forbidden } format.html do - destination = get_current_auth_model.present? ? request.referrer || after_sign_in_path_for(get_current_auth_model) : root_path + destination = current_auth_model.present? ? request.referrer || after_sign_in_path_for(current_auth_model) : root_path redirect_to destination, notice: (msg || custom_message) end end end - def get_current_auth_model + def current_auth_model self.send("current_" + Petergate.auth_class) end end From 51ded1e2f6c6b9d2f522d3fe06af63a17a558bf9 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Thu, 5 Sep 2019 12:03:10 -0700 Subject: [PATCH 06/12] deleted dummy folder, replaced defined? with self.constants, used send for authenticate_#{model}! , moved two test apps into test folder with respective names --- .travis.yml | 13 ++- Gemfile | 41 ------- dummy/app/assets/javascripts/blogs.js.coffee | 3 - dummy/app/assets/stylesheets/blogs.css.scss | 3 - .../app/assets/stylesheets/scaffolds.css.scss | 69 ------------ .../app/controllers/application_controller.rb | 5 - dummy/app/models/blog.rb | 2 - dummy/app/views/blogs/index.json.jbuilder | 4 - dummy/app/views/layouts/application.html.erb | 14 --- dummy/bin/bundle | 3 - dummy/bin/rails | 8 -- dummy/bin/rake | 8 -- dummy/bin/spring | 18 ---- dummy/config/application.rb | 29 ----- dummy/config/boot.rb | 4 - dummy/config/environments/development.rb | 37 ------- dummy/config/initializers/assets.rb | 8 -- dummy/config/initializers/session_store.rb | 3 - dummy/config/secrets.yml | 22 ---- .../20141117064807_add_roles_to_users.rb | 5 - dummy/db/seeds.rb | 7 -- dummy/public/logo_square.png | Bin 40474 -> 0 bytes dummy/public/petergate.png | Bin 358943 -> 0 bytes dummy/public/robots.txt | 5 - dummy/test/test_helper.rb | 37 ------- lib/petergate/action_controller/base.rb | 2 +- lib/petergate/active_record/base.rb | 2 +- petergate_test/test/models/user_test.rb | 12 --- {petergate_test => test/employee}/.gitignore | 0 .../employee}/.ruby-version | 0 {petergate_test => test/employee}/Gemfile | 0 {petergate_test => test/employee}/README.md | 0 {petergate_test => test/employee}/Rakefile | 0 .../employee}/app/assets/config/manifest.js | 0 .../employee}/app/assets/images/.keep | 0 .../app/assets/javascripts/application.js | 0 .../employee}/app/assets/javascripts/cable.js | 0 .../app/assets/javascripts/channels}/.keep | 0 .../app/assets/stylesheets/application.css | 0 .../app/channels/application_cable/channel.rb | 0 .../channels/application_cable/connection.rb | 0 .../app/controllers/application_controller.rb | 0 .../app/controllers/blogs_controller.rb | 0 .../employee/app/controllers/concerns}/.keep | 0 .../app/controllers/inheritance_controller.rb | 0 .../app/helpers/application_helper.rb | 0 .../employee}/app/jobs/application_job.rb | 0 .../app/mailers/application_mailer.rb | 0 .../app/models/application_record.rb | 0 .../employee}/app/models/blog.rb | 0 .../employee/app/models/concerns}/.keep | 0 .../employee/app/models/employee.rb | 3 +- .../employee}/app/views/blogs/_form.html.erb | 0 .../employee}/app/views/blogs/create.js.erb | 0 .../app/views/blogs/create.json.jbuilder | 0 .../employee}/app/views/blogs/create.xml | 0 .../employee}/app/views/blogs/destroy.js.erb | 0 .../app/views/blogs/destroy.json.jbuilder | 0 .../employee}/app/views/blogs/destroy.xml | 0 .../employee}/app/views/blogs/edit.html.erb | 0 .../employee}/app/views/blogs/index.html.erb | 0 .../employee}/app/views/blogs/new.html.erb | 0 .../employee}/app/views/blogs/new.js.erb | 0 .../app/views/blogs/new.json.jbuilder | 0 .../employee}/app/views/blogs/new.xml | 0 .../employee}/app/views/blogs/show.html.erb | 0 .../app/views/blogs/show.json.jbuilder | 0 .../employee}/app/views/blogs/update.js.erb | 0 .../app/views/blogs/update.json.jbuilder | 0 .../employee}/app/views/blogs/update.xml | 0 .../app/views/layouts/application.html.erb | 0 .../app/views/layouts/mailer.html.erb | 0 .../app/views/layouts/mailer.text.erb | 0 .../employee}/app/views/test/index.js | 0 {petergate_test => test/employee}/bin/bundle | 0 {petergate_test => test/employee}/bin/rails | 0 {petergate_test => test/employee}/bin/rake | 0 {petergate_test => test/employee}/bin/setup | 0 {petergate_test => test/employee}/bin/spring | 0 {petergate_test => test/employee}/bin/update | 0 {petergate_test => test/employee}/bin/yarn | 0 {petergate_test => test/employee}/config.ru | 0 .../employee}/config/application.rb | 0 .../employee}/config/boot.rb | 0 .../employee}/config/cable.yml | 0 .../employee}/config/credentials.yml.enc | 0 .../employee}/config/database.yml | 0 .../employee}/config/environment.rb | 0 .../config/environments/development.rb | 0 .../config/environments/production.rb | 0 .../employee}/config/environments/test.rb | 0 .../application_controller_renderer.rb | 0 .../employee}/config/initializers/assets.rb | 0 .../initializers/backtrace_silencers.rb | 0 .../initializers/content_security_policy.rb | 0 .../config/initializers/cookies_serializer.rb | 0 .../employee}/config/initializers/devise.rb | 0 .../initializers/filter_parameter_logging.rb | 0 .../config/initializers/inflections.rb | 0 .../config/initializers/mime_types.rb | 0 .../config/initializers/wrap_parameters.rb | 0 .../employee}/config/locales/devise.en.yml | 0 .../employee}/config/locales/en.yml | 0 .../employee}/config/puma.rb | 0 {dummy => test/employee}/config/routes.rb | 4 +- .../employee}/config/spring.rb | 0 .../employee}/config/storage.yml | 0 .../db/migrate/20141117063228_create_blogs.rb | 0 .../20141117064643_devise_create_employees.rb | 12 +-- .../20141117064807_add_roles_to_employees.rb | 5 + {dummy => test/employee}/db/schema.rb | 38 ++++--- {petergate_test => test/employee}/db/seeds.rb | 0 .../employee/lib/assets}/.keep | 0 .../assets => test/employee/lib/tasks}/.keep | 0 {dummy/lib/tasks => test/employee/log}/.keep | 0 .../employee}/package.json | 0 .../employee}/public/404.html | 0 .../employee}/public/422.html | 0 .../employee}/public/500.html | 0 .../public/apple-touch-icon-precomposed.png | 0 .../employee}/public/apple-touch-icon.png | 0 {dummy => test/employee}/public/favicon.ico | 0 .../employee}/public/robots.txt | 0 {dummy/log => test/employee/storage}/.keep | 0 .../employee}/test/controllers/.keep | 0 .../test/controllers/base_controller_test.rb | 0 .../blogs_multiple_controller_test.rb | 100 +++++++++--------- .../blogs_singular_controller_test.rb | 75 ++++++------- .../test/controllers/test_controller_test.rb | 15 +-- {dummy => test/employee}/test/fixtures/.keep | 0 .../employee}/test/fixtures/blogs.yml | 0 .../employee/test/fixtures/employees.yml | 0 {dummy => test/employee}/test/helpers/.keep | 0 .../employee}/test/integration/.keep | 0 {dummy => test/employee}/test/mailers/.keep | 0 {dummy => test/employee}/test/models/.keep | 0 .../employee}/test/models/blog_test.rb | 0 test/employee/test/models/employee_test.rb | 12 +++ test/employee/test/test_helper.rb | 51 +++++++++ .../javascripts => test/employee/tmp}/.keep | 0 .../employee/vendor}/.keep | 0 {dummy => test/user}/.gitignore | 19 +++- test/user/.ruby-version | 1 + test/user/Gemfile | 67 ++++++++++++ dummy/README.rdoc => test/user/README.md | 6 +- {dummy => test/user}/Rakefile | 3 +- test/user/app/assets/config/manifest.js | 3 + .../user}/app/assets/images/.keep | 0 .../app/assets/javascripts/application.js | 12 +-- test/user/app/assets/javascripts/cable.js | 13 +++ .../app/assets/javascripts/channels/.keep | 0 .../app/assets/stylesheets/application.css | 10 +- .../app/channels/application_cable/channel.rb | 4 + .../channels/application_cable/connection.rb | 4 + .../app/controllers/application_controller.rb | 2 + .../user}/app/controllers/blogs_controller.rb | 2 +- .../user}/app/controllers/concerns/.keep | 0 .../app/controllers/inheritance_controller.rb | 0 .../user}/app/helpers/application_helper.rb | 0 test/user/app/jobs/application_job.rb | 2 + test/user/app/mailers/application_mailer.rb | 4 + test/user/app/models/application_record.rb | 3 + test/user/app/models/blog.rb | 3 + .../user}/app/models/concerns/.keep | 0 .../user}/app/models/user.rb | 0 .../user}/app/views/blogs/_form.html.erb | 0 .../user/app/views/blogs/create.js.erb | 0 .../user/app/views/blogs/create.json.jbuilder | 0 .../user/app/views/blogs/create.xml | 0 .../user/app/views/blogs/destroy.js.erb | 0 .../app/views/blogs/destroy.json.jbuilder | 0 .../user/app/views/blogs/destroy.xml | 0 .../user}/app/views/blogs/edit.html.erb | 0 .../user}/app/views/blogs/index.html.erb | 0 .../user}/app/views/blogs/new.html.erb | 0 .../user/app/views/blogs/new.js.erb | 0 .../user/app/views/blogs/new.json.jbuilder | 0 .../user/app/views/blogs/new.xml | 0 .../user}/app/views/blogs/show.html.erb | 0 .../user}/app/views/blogs/show.json.jbuilder | 0 .../user/app/views/blogs/update.js.erb | 0 .../user/app/views/blogs/update.json.jbuilder | 0 .../user/app/views/blogs/update.xml | 0 .../app/views/layouts/application.html.erb | 17 +++ test/user/app/views/layouts/mailer.html.erb | 13 +++ test/user/app/views/layouts/mailer.text.erb | 1 + .../user/app/views/test/index.js | 0 test/user/bin/bundle | 3 + test/user/bin/rails | 9 ++ test/user/bin/rake | 9 ++ test/user/bin/setup | 36 +++++++ test/user/bin/spring | 17 +++ test/user/bin/update | 31 ++++++ test/user/bin/yarn | 11 ++ {dummy => test/user}/config.ru | 3 +- test/user/config/application.rb | 19 ++++ test/user/config/boot.rb | 4 + test/user/config/cable.yml | 10 ++ test/user/config/credentials.yml.enc | 1 + {dummy => test/user}/config/database.yml | 2 +- {dummy => test/user}/config/environment.rb | 2 +- test/user/config/environments/development.rb | 62 +++++++++++ .../user}/config/environments/production.rb | 60 +++++++---- .../user}/config/environments/test.rb | 13 ++- .../application_controller_renderer.rb | 8 ++ test/user/config/initializers/assets.rb | 14 +++ .../initializers/backtrace_silencers.rb | 0 .../initializers/content_security_policy.rb | 25 +++++ .../config/initializers/cookies_serializer.rb | 4 +- .../user}/config/initializers/devise.rb | 92 +++++++++++----- .../initializers/filter_parameter_logging.rb | 0 .../user}/config/initializers/inflections.rb | 0 .../user}/config/initializers/mime_types.rb | 0 .../config/initializers/wrap_parameters.rb | 4 +- .../user}/config/locales/devise.en.yml | 5 + {dummy => test/user}/config/locales/en.yml | 10 ++ test/user/config/puma.rb | 34 ++++++ .../user}/config/routes.rb | 0 test/user/config/spring.rb | 6 ++ test/user/config/storage.yml | 34 ++++++ .../db/migrate/20141117063228_create_blogs.rb | 2 +- .../20141117064643_devise_create_users.rb | 0 .../20141117064807_add_roles_to_users.rb | 0 {petergate_test => test/user}/db/schema.rb | 0 test/user/db/seeds.rb | 7 ++ test/user/lib/assets/.keep | 0 test/user/lib/tasks/.keep | 0 test/user/log/.keep | 0 test/user/package.json | 5 + {dummy => test/user}/public/404.html | 12 +-- {dummy => test/user}/public/422.html | 12 +-- {dummy => test/user}/public/500.html | 12 +-- .../public/apple-touch-icon-precomposed.png | 0 test/user/public/apple-touch-icon.png | 0 test/user/public/favicon.ico | 0 test/user/public/robots.txt | 1 + test/user/storage/.keep | 0 test/user/test/controllers/.keep | 0 .../test/controllers/base_controller_test.rb | 0 .../blogs_multiple_controller_test.rb | 0 .../blogs_singular_controller_test.rb | 0 .../test/controllers/test_controller_test.rb | 0 test/user/test/fixtures/.keep | 0 .../user}/test/fixtures/blogs.yml | 0 .../user}/test/fixtures/users.yml | 0 test/user/test/helpers/.keep | 0 test/user/test/integration/.keep | 0 test/user/test/mailers/.keep | 0 test/user/test/models/.keep | 0 .../user}/test/models/blog_test.rb | 0 {dummy => test/user}/test/models/user_test.rb | 0 .../user}/test/test_helper.rb | 0 test/user/tmp/.keep | 0 test/user/vendor/.keep | 0 254 files changed, 875 insertions(+), 572 deletions(-) delete mode 100644 dummy/app/assets/javascripts/blogs.js.coffee delete mode 100644 dummy/app/assets/stylesheets/blogs.css.scss delete mode 100644 dummy/app/assets/stylesheets/scaffolds.css.scss delete mode 100644 dummy/app/controllers/application_controller.rb delete mode 100644 dummy/app/models/blog.rb delete mode 100644 dummy/app/views/blogs/index.json.jbuilder delete mode 100644 dummy/app/views/layouts/application.html.erb delete mode 100755 dummy/bin/bundle delete mode 100755 dummy/bin/rails delete mode 100755 dummy/bin/rake delete mode 100755 dummy/bin/spring delete mode 100644 dummy/config/application.rb delete mode 100644 dummy/config/boot.rb delete mode 100644 dummy/config/environments/development.rb delete mode 100644 dummy/config/initializers/assets.rb delete mode 100644 dummy/config/initializers/session_store.rb delete mode 100644 dummy/config/secrets.yml delete mode 100644 dummy/db/migrate/20141117064807_add_roles_to_users.rb delete mode 100644 dummy/db/seeds.rb delete mode 100644 dummy/public/logo_square.png delete mode 100644 dummy/public/petergate.png delete mode 100644 dummy/public/robots.txt delete mode 100644 dummy/test/test_helper.rb delete mode 100644 petergate_test/test/models/user_test.rb rename {petergate_test => test/employee}/.gitignore (100%) rename {petergate_test => test/employee}/.ruby-version (100%) rename {petergate_test => test/employee}/Gemfile (100%) rename {petergate_test => test/employee}/README.md (100%) rename {petergate_test => test/employee}/Rakefile (100%) rename {petergate_test => test/employee}/app/assets/config/manifest.js (100%) rename {dummy => test/employee}/app/assets/images/.keep (100%) rename {petergate_test => test/employee}/app/assets/javascripts/application.js (100%) rename {petergate_test => test/employee}/app/assets/javascripts/cable.js (100%) rename {dummy/app/controllers/concerns => test/employee/app/assets/javascripts/channels}/.keep (100%) rename {petergate_test => test/employee}/app/assets/stylesheets/application.css (100%) rename {petergate_test => test/employee}/app/channels/application_cable/channel.rb (100%) rename {petergate_test => test/employee}/app/channels/application_cable/connection.rb (100%) rename {petergate_test => test/employee}/app/controllers/application_controller.rb (100%) rename {petergate_test => test/employee}/app/controllers/blogs_controller.rb (100%) rename {dummy/app/mailers => test/employee/app/controllers/concerns}/.keep (100%) rename {dummy => test/employee}/app/controllers/inheritance_controller.rb (100%) rename {dummy => test/employee}/app/helpers/application_helper.rb (100%) rename {petergate_test => test/employee}/app/jobs/application_job.rb (100%) rename {petergate_test => test/employee}/app/mailers/application_mailer.rb (100%) rename {petergate_test => test/employee}/app/models/application_record.rb (100%) rename {petergate_test => test/employee}/app/models/blog.rb (100%) rename {dummy/app/models => test/employee/app/models/concerns}/.keep (100%) rename dummy/app/models/user.rb => test/employee/app/models/employee.rb (96%) rename {dummy => test/employee}/app/views/blogs/_form.html.erb (100%) rename {petergate_test => test/employee}/app/views/blogs/create.js.erb (100%) rename {petergate_test => test/employee}/app/views/blogs/create.json.jbuilder (100%) rename {petergate_test => test/employee}/app/views/blogs/create.xml (100%) rename {petergate_test => test/employee}/app/views/blogs/destroy.js.erb (100%) rename {petergate_test => test/employee}/app/views/blogs/destroy.json.jbuilder (100%) rename {petergate_test => test/employee}/app/views/blogs/destroy.xml (100%) rename {dummy => test/employee}/app/views/blogs/edit.html.erb (100%) rename {dummy => test/employee}/app/views/blogs/index.html.erb (100%) rename {dummy => test/employee}/app/views/blogs/new.html.erb (100%) rename {petergate_test => test/employee}/app/views/blogs/new.js.erb (100%) rename {petergate_test => test/employee}/app/views/blogs/new.json.jbuilder (100%) rename {petergate_test => test/employee}/app/views/blogs/new.xml (100%) rename {dummy => test/employee}/app/views/blogs/show.html.erb (100%) rename {dummy => test/employee}/app/views/blogs/show.json.jbuilder (100%) rename {petergate_test => test/employee}/app/views/blogs/update.js.erb (100%) rename {petergate_test => test/employee}/app/views/blogs/update.json.jbuilder (100%) rename {petergate_test => test/employee}/app/views/blogs/update.xml (100%) rename {petergate_test => test/employee}/app/views/layouts/application.html.erb (100%) rename {petergate_test => test/employee}/app/views/layouts/mailer.html.erb (100%) rename {petergate_test => test/employee}/app/views/layouts/mailer.text.erb (100%) rename {petergate_test => test/employee}/app/views/test/index.js (100%) rename {petergate_test => test/employee}/bin/bundle (100%) rename {petergate_test => test/employee}/bin/rails (100%) rename {petergate_test => test/employee}/bin/rake (100%) rename {petergate_test => test/employee}/bin/setup (100%) rename {petergate_test => test/employee}/bin/spring (100%) rename {petergate_test => test/employee}/bin/update (100%) rename {petergate_test => test/employee}/bin/yarn (100%) rename {petergate_test => test/employee}/config.ru (100%) rename {petergate_test => test/employee}/config/application.rb (100%) rename {petergate_test => test/employee}/config/boot.rb (100%) rename {petergate_test => test/employee}/config/cable.yml (100%) rename {petergate_test => test/employee}/config/credentials.yml.enc (100%) rename {petergate_test => test/employee}/config/database.yml (100%) rename {petergate_test => test/employee}/config/environment.rb (100%) rename {petergate_test => test/employee}/config/environments/development.rb (100%) rename {petergate_test => test/employee}/config/environments/production.rb (100%) rename {petergate_test => test/employee}/config/environments/test.rb (100%) rename {petergate_test => test/employee}/config/initializers/application_controller_renderer.rb (100%) rename {petergate_test => test/employee}/config/initializers/assets.rb (100%) rename {dummy => test/employee}/config/initializers/backtrace_silencers.rb (100%) rename {petergate_test => test/employee}/config/initializers/content_security_policy.rb (100%) rename {petergate_test => test/employee}/config/initializers/cookies_serializer.rb (100%) rename {petergate_test => test/employee}/config/initializers/devise.rb (100%) rename {dummy => test/employee}/config/initializers/filter_parameter_logging.rb (100%) rename {dummy => test/employee}/config/initializers/inflections.rb (100%) rename {dummy => test/employee}/config/initializers/mime_types.rb (100%) rename {petergate_test => test/employee}/config/initializers/wrap_parameters.rb (100%) rename {petergate_test => test/employee}/config/locales/devise.en.yml (100%) rename {petergate_test => test/employee}/config/locales/en.yml (100%) rename {petergate_test => test/employee}/config/puma.rb (100%) rename {dummy => test/employee}/config/routes.rb (95%) rename {petergate_test => test/employee}/config/spring.rb (100%) rename {petergate_test => test/employee}/config/storage.yml (100%) rename {petergate_test => test/employee}/db/migrate/20141117063228_create_blogs.rb (100%) rename dummy/db/migrate/20141117064643_devise_create_users.rb => test/employee/db/migrate/20141117064643_devise_create_employees.rb (74%) create mode 100644 test/employee/db/migrate/20141117064807_add_roles_to_employees.rb rename {dummy => test/employee}/db/schema.rb (51%) rename {petergate_test => test/employee}/db/seeds.rb (100%) rename {dummy/app/models/concerns => test/employee/lib/assets}/.keep (100%) rename {dummy/lib/assets => test/employee/lib/tasks}/.keep (100%) rename {dummy/lib/tasks => test/employee/log}/.keep (100%) rename {petergate_test => test/employee}/package.json (100%) rename {petergate_test => test/employee}/public/404.html (100%) rename {petergate_test => test/employee}/public/422.html (100%) rename {petergate_test => test/employee}/public/500.html (100%) rename {petergate_test => test/employee}/public/apple-touch-icon-precomposed.png (100%) rename {petergate_test => test/employee}/public/apple-touch-icon.png (100%) rename {dummy => test/employee}/public/favicon.ico (100%) rename {petergate_test => test/employee}/public/robots.txt (100%) rename {dummy/log => test/employee/storage}/.keep (100%) rename {dummy => test/employee}/test/controllers/.keep (100%) rename {dummy => test/employee}/test/controllers/base_controller_test.rb (100%) rename {dummy => test/employee}/test/controllers/blogs_multiple_controller_test.rb (65%) rename {dummy => test/employee}/test/controllers/blogs_singular_controller_test.rb (64%) rename {dummy => test/employee}/test/controllers/test_controller_test.rb (77%) rename {dummy => test/employee}/test/fixtures/.keep (100%) rename {dummy => test/employee}/test/fixtures/blogs.yml (100%) rename dummy/test/fixtures/users.yml => test/employee/test/fixtures/employees.yml (100%) rename {dummy => test/employee}/test/helpers/.keep (100%) rename {dummy => test/employee}/test/integration/.keep (100%) rename {dummy => test/employee}/test/mailers/.keep (100%) rename {dummy => test/employee}/test/models/.keep (100%) rename {dummy => test/employee}/test/models/blog_test.rb (100%) create mode 100644 test/employee/test/models/employee_test.rb create mode 100644 test/employee/test/test_helper.rb rename {dummy/vendor/assets/javascripts => test/employee/tmp}/.keep (100%) rename {dummy/vendor/assets/stylesheets => test/employee/vendor}/.keep (100%) rename {dummy => test/user}/.gitignore (64%) create mode 100644 test/user/.ruby-version create mode 100644 test/user/Gemfile rename dummy/README.rdoc => test/user/README.md (76%) rename {dummy => test/user}/Rakefile (70%) create mode 100644 test/user/app/assets/config/manifest.js rename {petergate_test => test/user}/app/assets/images/.keep (100%) rename {dummy => test/user}/app/assets/javascripts/application.js (50%) create mode 100644 test/user/app/assets/javascripts/cable.js rename {petergate_test => test/user}/app/assets/javascripts/channels/.keep (100%) rename {dummy => test/user}/app/assets/stylesheets/application.css (56%) create mode 100644 test/user/app/channels/application_cable/channel.rb create mode 100644 test/user/app/channels/application_cable/connection.rb create mode 100644 test/user/app/controllers/application_controller.rb rename {dummy => test/user}/app/controllers/blogs_controller.rb (97%) rename {petergate_test => test/user}/app/controllers/concerns/.keep (100%) rename {petergate_test => test/user}/app/controllers/inheritance_controller.rb (100%) rename {petergate_test => test/user}/app/helpers/application_helper.rb (100%) create mode 100644 test/user/app/jobs/application_job.rb create mode 100644 test/user/app/mailers/application_mailer.rb create mode 100644 test/user/app/models/application_record.rb create mode 100644 test/user/app/models/blog.rb rename {petergate_test => test/user}/app/models/concerns/.keep (100%) rename {petergate_test => test/user}/app/models/user.rb (100%) rename {petergate_test => test/user}/app/views/blogs/_form.html.erb (100%) rename petergate_test/lib/assets/.keep => test/user/app/views/blogs/create.js.erb (100%) rename petergate_test/lib/tasks/.keep => test/user/app/views/blogs/create.json.jbuilder (100%) rename petergate_test/log/.keep => test/user/app/views/blogs/create.xml (100%) rename petergate_test/public/favicon.ico => test/user/app/views/blogs/destroy.js.erb (100%) rename petergate_test/storage/.keep => test/user/app/views/blogs/destroy.json.jbuilder (100%) rename petergate_test/test/controllers/.keep => test/user/app/views/blogs/destroy.xml (100%) rename {petergate_test => test/user}/app/views/blogs/edit.html.erb (100%) rename {petergate_test => test/user}/app/views/blogs/index.html.erb (100%) rename {petergate_test => test/user}/app/views/blogs/new.html.erb (100%) rename petergate_test/test/fixtures/.keep => test/user/app/views/blogs/new.js.erb (100%) rename petergate_test/test/helpers/.keep => test/user/app/views/blogs/new.json.jbuilder (100%) rename petergate_test/test/integration/.keep => test/user/app/views/blogs/new.xml (100%) rename {petergate_test => test/user}/app/views/blogs/show.html.erb (100%) rename {petergate_test => test/user}/app/views/blogs/show.json.jbuilder (100%) rename petergate_test/test/mailers/.keep => test/user/app/views/blogs/update.js.erb (100%) rename petergate_test/test/models/.keep => test/user/app/views/blogs/update.json.jbuilder (100%) rename petergate_test/tmp/.keep => test/user/app/views/blogs/update.xml (100%) create mode 100644 test/user/app/views/layouts/application.html.erb create mode 100644 test/user/app/views/layouts/mailer.html.erb create mode 100644 test/user/app/views/layouts/mailer.text.erb rename petergate_test/vendor/.keep => test/user/app/views/test/index.js (100%) create mode 100755 test/user/bin/bundle create mode 100755 test/user/bin/rails create mode 100755 test/user/bin/rake create mode 100755 test/user/bin/setup create mode 100755 test/user/bin/spring create mode 100755 test/user/bin/update create mode 100755 test/user/bin/yarn rename {dummy => test/user}/config.ru (59%) create mode 100644 test/user/config/application.rb create mode 100644 test/user/config/boot.rb create mode 100644 test/user/config/cable.yml create mode 100644 test/user/config/credentials.yml.enc rename {dummy => test/user}/config/database.yml (91%) rename {dummy => test/user}/config/environment.rb (64%) create mode 100644 test/user/config/environments/development.rb rename {dummy => test/user}/config/environments/production.rb (56%) rename {dummy => test/user}/config/environments/test.rb (79%) create mode 100644 test/user/config/initializers/application_controller_renderer.rb create mode 100644 test/user/config/initializers/assets.rb rename {petergate_test => test/user}/config/initializers/backtrace_silencers.rb (100%) create mode 100644 test/user/config/initializers/content_security_policy.rb rename {dummy => test/user}/config/initializers/cookies_serializer.rb (51%) rename {dummy => test/user}/config/initializers/devise.rb (77%) rename {petergate_test => test/user}/config/initializers/filter_parameter_logging.rb (100%) rename {petergate_test => test/user}/config/initializers/inflections.rb (100%) rename {petergate_test => test/user}/config/initializers/mime_types.rb (100%) rename {dummy => test/user}/config/initializers/wrap_parameters.rb (80%) rename {dummy => test/user}/config/locales/devise.en.yml (94%) rename {dummy => test/user}/config/locales/en.yml (74%) create mode 100644 test/user/config/puma.rb rename {petergate_test => test/user}/config/routes.rb (100%) create mode 100644 test/user/config/spring.rb create mode 100644 test/user/config/storage.yml rename {dummy => test/user}/db/migrate/20141117063228_create_blogs.rb (72%) rename {petergate_test => test/user}/db/migrate/20141117064643_devise_create_users.rb (100%) rename {petergate_test => test/user}/db/migrate/20141117064807_add_roles_to_users.rb (100%) rename {petergate_test => test/user}/db/schema.rb (100%) create mode 100644 test/user/db/seeds.rb create mode 100644 test/user/lib/assets/.keep create mode 100644 test/user/lib/tasks/.keep create mode 100644 test/user/log/.keep create mode 100644 test/user/package.json rename {dummy => test/user}/public/404.html (86%) rename {dummy => test/user}/public/422.html (86%) rename {dummy => test/user}/public/500.html (85%) create mode 100644 test/user/public/apple-touch-icon-precomposed.png create mode 100644 test/user/public/apple-touch-icon.png create mode 100644 test/user/public/favicon.ico create mode 100644 test/user/public/robots.txt create mode 100644 test/user/storage/.keep create mode 100644 test/user/test/controllers/.keep rename {petergate_test => test/user}/test/controllers/base_controller_test.rb (100%) rename {petergate_test => test/user}/test/controllers/blogs_multiple_controller_test.rb (100%) rename {petergate_test => test/user}/test/controllers/blogs_singular_controller_test.rb (100%) rename {petergate_test => test/user}/test/controllers/test_controller_test.rb (100%) create mode 100644 test/user/test/fixtures/.keep rename {petergate_test => test/user}/test/fixtures/blogs.yml (100%) rename {petergate_test => test/user}/test/fixtures/users.yml (100%) create mode 100644 test/user/test/helpers/.keep create mode 100644 test/user/test/integration/.keep create mode 100644 test/user/test/mailers/.keep create mode 100644 test/user/test/models/.keep rename {petergate_test => test/user}/test/models/blog_test.rb (100%) rename {dummy => test/user}/test/models/user_test.rb (100%) rename {petergate_test => test/user}/test/test_helper.rb (100%) create mode 100644 test/user/tmp/.keep create mode 100644 test/user/vendor/.keep diff --git a/.travis.yml b/.travis.yml index fb47f0f..83de30a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,12 @@ language: ruby + rvm: - - "2.3.1" -before_script: "bundle install && cd dummy && rake db:create && rake db:migrate" -script: "bundle exec rake test" + - "2.5.1" + +before_script: + - "cd test/user && rails db:create db:migrate" + - "cd test/employee && rails db:create db:migrate" + +script: + - "cd test/user && bundle exec rails test" + - "cd test/employee && bundle exec rails test" diff --git a/Gemfile b/Gemfile index c3c7236..3f0f548 100644 --- a/Gemfile +++ b/Gemfile @@ -1,45 +1,4 @@ source 'https://rubygems.org' -# ruby '2.3.1' # Specify your gem's dependencies in petergate.gemspec gemspec -# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -# gem 'rails', '~> 4.2.7.1' -# -# # Use sqlite3 as the database for Active Record -# gem 'sqlite3' -# # Use SCSS for stylesheets -# gem 'sass-rails', '~> 4.0.3' -# # Use Uglifier as compressor for JavaScript assets -# gem 'uglifier', '>= 1.3.0' -# # Use CoffeeScript for .js.coffee assets and views -# gem 'coffee-rails', '~> 4.0.0' -# # See https://github.com/sstephenson/execjs#readme for more supported runtimes -# # gem 'therubyracer', platforms: :ruby -# -# # Use jquery as the JavaScript library -# gem 'jquery-rails' -# # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks -# gem 'turbolinks' -# gem "minitest-rails" -# gem "minitest-reporters" -# # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -# gem 'jbuilder', '~> 2.0' -# # bundle exec rake doc:rails generates the API under doc/api. -# gem 'sdoc', '~> 0.4.0', group: :doc -# -# # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring -# gem 'devise' -# -# # Use ActiveModel has_secure_password -# # gem 'bcrypt', '~> 3.1.7' -# -# # Use unicorn as the app server -# # gem 'unicorn' -# -# # Use Capistrano for deployment -# # gem 'capistrano-rails', group: :development -# -# # Use debugger -# # gem 'debugger', group: [:development, :test] -# diff --git a/dummy/app/assets/javascripts/blogs.js.coffee b/dummy/app/assets/javascripts/blogs.js.coffee deleted file mode 100644 index 24f83d1..0000000 --- a/dummy/app/assets/javascripts/blogs.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/dummy/app/assets/stylesheets/blogs.css.scss b/dummy/app/assets/stylesheets/blogs.css.scss deleted file mode 100644 index 59c4c25..0000000 --- a/dummy/app/assets/stylesheets/blogs.css.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the Blogs controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/dummy/app/assets/stylesheets/scaffolds.css.scss b/dummy/app/assets/stylesheets/scaffolds.css.scss deleted file mode 100644 index 6ec6a8f..0000000 --- a/dummy/app/assets/stylesheets/scaffolds.css.scss +++ /dev/null @@ -1,69 +0,0 @@ -body { - background-color: #fff; - color: #333; - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -p, ol, ul, td { - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -pre { - background-color: #eee; - padding: 10px; - font-size: 11px; -} - -a { - color: #000; - &:visited { - color: #666; - } - &:hover { - color: #fff; - background-color: #000; - } -} - -div { - &.field, &.actions { - margin-bottom: 10px; - } -} - -#notice { - color: green; -} - -.field_with_errors { - padding: 2px; - background-color: red; - display: table; -} - -#error_explanation { - width: 450px; - border: 2px solid red; - padding: 7px; - padding-bottom: 0; - margin-bottom: 20px; - background-color: #f0f0f0; - h2 { - text-align: left; - font-weight: bold; - padding: 5px 5px 5px 15px; - font-size: 12px; - margin: -7px; - margin-bottom: 0px; - background-color: #c00; - color: #fff; - } - ul li { - font-size: 12px; - list-style: square; - } -} diff --git a/dummy/app/controllers/application_controller.rb b/dummy/app/controllers/application_controller.rb deleted file mode 100644 index d83690e..0000000 --- a/dummy/app/controllers/application_controller.rb +++ /dev/null @@ -1,5 +0,0 @@ -class ApplicationController < ActionController::Base - # Prevent CSRF attacks by raising an exception. - # For APIs, you may want to use :null_session instead. - protect_from_forgery with: :exception -end diff --git a/dummy/app/models/blog.rb b/dummy/app/models/blog.rb deleted file mode 100644 index 0ad9473..0000000 --- a/dummy/app/models/blog.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Blog < ActiveRecord::Base -end diff --git a/dummy/app/views/blogs/index.json.jbuilder b/dummy/app/views/blogs/index.json.jbuilder deleted file mode 100644 index 6ad723c..0000000 --- a/dummy/app/views/blogs/index.json.jbuilder +++ /dev/null @@ -1,4 +0,0 @@ -json.array!(@blogs) do |blog| - json.extract! blog, :id, :title, :content - json.url blog_url(blog, format: :json) -end diff --git a/dummy/app/views/layouts/application.html.erb b/dummy/app/views/layouts/application.html.erb deleted file mode 100644 index 593a778..0000000 --- a/dummy/app/views/layouts/application.html.erb +++ /dev/null @@ -1,14 +0,0 @@ - - - - Dummy - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> - <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> - <%= csrf_meta_tags %> - - - -<%= yield %> - - - diff --git a/dummy/bin/bundle b/dummy/bin/bundle deleted file mode 100755 index 66e9889..0000000 --- a/dummy/bin/bundle +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -load Gem.bin_path('bundler', 'bundle') diff --git a/dummy/bin/rails b/dummy/bin/rails deleted file mode 100755 index 7feb6a3..0000000 --- a/dummy/bin/rails +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path("../spring", __FILE__) -rescue LoadError -end -APP_PATH = File.expand_path('../../config/application', __FILE__) -require_relative '../config/boot' -require 'rails/commands' diff --git a/dummy/bin/rake b/dummy/bin/rake deleted file mode 100755 index 8017a02..0000000 --- a/dummy/bin/rake +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path("../spring", __FILE__) -rescue LoadError -end -require_relative '../config/boot' -require 'rake' -Rake.application.run diff --git a/dummy/bin/spring b/dummy/bin/spring deleted file mode 100755 index 253ec37..0000000 --- a/dummy/bin/spring +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env ruby - -# This file loads spring without using Bundler, in order to be fast -# It gets overwritten when you run the `spring binstub` command - -unless defined?(Spring) - require "rubygems" - require "bundler" - - if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ spring \((.*?)\)$.*?^$/m) - ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR) - ENV["GEM_HOME"] = "" - Gem.paths = ENV - - gem "spring", match[1] - require "spring/binstub" - end -end diff --git a/dummy/config/application.rb b/dummy/config/application.rb deleted file mode 100644 index 3217564..0000000 --- a/dummy/config/application.rb +++ /dev/null @@ -1,29 +0,0 @@ -require File.expand_path('../boot', __FILE__) - -require 'rails/all' - -# Require the gems listed in Gemfile, including any gems -# you've limited to :test, :development, or :production. -Bundler.require(*Rails.groups) -require "petergate" - -module Dummy - class Application < Rails::Application - config.generators do |g| - g.test_framework :minitest, spec: true, fixture: true - g.helper false - g.view_specs false - end - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers - # -- all .rb files in that directory are automatically loaded. - - # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. - # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. - # config.time_zone = 'Central Time (US & Canada)' - - # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. - # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] - # config.i18n.default_locale = :de - end -end diff --git a/dummy/config/boot.rb b/dummy/config/boot.rb deleted file mode 100644 index 5e5f0c1..0000000 --- a/dummy/config/boot.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Set up gems listed in the Gemfile. -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) - -require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) diff --git a/dummy/config/environments/development.rb b/dummy/config/environments/development.rb deleted file mode 100644 index ddf0e90..0000000 --- a/dummy/config/environments/development.rb +++ /dev/null @@ -1,37 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - - # Do not eager load code on boot. - config.eager_load = false - - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - # Print deprecation notices to the Rails logger. - config.active_support.deprecation = :log - - # Raise an error on page load if there are pending migrations. - config.active_record.migration_error = :page_load - - # Debug mode disables concatenation and preprocessing of assets. - # This option may cause significant delays in view rendering with a large - # number of complex assets. - config.assets.debug = true - - # Adds additional error checking when serving assets at runtime. - # Checks for improperly declared sprockets dependencies. - # Raises helpful error messages. - config.assets.raise_runtime_errors = true - - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true -end diff --git a/dummy/config/initializers/assets.rb b/dummy/config/initializers/assets.rb deleted file mode 100644 index d2f4ec3..0000000 --- a/dummy/config/initializers/assets.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' - -# Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/dummy/config/initializers/session_store.rb b/dummy/config/initializers/session_store.rb deleted file mode 100644 index e766b67..0000000 --- a/dummy/config/initializers/session_store.rb +++ /dev/null @@ -1,3 +0,0 @@ -# Be sure to restart your server when you modify this file. - -Rails.application.config.session_store :cookie_store, key: '_dummy_session' diff --git a/dummy/config/secrets.yml b/dummy/config/secrets.yml deleted file mode 100644 index 605d1e9..0000000 --- a/dummy/config/secrets.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Your secret key is used for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! - -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. -# You can use `rake secret` to generate a secure secret key. - -# Make sure the secrets in this file are kept private -# if you're sharing your code publicly. - -development: - secret_key_base: 385348a0bf7dfc01fd9d1b1a69be6bab7c52fd3330e8d3b3919ab2a496fe27b1bc376f3aa0ba91df412fd397808ab15e9f426cf4a779f3d14106511895302486 - -test: - secret_key_base: fcc71ae546540f41e59342cd119ecb621517950284b46e0c2a43b4a7f1d8d7b482b329a3c7d7524eb784913fbe16137f6a5a59f08b8a9e44d9ee499c6d15d12a - -# Do not keep production secrets in the repository, -# instead read values from the environment. -production: - secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/dummy/db/migrate/20141117064807_add_roles_to_users.rb b/dummy/db/migrate/20141117064807_add_roles_to_users.rb deleted file mode 100644 index 18e9fb9..0000000 --- a/dummy/db/migrate/20141117064807_add_roles_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRolesToUsers < ActiveRecord::Migration - def change - add_column :users, :roles, :string - end -end diff --git a/dummy/db/seeds.rb b/dummy/db/seeds.rb deleted file mode 100644 index 4edb1e8..0000000 --- a/dummy/db/seeds.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). -# -# Examples: -# -# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) -# Mayor.create(name: 'Emanuel', city: cities.first) diff --git a/dummy/public/logo_square.png b/dummy/public/logo_square.png deleted file mode 100644 index 23089647837183ccdbaf2970a6856675df4b1bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40474 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%0A5we05y& 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

ZAI0M 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 C^LH%( diff --git a/dummy/public/robots.txt b/dummy/public/robots.txt deleted file mode 100644 index 3c9c7c0..0000000 --- a/dummy/public/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-agent: * -# Disallow: / diff --git a/dummy/test/test_helper.rb b/dummy/test/test_helper.rb deleted file mode 100644 index 205a5d5..0000000 --- a/dummy/test/test_helper.rb +++ /dev/null @@ -1,37 +0,0 @@ -ENV['RAILS_ENV'] = 'test' -require File.expand_path("../../config/environment", __FILE__) -require "rails/test_help" -require "minitest/rails" - -# To add Capybara feature tests add `gem "minitest-rails-capybara"` -# to the test group in the Gemfile and uncomment the following: -# require "minitest/rails/capybara" - -require "minitest/pride" -require "minitest/reporters" -require "minitest/autorun" -class ActiveSupport::TestCase - Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new - ActiveRecord::Migration.check_pending! - fixtures :all - - # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. -end - -class ActionController::TestCase - include Devise::TestHelpers - def create_user_and_login(email: "user@example.com", password: "youllneverguess") - u = User.create(email: email, password: password, password_confirmation: password, roles: :user) - sign_in(u) - end - - def create_admin_and_login(email: "user@example.com", password: "youllneverguess") - u = User.create(email: email, password: password, password_confirmation: password, roles: :root_admin) - sign_in(u) - end - - def create_company_admin_and_login(email: "user@example.com", password: "youllneverguess") - u = User.create(email: email, password: password, password_confirmation: password, roles: :company_admin) - sign_in(u) - end -end diff --git a/lib/petergate/action_controller/base.rb b/lib/petergate/action_controller/base.rb index 53d920e..933537b 100644 --- a/lib/petergate/action_controller/base.rb +++ b/lib/petergate/action_controller/base.rb @@ -109,7 +109,7 @@ def unauthorized! respond_to do |format| format.any(:js, :json, :xml) { render nothing: true, status: :unauthorized } format.html do - authenticate_user! + self.send("authenticate_" + Petergate.auth_class + "!") end end end diff --git a/lib/petergate/active_record/base.rb b/lib/petergate/active_record/base.rb index 39b7ddf..8f07226 100644 --- a/lib/petergate/active_record/base.rb +++ b/lib/petergate/active_record/base.rb @@ -21,7 +21,7 @@ def petergate(roles: [:admin], multiple: true) end instance_eval do - const_set('ROLES', (roles + [:user]).uniq.map(&:to_sym)) unless defined?(User::ROLES) + const_set('ROLES', (roles + [:user]).uniq.map(&:to_sym)) unless self.constants.include?(:ROLES) if multiple roles.each do |role| diff --git a/petergate_test/test/models/user_test.rb b/petergate_test/test/models/user_test.rb deleted file mode 100644 index b06087e..0000000 --- a/petergate_test/test/models/user_test.rb +++ /dev/null @@ -1,12 +0,0 @@ -require "test_helper" - -describe Blog do - let(:user) { - User.petergate(roles: [:root_admin, :company_admin], multiple: false) - User.create(email: "company_admin2@example.com", password: "password1", password_confirmation: "password1", role: :company_admin) - } - - it "must be valid" do - user.must_be :valid? - end -end diff --git a/petergate_test/.gitignore b/test/employee/.gitignore similarity index 100% rename from petergate_test/.gitignore rename to test/employee/.gitignore diff --git a/petergate_test/.ruby-version b/test/employee/.ruby-version similarity index 100% rename from petergate_test/.ruby-version rename to test/employee/.ruby-version diff --git a/petergate_test/Gemfile b/test/employee/Gemfile similarity index 100% rename from petergate_test/Gemfile rename to test/employee/Gemfile diff --git a/petergate_test/README.md b/test/employee/README.md similarity index 100% rename from petergate_test/README.md rename to test/employee/README.md diff --git a/petergate_test/Rakefile b/test/employee/Rakefile similarity index 100% rename from petergate_test/Rakefile rename to test/employee/Rakefile diff --git a/petergate_test/app/assets/config/manifest.js b/test/employee/app/assets/config/manifest.js similarity index 100% rename from petergate_test/app/assets/config/manifest.js rename to test/employee/app/assets/config/manifest.js diff --git a/dummy/app/assets/images/.keep b/test/employee/app/assets/images/.keep similarity index 100% rename from dummy/app/assets/images/.keep rename to test/employee/app/assets/images/.keep diff --git a/petergate_test/app/assets/javascripts/application.js b/test/employee/app/assets/javascripts/application.js similarity index 100% rename from petergate_test/app/assets/javascripts/application.js rename to test/employee/app/assets/javascripts/application.js diff --git a/petergate_test/app/assets/javascripts/cable.js b/test/employee/app/assets/javascripts/cable.js similarity index 100% rename from petergate_test/app/assets/javascripts/cable.js rename to test/employee/app/assets/javascripts/cable.js diff --git a/dummy/app/controllers/concerns/.keep b/test/employee/app/assets/javascripts/channels/.keep similarity index 100% rename from dummy/app/controllers/concerns/.keep rename to test/employee/app/assets/javascripts/channels/.keep diff --git a/petergate_test/app/assets/stylesheets/application.css b/test/employee/app/assets/stylesheets/application.css similarity index 100% rename from petergate_test/app/assets/stylesheets/application.css rename to test/employee/app/assets/stylesheets/application.css diff --git a/petergate_test/app/channels/application_cable/channel.rb b/test/employee/app/channels/application_cable/channel.rb similarity index 100% rename from petergate_test/app/channels/application_cable/channel.rb rename to test/employee/app/channels/application_cable/channel.rb diff --git a/petergate_test/app/channels/application_cable/connection.rb b/test/employee/app/channels/application_cable/connection.rb similarity index 100% rename from petergate_test/app/channels/application_cable/connection.rb rename to test/employee/app/channels/application_cable/connection.rb diff --git a/petergate_test/app/controllers/application_controller.rb b/test/employee/app/controllers/application_controller.rb similarity index 100% rename from petergate_test/app/controllers/application_controller.rb rename to test/employee/app/controllers/application_controller.rb diff --git a/petergate_test/app/controllers/blogs_controller.rb b/test/employee/app/controllers/blogs_controller.rb similarity index 100% rename from petergate_test/app/controllers/blogs_controller.rb rename to test/employee/app/controllers/blogs_controller.rb diff --git a/dummy/app/mailers/.keep b/test/employee/app/controllers/concerns/.keep similarity index 100% rename from dummy/app/mailers/.keep rename to test/employee/app/controllers/concerns/.keep diff --git a/dummy/app/controllers/inheritance_controller.rb b/test/employee/app/controllers/inheritance_controller.rb similarity index 100% rename from dummy/app/controllers/inheritance_controller.rb rename to test/employee/app/controllers/inheritance_controller.rb diff --git a/dummy/app/helpers/application_helper.rb b/test/employee/app/helpers/application_helper.rb similarity index 100% rename from dummy/app/helpers/application_helper.rb rename to test/employee/app/helpers/application_helper.rb diff --git a/petergate_test/app/jobs/application_job.rb b/test/employee/app/jobs/application_job.rb similarity index 100% rename from petergate_test/app/jobs/application_job.rb rename to test/employee/app/jobs/application_job.rb diff --git a/petergate_test/app/mailers/application_mailer.rb b/test/employee/app/mailers/application_mailer.rb similarity index 100% rename from petergate_test/app/mailers/application_mailer.rb rename to test/employee/app/mailers/application_mailer.rb diff --git a/petergate_test/app/models/application_record.rb b/test/employee/app/models/application_record.rb similarity index 100% rename from petergate_test/app/models/application_record.rb rename to test/employee/app/models/application_record.rb diff --git a/petergate_test/app/models/blog.rb b/test/employee/app/models/blog.rb similarity index 100% rename from petergate_test/app/models/blog.rb rename to test/employee/app/models/blog.rb diff --git a/dummy/app/models/.keep b/test/employee/app/models/concerns/.keep similarity index 100% rename from dummy/app/models/.keep rename to test/employee/app/models/concerns/.keep diff --git a/dummy/app/models/user.rb b/test/employee/app/models/employee.rb similarity index 96% rename from dummy/app/models/user.rb rename to test/employee/app/models/employee.rb index 86caa4a..e4bdc4e 100644 --- a/dummy/app/models/user.rb +++ b/test/employee/app/models/employee.rb @@ -1,4 +1,4 @@ -class User < ActiveRecord::Base +class Employee < ApplicationRecord ############################################################################################ ## PeterGate Roles ## ## The :user role is added by default and shouldn't be included in this list. ## @@ -6,7 +6,6 @@ class User < ActiveRecord::Base ## The multiple option can be set to true if you need users to have multiple roles. ## petergate(roles: [:root_admin, :company_admin], multiple: true) ## ############################################################################################ - # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable diff --git a/dummy/app/views/blogs/_form.html.erb b/test/employee/app/views/blogs/_form.html.erb similarity index 100% rename from dummy/app/views/blogs/_form.html.erb rename to test/employee/app/views/blogs/_form.html.erb diff --git a/petergate_test/app/views/blogs/create.js.erb b/test/employee/app/views/blogs/create.js.erb similarity index 100% rename from petergate_test/app/views/blogs/create.js.erb rename to test/employee/app/views/blogs/create.js.erb diff --git a/petergate_test/app/views/blogs/create.json.jbuilder b/test/employee/app/views/blogs/create.json.jbuilder similarity index 100% rename from petergate_test/app/views/blogs/create.json.jbuilder rename to test/employee/app/views/blogs/create.json.jbuilder diff --git a/petergate_test/app/views/blogs/create.xml b/test/employee/app/views/blogs/create.xml similarity index 100% rename from petergate_test/app/views/blogs/create.xml rename to test/employee/app/views/blogs/create.xml diff --git a/petergate_test/app/views/blogs/destroy.js.erb b/test/employee/app/views/blogs/destroy.js.erb similarity index 100% rename from petergate_test/app/views/blogs/destroy.js.erb rename to test/employee/app/views/blogs/destroy.js.erb diff --git a/petergate_test/app/views/blogs/destroy.json.jbuilder b/test/employee/app/views/blogs/destroy.json.jbuilder similarity index 100% rename from petergate_test/app/views/blogs/destroy.json.jbuilder rename to test/employee/app/views/blogs/destroy.json.jbuilder diff --git a/petergate_test/app/views/blogs/destroy.xml b/test/employee/app/views/blogs/destroy.xml similarity index 100% rename from petergate_test/app/views/blogs/destroy.xml rename to test/employee/app/views/blogs/destroy.xml diff --git a/dummy/app/views/blogs/edit.html.erb b/test/employee/app/views/blogs/edit.html.erb similarity index 100% rename from dummy/app/views/blogs/edit.html.erb rename to test/employee/app/views/blogs/edit.html.erb diff --git a/dummy/app/views/blogs/index.html.erb b/test/employee/app/views/blogs/index.html.erb similarity index 100% rename from dummy/app/views/blogs/index.html.erb rename to test/employee/app/views/blogs/index.html.erb diff --git a/dummy/app/views/blogs/new.html.erb b/test/employee/app/views/blogs/new.html.erb similarity index 100% rename from dummy/app/views/blogs/new.html.erb rename to test/employee/app/views/blogs/new.html.erb diff --git a/petergate_test/app/views/blogs/new.js.erb b/test/employee/app/views/blogs/new.js.erb similarity index 100% rename from petergate_test/app/views/blogs/new.js.erb rename to test/employee/app/views/blogs/new.js.erb diff --git a/petergate_test/app/views/blogs/new.json.jbuilder b/test/employee/app/views/blogs/new.json.jbuilder similarity index 100% rename from petergate_test/app/views/blogs/new.json.jbuilder rename to test/employee/app/views/blogs/new.json.jbuilder diff --git a/petergate_test/app/views/blogs/new.xml b/test/employee/app/views/blogs/new.xml similarity index 100% rename from petergate_test/app/views/blogs/new.xml rename to test/employee/app/views/blogs/new.xml diff --git a/dummy/app/views/blogs/show.html.erb b/test/employee/app/views/blogs/show.html.erb similarity index 100% rename from dummy/app/views/blogs/show.html.erb rename to test/employee/app/views/blogs/show.html.erb diff --git a/dummy/app/views/blogs/show.json.jbuilder b/test/employee/app/views/blogs/show.json.jbuilder similarity index 100% rename from dummy/app/views/blogs/show.json.jbuilder rename to test/employee/app/views/blogs/show.json.jbuilder diff --git a/petergate_test/app/views/blogs/update.js.erb b/test/employee/app/views/blogs/update.js.erb similarity index 100% rename from petergate_test/app/views/blogs/update.js.erb rename to test/employee/app/views/blogs/update.js.erb diff --git a/petergate_test/app/views/blogs/update.json.jbuilder b/test/employee/app/views/blogs/update.json.jbuilder similarity index 100% rename from petergate_test/app/views/blogs/update.json.jbuilder rename to test/employee/app/views/blogs/update.json.jbuilder diff --git a/petergate_test/app/views/blogs/update.xml b/test/employee/app/views/blogs/update.xml similarity index 100% rename from petergate_test/app/views/blogs/update.xml rename to test/employee/app/views/blogs/update.xml diff --git a/petergate_test/app/views/layouts/application.html.erb b/test/employee/app/views/layouts/application.html.erb similarity index 100% rename from petergate_test/app/views/layouts/application.html.erb rename to test/employee/app/views/layouts/application.html.erb diff --git a/petergate_test/app/views/layouts/mailer.html.erb b/test/employee/app/views/layouts/mailer.html.erb similarity index 100% rename from petergate_test/app/views/layouts/mailer.html.erb rename to test/employee/app/views/layouts/mailer.html.erb diff --git a/petergate_test/app/views/layouts/mailer.text.erb b/test/employee/app/views/layouts/mailer.text.erb similarity index 100% rename from petergate_test/app/views/layouts/mailer.text.erb rename to test/employee/app/views/layouts/mailer.text.erb diff --git a/petergate_test/app/views/test/index.js b/test/employee/app/views/test/index.js similarity index 100% rename from petergate_test/app/views/test/index.js rename to test/employee/app/views/test/index.js diff --git a/petergate_test/bin/bundle b/test/employee/bin/bundle similarity index 100% rename from petergate_test/bin/bundle rename to test/employee/bin/bundle diff --git a/petergate_test/bin/rails b/test/employee/bin/rails similarity index 100% rename from petergate_test/bin/rails rename to test/employee/bin/rails diff --git a/petergate_test/bin/rake b/test/employee/bin/rake similarity index 100% rename from petergate_test/bin/rake rename to test/employee/bin/rake diff --git a/petergate_test/bin/setup b/test/employee/bin/setup similarity index 100% rename from petergate_test/bin/setup rename to test/employee/bin/setup diff --git a/petergate_test/bin/spring b/test/employee/bin/spring similarity index 100% rename from petergate_test/bin/spring rename to test/employee/bin/spring diff --git a/petergate_test/bin/update b/test/employee/bin/update similarity index 100% rename from petergate_test/bin/update rename to test/employee/bin/update diff --git a/petergate_test/bin/yarn b/test/employee/bin/yarn similarity index 100% rename from petergate_test/bin/yarn rename to test/employee/bin/yarn diff --git a/petergate_test/config.ru b/test/employee/config.ru similarity index 100% rename from petergate_test/config.ru rename to test/employee/config.ru diff --git a/petergate_test/config/application.rb b/test/employee/config/application.rb similarity index 100% rename from petergate_test/config/application.rb rename to test/employee/config/application.rb diff --git a/petergate_test/config/boot.rb b/test/employee/config/boot.rb similarity index 100% rename from petergate_test/config/boot.rb rename to test/employee/config/boot.rb diff --git a/petergate_test/config/cable.yml b/test/employee/config/cable.yml similarity index 100% rename from petergate_test/config/cable.yml rename to test/employee/config/cable.yml diff --git a/petergate_test/config/credentials.yml.enc b/test/employee/config/credentials.yml.enc similarity index 100% rename from petergate_test/config/credentials.yml.enc rename to test/employee/config/credentials.yml.enc diff --git a/petergate_test/config/database.yml b/test/employee/config/database.yml similarity index 100% rename from petergate_test/config/database.yml rename to test/employee/config/database.yml diff --git a/petergate_test/config/environment.rb b/test/employee/config/environment.rb similarity index 100% rename from petergate_test/config/environment.rb rename to test/employee/config/environment.rb diff --git a/petergate_test/config/environments/development.rb b/test/employee/config/environments/development.rb similarity index 100% rename from petergate_test/config/environments/development.rb rename to test/employee/config/environments/development.rb diff --git a/petergate_test/config/environments/production.rb b/test/employee/config/environments/production.rb similarity index 100% rename from petergate_test/config/environments/production.rb rename to test/employee/config/environments/production.rb diff --git a/petergate_test/config/environments/test.rb b/test/employee/config/environments/test.rb similarity index 100% rename from petergate_test/config/environments/test.rb rename to test/employee/config/environments/test.rb diff --git a/petergate_test/config/initializers/application_controller_renderer.rb b/test/employee/config/initializers/application_controller_renderer.rb similarity index 100% rename from petergate_test/config/initializers/application_controller_renderer.rb rename to test/employee/config/initializers/application_controller_renderer.rb diff --git a/petergate_test/config/initializers/assets.rb b/test/employee/config/initializers/assets.rb similarity index 100% rename from petergate_test/config/initializers/assets.rb rename to test/employee/config/initializers/assets.rb diff --git a/dummy/config/initializers/backtrace_silencers.rb b/test/employee/config/initializers/backtrace_silencers.rb similarity index 100% rename from dummy/config/initializers/backtrace_silencers.rb rename to test/employee/config/initializers/backtrace_silencers.rb diff --git a/petergate_test/config/initializers/content_security_policy.rb b/test/employee/config/initializers/content_security_policy.rb similarity index 100% rename from petergate_test/config/initializers/content_security_policy.rb rename to test/employee/config/initializers/content_security_policy.rb diff --git a/petergate_test/config/initializers/cookies_serializer.rb b/test/employee/config/initializers/cookies_serializer.rb similarity index 100% rename from petergate_test/config/initializers/cookies_serializer.rb rename to test/employee/config/initializers/cookies_serializer.rb diff --git a/petergate_test/config/initializers/devise.rb b/test/employee/config/initializers/devise.rb similarity index 100% rename from petergate_test/config/initializers/devise.rb rename to test/employee/config/initializers/devise.rb diff --git a/dummy/config/initializers/filter_parameter_logging.rb b/test/employee/config/initializers/filter_parameter_logging.rb similarity index 100% rename from dummy/config/initializers/filter_parameter_logging.rb rename to test/employee/config/initializers/filter_parameter_logging.rb diff --git a/dummy/config/initializers/inflections.rb b/test/employee/config/initializers/inflections.rb similarity index 100% rename from dummy/config/initializers/inflections.rb rename to test/employee/config/initializers/inflections.rb diff --git a/dummy/config/initializers/mime_types.rb b/test/employee/config/initializers/mime_types.rb similarity index 100% rename from dummy/config/initializers/mime_types.rb rename to test/employee/config/initializers/mime_types.rb diff --git a/petergate_test/config/initializers/wrap_parameters.rb b/test/employee/config/initializers/wrap_parameters.rb similarity index 100% rename from petergate_test/config/initializers/wrap_parameters.rb rename to test/employee/config/initializers/wrap_parameters.rb diff --git a/petergate_test/config/locales/devise.en.yml b/test/employee/config/locales/devise.en.yml similarity index 100% rename from petergate_test/config/locales/devise.en.yml rename to test/employee/config/locales/devise.en.yml diff --git a/petergate_test/config/locales/en.yml b/test/employee/config/locales/en.yml similarity index 100% rename from petergate_test/config/locales/en.yml rename to test/employee/config/locales/en.yml diff --git a/petergate_test/config/puma.rb b/test/employee/config/puma.rb similarity index 100% rename from petergate_test/config/puma.rb rename to test/employee/config/puma.rb diff --git a/dummy/config/routes.rb b/test/employee/config/routes.rb similarity index 95% rename from dummy/config/routes.rb rename to test/employee/config/routes.rb index f28fa4f..4292df2 100644 --- a/dummy/config/routes.rb +++ b/test/employee/config/routes.rb @@ -1,7 +1,7 @@ Rails.application.routes.draw do - devise_for :users + devise_for :employees resources :blogs - get 'test_forbidden' => 'test#index' + get 'test_forbidden', to: 'test#index', as: 'test' # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/petergate_test/config/spring.rb b/test/employee/config/spring.rb similarity index 100% rename from petergate_test/config/spring.rb rename to test/employee/config/spring.rb diff --git a/petergate_test/config/storage.yml b/test/employee/config/storage.yml similarity index 100% rename from petergate_test/config/storage.yml rename to test/employee/config/storage.yml diff --git a/petergate_test/db/migrate/20141117063228_create_blogs.rb b/test/employee/db/migrate/20141117063228_create_blogs.rb similarity index 100% rename from petergate_test/db/migrate/20141117063228_create_blogs.rb rename to test/employee/db/migrate/20141117063228_create_blogs.rb diff --git a/dummy/db/migrate/20141117064643_devise_create_users.rb b/test/employee/db/migrate/20141117064643_devise_create_employees.rb similarity index 74% rename from dummy/db/migrate/20141117064643_devise_create_users.rb rename to test/employee/db/migrate/20141117064643_devise_create_employees.rb index cf497c2..87d80d6 100644 --- a/dummy/db/migrate/20141117064643_devise_create_users.rb +++ b/test/employee/db/migrate/20141117064643_devise_create_employees.rb @@ -1,6 +1,6 @@ -class DeviseCreateUsers < ActiveRecord::Migration +class DeviseCreateEmployees < ActiveRecord::Migration[5.1] def change - create_table(:users) do |t| + create_table(:employees) do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" @@ -34,9 +34,9 @@ def change t.timestamps end - add_index :users, :email, unique: true - add_index :users, :reset_password_token, unique: true - # add_index :users, :confirmation_token, unique: true - # add_index :users, :unlock_token, unique: true + add_index :employees, :email, unique: true + add_index :employees, :reset_password_token, unique: true + # add_index :employees, :confirmation_token, unique: true + # add_index :employees, :unlock_token, unique: true end end diff --git a/test/employee/db/migrate/20141117064807_add_roles_to_employees.rb b/test/employee/db/migrate/20141117064807_add_roles_to_employees.rb new file mode 100644 index 0000000..6717d01 --- /dev/null +++ b/test/employee/db/migrate/20141117064807_add_roles_to_employees.rb @@ -0,0 +1,5 @@ +class AddRolesToEmployees < ActiveRecord::Migration[5.1] + def change + add_column :employees, :roles, :string + end +end diff --git a/dummy/db/schema.rb b/test/employee/db/schema.rb similarity index 51% rename from dummy/db/schema.rb rename to test/employee/db/schema.rb index 92952af..11c9d7b 100644 --- a/dummy/db/schema.rb +++ b/test/employee/db/schema.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -11,32 +10,31 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20141117064807) do +ActiveRecord::Schema.define(version: 2014_11_17_064807) do - create_table "blogs", force: true do |t| - t.string "title" - t.text "content" - t.datetime "created_at" - t.datetime "updated_at" + create_table "blogs", force: :cascade do |t| + t.string "title" + t.text "content" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - create_table "users", force: true do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false - t.string "reset_password_token" + create_table "employees", force: :cascade do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" - t.datetime "created_at" - t.datetime "updated_at" - t.string "roles" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "roles" + t.index ["email"], name: "index_employees_on_email", unique: true + t.index ["reset_password_token"], name: "index_employees_on_reset_password_token", unique: true end - add_index "users", ["email"], name: "index_users_on_email", unique: true - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true - end diff --git a/petergate_test/db/seeds.rb b/test/employee/db/seeds.rb similarity index 100% rename from petergate_test/db/seeds.rb rename to test/employee/db/seeds.rb diff --git a/dummy/app/models/concerns/.keep b/test/employee/lib/assets/.keep similarity index 100% rename from dummy/app/models/concerns/.keep rename to test/employee/lib/assets/.keep diff --git a/dummy/lib/assets/.keep b/test/employee/lib/tasks/.keep similarity index 100% rename from dummy/lib/assets/.keep rename to test/employee/lib/tasks/.keep diff --git a/dummy/lib/tasks/.keep b/test/employee/log/.keep similarity index 100% rename from dummy/lib/tasks/.keep rename to test/employee/log/.keep diff --git a/petergate_test/package.json b/test/employee/package.json similarity index 100% rename from petergate_test/package.json rename to test/employee/package.json diff --git a/petergate_test/public/404.html b/test/employee/public/404.html similarity index 100% rename from petergate_test/public/404.html rename to test/employee/public/404.html diff --git a/petergate_test/public/422.html b/test/employee/public/422.html similarity index 100% rename from petergate_test/public/422.html rename to test/employee/public/422.html diff --git a/petergate_test/public/500.html b/test/employee/public/500.html similarity index 100% rename from petergate_test/public/500.html rename to test/employee/public/500.html diff --git a/petergate_test/public/apple-touch-icon-precomposed.png b/test/employee/public/apple-touch-icon-precomposed.png similarity index 100% rename from petergate_test/public/apple-touch-icon-precomposed.png rename to test/employee/public/apple-touch-icon-precomposed.png diff --git a/petergate_test/public/apple-touch-icon.png b/test/employee/public/apple-touch-icon.png similarity index 100% rename from petergate_test/public/apple-touch-icon.png rename to test/employee/public/apple-touch-icon.png diff --git a/dummy/public/favicon.ico b/test/employee/public/favicon.ico similarity index 100% rename from dummy/public/favicon.ico rename to test/employee/public/favicon.ico diff --git a/petergate_test/public/robots.txt b/test/employee/public/robots.txt similarity index 100% rename from petergate_test/public/robots.txt rename to test/employee/public/robots.txt diff --git a/dummy/log/.keep b/test/employee/storage/.keep similarity index 100% rename from dummy/log/.keep rename to test/employee/storage/.keep diff --git a/dummy/test/controllers/.keep b/test/employee/test/controllers/.keep similarity index 100% rename from dummy/test/controllers/.keep rename to test/employee/test/controllers/.keep diff --git a/dummy/test/controllers/base_controller_test.rb b/test/employee/test/controllers/base_controller_test.rb similarity index 100% rename from dummy/test/controllers/base_controller_test.rb rename to test/employee/test/controllers/base_controller_test.rb diff --git a/dummy/test/controllers/blogs_multiple_controller_test.rb b/test/employee/test/controllers/blogs_multiple_controller_test.rb similarity index 65% rename from dummy/test/controllers/blogs_multiple_controller_test.rb rename to test/employee/test/controllers/blogs_multiple_controller_test.rb index 8f53ef0..fa63669 100644 --- a/dummy/test/controllers/blogs_multiple_controller_test.rb +++ b/test/employee/test/controllers/blogs_multiple_controller_test.rb @@ -5,49 +5,49 @@ ################################################################################ describe "Multiple: Test that everything works if admin is logged in" do before do - User.petergate(roles: [:root_admin, :company_admin], multiple: true) + Employee.petergate(roles: [:root_admin, :company_admin], multiple: true) create_admin_and_login end let(:blog) { blogs :one } it "gets index" do - get :index + get blogs_url assert_response :success - assert_not_nil assigns(:blogs) + assert_not_equal 0, Blog.count end it "gets new" do - get :new + get new_blog_url assert_response :success end it "creates blog" do assert_difference('Blog.count') do - post :create, blog: { content: blog.content, title: blog.title } + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } end - assert_redirected_to blog_path(assigns(:blog)) + assert_redirected_to blog_path(Blog.last) end it "shows blog" do - get :show, id: blog + get blog_url blog assert_response :success end it "gets edit" do - get :edit, id: blog + get edit_blog_url blog assert_response :success end it "updates blog" do - put :update, id: blog, blog: { content: blog.content, title: blog.title } - assert_redirected_to blog_path(assigns(:blog)) + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) end it "destroys blog" do assert_difference('Blog.count', -1) do - delete :destroy, id: blog + delete blog_url blog end assert_redirected_to blogs_path @@ -59,67 +59,69 @@ ################################################################################ describe "Multiple: Make sure plain users can't see what they shouldn't." do before do - User.petergate(roles: [:root_admin, :company_admin], multiple: true) + Employee.petergate(roles: [:root_admin, :company_admin], multiple: true) create_user_and_login end let(:blog) { blogs :one } it "plain user can see index" do - get :index + get blogs_url assert_response :success - assert_not_nil assigns(:blogs) + assert_not_equal 0, Blog.count end it "gets permission denied on new" do - get :new + get new_blog_url assert_response 302 flash[:notice].must_equal "Permission Denied" end it "gets forbidden and no redirect with json format on new" do assert_webservice_is_forbiddden do |format| - get :new, format: format + get new_blog_url(format: format) end end it "doesn't allow plain user to create blog post" do assert_no_difference('Blog.count') do - post :create, blog: { content: blog.content, title: blog.title } + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - post :create, format: format, blog: { content: blog.content, title: blog.title } + post blogs_url(format: format), params: { blog: { content: blog.content, title: blog.title } } end end end it "can see show blog" do - get :show, id: blog + get blog_url blog assert_response :success end it "can't get to edit page" do - get :edit, id: blog + get edit_blog_url blog assert_response 302 end it "can't update blog" do - put :update, id: blog, blog: { content: blog.content, title: blog.title } + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - put :update, format: format, id: blog, blog: { content: blog.content, title: blog.title } + put blog_url(blog, format: format), params: { blog: { content: blog.content, title: blog.title } } end end it "can't destroy blog" do assert_no_difference('Blog.count') do - delete :destroy, id: blog + delete blog_url blog assert_redirected_to root_path - end - assert_webservice_is_forbiddden do |format| - delete :destroy, format: format, id: blog + + assert_webservice_is_forbiddden do |format| + delete blog_url blog + delete blog_url(blog, format: format) + end end end end @@ -131,48 +133,48 @@ let(:blog) { blogs :one } it "guest can see index" do - get :index + get blogs_url assert_response :success - assert_not_nil assigns(:blogs) + assert_not_equal 0, Blog.count end it "gets permission denied on new" do - get :new + get new_blog_url assert_response 302 end it "json gets permission denied on new" do assert_webservice_is_unauthorized do |format| - get :new, format: format + get new_blog_url(format: format) end end it "doesn't allow plain user to create blog post" do assert_no_difference('Blog.count') do - post :create, blog: { content: blog.content, title: blog.title } - assert_redirected_to "/users/sign_in" + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to "/employees/sign_in" end end it "doesn't show blog" do - get :show, id: blog + get blog_url blog assert_response 302 end it "can't get to edit page" do - get :edit, id: blog + get edit_blog_url blog assert_response 302 end it "can't update blog" do - put :update, id: blog, blog: { content: blog.content, title: blog.title } - assert_redirected_to "/users/sign_in" + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to "/employees/sign_in" end it "can't destroy blog" do assert_no_difference('Blog.count') do - delete :destroy, id: blog - assert_redirected_to "/users/sign_in" + delete blog_url blog + assert_redirected_to "/employees/sign_in" end end end @@ -182,49 +184,49 @@ ################################################################################ describe "Multiple: Test that everything works if company_admin is logged in" do before do - User.petergate(roles: [:root_admin, :company_admin], multiple: true) + Employee.petergate(roles: [:root_admin, :company_admin], multiple: true) create_company_admin_and_login end let(:blog) { blogs :one } it "gets index" do - get :index + get blogs_url assert_response :success - assert_not_nil assigns(:blogs) + assert_not_equal 0, Blog.count end it "gets new" do - get :new + get new_blog_url assert_response :success end it "creates blog" do assert_difference('Blog.count') do - post :create, blog: { content: blog.content, title: blog.title } + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } end - assert_redirected_to blog_path(assigns(:blog)) + assert_redirected_to blog_path(Blog.last) end it "shows blog" do - get :show, id: blog + get blog_url blog assert_response :success end it "gets edit" do - get :edit, id: blog + get edit_blog_url blog assert_response :success end it "updates blog" do - put :update, id: blog, blog: { content: blog.content, title: blog.title } - assert_redirected_to blog_path(assigns(:blog)) + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) end it "can't destroy blog" do assert_no_difference('Blog.count', -1) do - delete :destroy, id: blog + delete blog_url blog end assert_redirected_to root_path diff --git a/dummy/test/controllers/blogs_singular_controller_test.rb b/test/employee/test/controllers/blogs_singular_controller_test.rb similarity index 64% rename from dummy/test/controllers/blogs_singular_controller_test.rb rename to test/employee/test/controllers/blogs_singular_controller_test.rb index 26bf572..90e1002 100644 --- a/dummy/test/controllers/blogs_singular_controller_test.rb +++ b/test/employee/test/controllers/blogs_singular_controller_test.rb @@ -6,49 +6,49 @@ ################################################################################ describe "Singular: Test that everything works if admin is logged in" do before do - User.petergate(roles: [:root_admin, :company_admin], multiple: false) + Employee.petergate(roles: [:root_admin, :company_admin], multiple: false) create_admin_and_login end let(:blog) { blogs :one } it "gets index" do - get :index + get blogs_url assert_response :success - assert_not_nil assigns(:blogs) + assert_not_equal 0, Blog.count end it "gets new" do - get :new + get new_blog_url assert_response :success end it "creates blog" do assert_difference('Blog.count') do - post :create, blog: { content: blog.content, title: blog.title } + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } end - assert_redirected_to blog_path(assigns(:blog)) + assert_redirected_to blog_path(Blog.last) end it "shows blog" do - get :show, id: blog + get blog_url blog assert_response :success end it "gets edit" do - get :edit, id: blog + get edit_blog_url blog assert_response :success end it "updates blog" do - put :update, id: blog, blog: { content: blog.content, title: blog.title } - assert_redirected_to blog_path(assigns(:blog)) + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) end it "destroys blog" do assert_difference('Blog.count', -1) do - delete :destroy, id: blog + delete blog_url blog end assert_redirected_to blogs_path @@ -60,120 +60,121 @@ ################################################################################ describe "Singular: Make sure plain users can't see what they shouldn't." do before do - User.petergate(roles: [:root_admin, :company_admin], multiple: false) + Employee.petergate(roles: [:root_admin, :company_admin], multiple: false) create_user_and_login end let(:blog) { blogs :one } it "plain user can see index" do - get :index + get blogs_url assert_response :success - assert_not_nil assigns(:blogs) + assert_not_equal 0, Blog.count end it "gets permission denied on new" do - get :new + get new_blog_url assert_response 302 flash[:notice].must_equal "Permission Denied" end it "gets forbidden and no redirect with json format on new" do assert_webservice_is_forbiddden do |format| - get :new, format: format + get new_blog_url(format: format) end end it "doesn't allow plain user to create blog post" do assert_no_difference('Blog.count') do - post :create, blog: { content: blog.content, title: blog.title } + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - post :create, format: format, blog: { content: blog.content, title: blog.title } + post blogs_url(format: format), params: { blog: { content: blog.content, title: blog.title } } end end end it "can see show blog" do - get :show, id: blog + get blog_url blog assert_response :success end it "can't get to edit page" do - get :edit, id: blog + get edit_blog_url blog assert_response 302 end it "can't update blog" do - put :update, id: blog, blog: { content: blog.content, title: blog.title } + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - put :update, format: format, id: blog, blog: { content: blog.content, title: blog.title } + put blog_url(blog, format: format), params: { blog: { content: blog.content, title: blog.title } } end end it "can't destroy blog" do assert_no_difference('Blog.count') do - delete :destroy, id: blog + delete blog_url blog assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - delete :destroy, format: format, id: blog + delete blog_url blog + delete blog_url(blog, format: format) end end end end - ################################################################################ + ################################################################################# # COMPANY_ADMIN ROLE - ################################################################################ + ################################################################################# describe "Singular: Test that everything works if company_admin is logged in" do before do - User.petergate(roles: [:root_admin, :company_admin], multiple: false) + Employee.petergate(roles: [:root_admin, :company_admin], multiple: false) create_company_admin_and_login end let(:blog) { blogs :one } it "gets index" do - get :index + get blogs_url assert_response :success - assert_not_nil assigns(:blogs) + assert_not_equal 0, Blog.count end it "gets new" do - get :new + get new_blog_url assert_response :success end it "creates blog" do assert_difference('Blog.count') do - post :create, blog: { content: blog.content, title: blog.title } + post blogs_url, params: { blog: { content: blog.content, title: blog.title } } end - assert_redirected_to blog_path(assigns(:blog)) + assert_redirected_to blog_path(Blog.last) end it "shows blog" do - get :show, id: blog + get blog_url blog assert_response :success end it "gets edit" do - get :edit, id: blog + get edit_blog_url blog assert_response :success end it "updates blog" do - put :update, id: blog, blog: { content: blog.content, title: blog.title } - assert_redirected_to blog_path(assigns(:blog)) + put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + assert_redirected_to blog_path(blog) end it "can't destroy blog" do assert_no_difference('Blog.count', -1) do - delete :destroy, id: blog + delete blog_url blog end assert_redirected_to root_path diff --git a/dummy/test/controllers/test_controller_test.rb b/test/employee/test/controllers/test_controller_test.rb similarity index 77% rename from dummy/test/controllers/test_controller_test.rb rename to test/employee/test/controllers/test_controller_test.rb index 05375eb..76faf2b 100644 --- a/dummy/test/controllers/test_controller_test.rb +++ b/test/employee/test/controllers/test_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" class TestController < ApplicationController - skip_before_filter :verify_authenticity_token + skip_before_action :verify_authenticity_token def index forbidden! params[:msg] @@ -9,36 +9,37 @@ def index end describe "TestController", '#forbidden!' do - let(:admin) { users(:admin) } + let(:admin) { employees(:admin) } before { sign_in admin } describe 'with html format request' do it 'redirect to referrer' do + skip @request.env['HTTP_REFERER'] = 'http://referrer-page.com' - get :index + get test_url assert_redirected_to 'http://referrer-page.com' end it 'redirect to after_sign_in_path_for' do - get :index + get test_url assert_redirected_to root_path end it 'redirect to root_path if not signed in' do sign_out admin - get :index + get test_url assert_redirected_to root_url end it 'uses the msg when supplied' do - get :index, msg: 'custom message' + get test_url, params: { msg: 'custom message' } assert_equal('custom message', flash[:notice]) end end describe 'with xhr format request' do it 'respond with forbidden status' do - get :index, format: :js + get test_url(format: :js) assert_response :forbidden end end diff --git a/dummy/test/fixtures/.keep b/test/employee/test/fixtures/.keep similarity index 100% rename from dummy/test/fixtures/.keep rename to test/employee/test/fixtures/.keep diff --git a/dummy/test/fixtures/blogs.yml b/test/employee/test/fixtures/blogs.yml similarity index 100% rename from dummy/test/fixtures/blogs.yml rename to test/employee/test/fixtures/blogs.yml diff --git a/dummy/test/fixtures/users.yml b/test/employee/test/fixtures/employees.yml similarity index 100% rename from dummy/test/fixtures/users.yml rename to test/employee/test/fixtures/employees.yml diff --git a/dummy/test/helpers/.keep b/test/employee/test/helpers/.keep similarity index 100% rename from dummy/test/helpers/.keep rename to test/employee/test/helpers/.keep diff --git a/dummy/test/integration/.keep b/test/employee/test/integration/.keep similarity index 100% rename from dummy/test/integration/.keep rename to test/employee/test/integration/.keep diff --git a/dummy/test/mailers/.keep b/test/employee/test/mailers/.keep similarity index 100% rename from dummy/test/mailers/.keep rename to test/employee/test/mailers/.keep diff --git a/dummy/test/models/.keep b/test/employee/test/models/.keep similarity index 100% rename from dummy/test/models/.keep rename to test/employee/test/models/.keep diff --git a/dummy/test/models/blog_test.rb b/test/employee/test/models/blog_test.rb similarity index 100% rename from dummy/test/models/blog_test.rb rename to test/employee/test/models/blog_test.rb diff --git a/test/employee/test/models/employee_test.rb b/test/employee/test/models/employee_test.rb new file mode 100644 index 0000000..b7a9845 --- /dev/null +++ b/test/employee/test/models/employee_test.rb @@ -0,0 +1,12 @@ +require "test_helper" + +describe Employee do + let(:employee) { + Employee.petergate(roles: [:root_admin, :company_admin], multiple: false) + Employee.create(email: "company_admin2@example.com", password: "password1", password_confirmation: "password1", role: :company_admin) + } + + it "must be valid" do + employee.must_be :valid? + end +end diff --git a/test/employee/test/test_helper.rb b/test/employee/test/test_helper.rb new file mode 100644 index 0000000..9242572 --- /dev/null +++ b/test/employee/test/test_helper.rb @@ -0,0 +1,51 @@ +ENV['RAILS_ENV'] = 'test' +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails" + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +require "minitest/pride" +require "minitest/reporters" +require "minitest/autorun" +class ActiveSupport::TestCase + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + ActiveRecord::Migration.check_pending! + fixtures :all + + # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. +end + +class ActionController::TestCase + include Devise::TestHelpers +end + +def create_user_and_login(email: "user@example.com", password: "youllneverguess") + u = Employee.create(email: email, password: password, password_confirmation: password, roles: :user) + sign_in(u) +end + +def create_admin_and_login(email: "user@example.com", password: "youllneverguess") + u = Employee.create(email: email, password: password, password_confirmation: password, roles: :root_admin) + sign_in(u) +end + +def create_company_admin_and_login(email: "user@example.com", password: "youllneverguess") + u = Employee.create(email: email, password: password, password_confirmation: password, roles: :company_admin) + sign_in(u) +end + +def sign_in(u) + post( employee_session_url, + params: { + 'employee[email]' => u.email, + 'employee[password]' => 'youllneverguess' + } + ) +end + +def sign_out(u) + delete(destroy_employee_session_url) +end diff --git a/dummy/vendor/assets/javascripts/.keep b/test/employee/tmp/.keep similarity index 100% rename from dummy/vendor/assets/javascripts/.keep rename to test/employee/tmp/.keep diff --git a/dummy/vendor/assets/stylesheets/.keep b/test/employee/vendor/.keep similarity index 100% rename from dummy/vendor/assets/stylesheets/.keep rename to test/employee/vendor/.keep diff --git a/dummy/.gitignore b/test/user/.gitignore similarity index 64% rename from dummy/.gitignore rename to test/user/.gitignore index 6a502e9..81452db 100644 --- a/dummy/.gitignore +++ b/test/user/.gitignore @@ -12,5 +12,20 @@ /db/*.sqlite3-journal # Ignore all logfiles and tempfiles. -/log/*.log -/tmp +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore uploaded files in development +/storage/* +!/storage/.keep + +/node_modules +/yarn-error.log + +/public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/test/user/.ruby-version b/test/user/.ruby-version new file mode 100644 index 0000000..4fd0fe3 --- /dev/null +++ b/test/user/.ruby-version @@ -0,0 +1 @@ +2.5.1 \ No newline at end of file diff --git a/test/user/Gemfile b/test/user/Gemfile new file mode 100644 index 0000000..47762bc --- /dev/null +++ b/test/user/Gemfile @@ -0,0 +1,67 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.5.1' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.2' +# Use sqlite3 as the database for Active Record +gem 'sqlite3' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'mini_racer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false +gem 'devise' +gem 'petergate', path: '../' + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + gem 'pry', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of chromedriver to run system tests with Chrome + gem 'chromedriver-helper' + gem "minitest-rails" + gem "minitest-reporters" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/dummy/README.rdoc b/test/user/README.md similarity index 76% rename from dummy/README.rdoc rename to test/user/README.md index dd4e97e..7db80e4 100644 --- a/dummy/README.rdoc +++ b/test/user/README.md @@ -1,4 +1,4 @@ -== README +# README This README would normally document whatever steps are necessary to get the application up and running. @@ -22,7 +22,3 @@ Things you may want to cover: * Deployment instructions * ... - - -Please feel free to use a different markup language if you do not plan to run -rake doc:app. diff --git a/dummy/Rakefile b/test/user/Rakefile similarity index 70% rename from dummy/Rakefile rename to test/user/Rakefile index fb9c1ab..e85f913 100644 --- a/dummy/Rakefile +++ b/test/user/Rakefile @@ -1,7 +1,6 @@ # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. -require File.expand_path('../config/application', __FILE__) +require_relative 'config/application' Rails.application.load_tasks -task default: :test diff --git a/test/user/app/assets/config/manifest.js b/test/user/app/assets/config/manifest.js new file mode 100644 index 0000000..b16e53d --- /dev/null +++ b/test/user/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/petergate_test/app/assets/images/.keep b/test/user/app/assets/images/.keep similarity index 100% rename from petergate_test/app/assets/images/.keep rename to test/user/app/assets/images/.keep diff --git a/dummy/app/assets/javascripts/application.js b/test/user/app/assets/javascripts/application.js similarity index 50% rename from dummy/app/assets/javascripts/application.js rename to test/user/app/assets/javascripts/application.js index d6925fa..82e6f0f 100644 --- a/dummy/app/assets/javascripts/application.js +++ b/test/user/app/assets/javascripts/application.js @@ -1,16 +1,16 @@ // This is a manifest file that'll be compiled into application.js, which will include all the files // listed below. // -// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, -// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's +// vendor/assets/javascripts directory can be referenced here using a relative path. // // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -// compiled file. +// compiled file. JavaScript code in this file should be added after the last require_* statement. // -// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // -//= require jquery -//= require jquery_ujs +//= require rails-ujs +//= require activestorage //= require turbolinks //= require_tree . diff --git a/test/user/app/assets/javascripts/cable.js b/test/user/app/assets/javascripts/cable.js new file mode 100644 index 0000000..739aa5f --- /dev/null +++ b/test/user/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/petergate_test/app/assets/javascripts/channels/.keep b/test/user/app/assets/javascripts/channels/.keep similarity index 100% rename from petergate_test/app/assets/javascripts/channels/.keep rename to test/user/app/assets/javascripts/channels/.keep diff --git a/dummy/app/assets/stylesheets/application.css b/test/user/app/assets/stylesheets/application.css similarity index 56% rename from dummy/app/assets/stylesheets/application.css rename to test/user/app/assets/stylesheets/application.css index a443db3..d05ea0f 100644 --- a/dummy/app/assets/stylesheets/application.css +++ b/test/user/app/assets/stylesheets/application.css @@ -2,13 +2,13 @@ * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, - * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. * * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any styles - * defined in the other CSS/SCSS files in this directory. It is generally better to create a new - * file per style scope. + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. * *= require_tree . *= require_self diff --git a/test/user/app/channels/application_cable/channel.rb b/test/user/app/channels/application_cable/channel.rb new file mode 100644 index 0000000..d672697 --- /dev/null +++ b/test/user/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/test/user/app/channels/application_cable/connection.rb b/test/user/app/channels/application_cable/connection.rb new file mode 100644 index 0000000..0ff5442 --- /dev/null +++ b/test/user/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/test/user/app/controllers/application_controller.rb b/test/user/app/controllers/application_controller.rb new file mode 100644 index 0000000..09705d1 --- /dev/null +++ b/test/user/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/dummy/app/controllers/blogs_controller.rb b/test/user/app/controllers/blogs_controller.rb similarity index 97% rename from dummy/app/controllers/blogs_controller.rb rename to test/user/app/controllers/blogs_controller.rb index d51481f..219156d 100644 --- a/dummy/app/controllers/blogs_controller.rb +++ b/test/user/app/controllers/blogs_controller.rb @@ -58,7 +58,7 @@ def destroy @blog.destroy respond_to do |format| format.html { redirect_to blogs_url, notice: 'Blog was successfully destroyed.' } - format.json { head :no_content } + format.json { render body: blogs_url } end end diff --git a/petergate_test/app/controllers/concerns/.keep b/test/user/app/controllers/concerns/.keep similarity index 100% rename from petergate_test/app/controllers/concerns/.keep rename to test/user/app/controllers/concerns/.keep diff --git a/petergate_test/app/controllers/inheritance_controller.rb b/test/user/app/controllers/inheritance_controller.rb similarity index 100% rename from petergate_test/app/controllers/inheritance_controller.rb rename to test/user/app/controllers/inheritance_controller.rb diff --git a/petergate_test/app/helpers/application_helper.rb b/test/user/app/helpers/application_helper.rb similarity index 100% rename from petergate_test/app/helpers/application_helper.rb rename to test/user/app/helpers/application_helper.rb diff --git a/test/user/app/jobs/application_job.rb b/test/user/app/jobs/application_job.rb new file mode 100644 index 0000000..a009ace --- /dev/null +++ b/test/user/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/test/user/app/mailers/application_mailer.rb b/test/user/app/mailers/application_mailer.rb new file mode 100644 index 0000000..286b223 --- /dev/null +++ b/test/user/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/test/user/app/models/application_record.rb b/test/user/app/models/application_record.rb new file mode 100644 index 0000000..10a4cba --- /dev/null +++ b/test/user/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/test/user/app/models/blog.rb b/test/user/app/models/blog.rb new file mode 100644 index 0000000..0fcce79 --- /dev/null +++ b/test/user/app/models/blog.rb @@ -0,0 +1,3 @@ +class Blog < ApplicationRecord +end + diff --git a/petergate_test/app/models/concerns/.keep b/test/user/app/models/concerns/.keep similarity index 100% rename from petergate_test/app/models/concerns/.keep rename to test/user/app/models/concerns/.keep diff --git a/petergate_test/app/models/user.rb b/test/user/app/models/user.rb similarity index 100% rename from petergate_test/app/models/user.rb rename to test/user/app/models/user.rb diff --git a/petergate_test/app/views/blogs/_form.html.erb b/test/user/app/views/blogs/_form.html.erb similarity index 100% rename from petergate_test/app/views/blogs/_form.html.erb rename to test/user/app/views/blogs/_form.html.erb diff --git a/petergate_test/lib/assets/.keep b/test/user/app/views/blogs/create.js.erb similarity index 100% rename from petergate_test/lib/assets/.keep rename to test/user/app/views/blogs/create.js.erb diff --git a/petergate_test/lib/tasks/.keep b/test/user/app/views/blogs/create.json.jbuilder similarity index 100% rename from petergate_test/lib/tasks/.keep rename to test/user/app/views/blogs/create.json.jbuilder diff --git a/petergate_test/log/.keep b/test/user/app/views/blogs/create.xml similarity index 100% rename from petergate_test/log/.keep rename to test/user/app/views/blogs/create.xml diff --git a/petergate_test/public/favicon.ico b/test/user/app/views/blogs/destroy.js.erb similarity index 100% rename from petergate_test/public/favicon.ico rename to test/user/app/views/blogs/destroy.js.erb diff --git a/petergate_test/storage/.keep b/test/user/app/views/blogs/destroy.json.jbuilder similarity index 100% rename from petergate_test/storage/.keep rename to test/user/app/views/blogs/destroy.json.jbuilder diff --git a/petergate_test/test/controllers/.keep b/test/user/app/views/blogs/destroy.xml similarity index 100% rename from petergate_test/test/controllers/.keep rename to test/user/app/views/blogs/destroy.xml diff --git a/petergate_test/app/views/blogs/edit.html.erb b/test/user/app/views/blogs/edit.html.erb similarity index 100% rename from petergate_test/app/views/blogs/edit.html.erb rename to test/user/app/views/blogs/edit.html.erb diff --git a/petergate_test/app/views/blogs/index.html.erb b/test/user/app/views/blogs/index.html.erb similarity index 100% rename from petergate_test/app/views/blogs/index.html.erb rename to test/user/app/views/blogs/index.html.erb diff --git a/petergate_test/app/views/blogs/new.html.erb b/test/user/app/views/blogs/new.html.erb similarity index 100% rename from petergate_test/app/views/blogs/new.html.erb rename to test/user/app/views/blogs/new.html.erb diff --git a/petergate_test/test/fixtures/.keep b/test/user/app/views/blogs/new.js.erb similarity index 100% rename from petergate_test/test/fixtures/.keep rename to test/user/app/views/blogs/new.js.erb diff --git a/petergate_test/test/helpers/.keep b/test/user/app/views/blogs/new.json.jbuilder similarity index 100% rename from petergate_test/test/helpers/.keep rename to test/user/app/views/blogs/new.json.jbuilder diff --git a/petergate_test/test/integration/.keep b/test/user/app/views/blogs/new.xml similarity index 100% rename from petergate_test/test/integration/.keep rename to test/user/app/views/blogs/new.xml diff --git a/petergate_test/app/views/blogs/show.html.erb b/test/user/app/views/blogs/show.html.erb similarity index 100% rename from petergate_test/app/views/blogs/show.html.erb rename to test/user/app/views/blogs/show.html.erb diff --git a/petergate_test/app/views/blogs/show.json.jbuilder b/test/user/app/views/blogs/show.json.jbuilder similarity index 100% rename from petergate_test/app/views/blogs/show.json.jbuilder rename to test/user/app/views/blogs/show.json.jbuilder diff --git a/petergate_test/test/mailers/.keep b/test/user/app/views/blogs/update.js.erb similarity index 100% rename from petergate_test/test/mailers/.keep rename to test/user/app/views/blogs/update.js.erb diff --git a/petergate_test/test/models/.keep b/test/user/app/views/blogs/update.json.jbuilder similarity index 100% rename from petergate_test/test/models/.keep rename to test/user/app/views/blogs/update.json.jbuilder diff --git a/petergate_test/tmp/.keep b/test/user/app/views/blogs/update.xml similarity index 100% rename from petergate_test/tmp/.keep rename to test/user/app/views/blogs/update.xml diff --git a/test/user/app/views/layouts/application.html.erb b/test/user/app/views/layouts/application.html.erb new file mode 100644 index 0000000..4064847 --- /dev/null +++ b/test/user/app/views/layouts/application.html.erb @@ -0,0 +1,17 @@ + + + + PetergateTest + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + +

<%= notice %>

+

<%= alert %>

+ <%= yield %> + + diff --git a/test/user/app/views/layouts/mailer.html.erb b/test/user/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000..cbd34d2 --- /dev/null +++ b/test/user/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/test/user/app/views/layouts/mailer.text.erb b/test/user/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000..37f0bdd --- /dev/null +++ b/test/user/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/petergate_test/vendor/.keep b/test/user/app/views/test/index.js similarity index 100% rename from petergate_test/vendor/.keep rename to test/user/app/views/test/index.js diff --git a/test/user/bin/bundle b/test/user/bin/bundle new file mode 100755 index 0000000..f19acf5 --- /dev/null +++ b/test/user/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +load Gem.bin_path('bundler', 'bundle') diff --git a/test/user/bin/rails b/test/user/bin/rails new file mode 100755 index 0000000..5badb2f --- /dev/null +++ b/test/user/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/test/user/bin/rake b/test/user/bin/rake new file mode 100755 index 0000000..d87d5f5 --- /dev/null +++ b/test/user/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/test/user/bin/setup b/test/user/bin/setup new file mode 100755 index 0000000..94fd4d7 --- /dev/null +++ b/test/user/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/test/user/bin/spring b/test/user/bin/spring new file mode 100755 index 0000000..d89ee49 --- /dev/null +++ b/test/user/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads Spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == 'spring' } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/test/user/bin/update b/test/user/bin/update new file mode 100755 index 0000000..58bfaed --- /dev/null +++ b/test/user/bin/update @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/test/user/bin/yarn b/test/user/bin/yarn new file mode 100755 index 0000000..460dd56 --- /dev/null +++ b/test/user/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/dummy/config.ru b/test/user/config.ru similarity index 59% rename from dummy/config.ru rename to test/user/config.ru index 5bc2a61..f7ba0b5 100644 --- a/dummy/config.ru +++ b/test/user/config.ru @@ -1,4 +1,5 @@ # This file is used by Rack-based servers to start the application. -require ::File.expand_path('../config/environment', __FILE__) +require_relative 'config/environment' + run Rails.application diff --git a/test/user/config/application.rb b/test/user/config/application.rb new file mode 100644 index 0000000..5593023 --- /dev/null +++ b/test/user/config/application.rb @@ -0,0 +1,19 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module PetergateTest + class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.2 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + end +end diff --git a/test/user/config/boot.rb b/test/user/config/boot.rb new file mode 100644 index 0000000..b9e460c --- /dev/null +++ b/test/user/config/boot.rb @@ -0,0 +1,4 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/test/user/config/cable.yml b/test/user/config/cable.yml new file mode 100644 index 0000000..e92422f --- /dev/null +++ b/test/user/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: petergate_test_production diff --git a/test/user/config/credentials.yml.enc b/test/user/config/credentials.yml.enc new file mode 100644 index 0000000..352bbd5 --- /dev/null +++ b/test/user/config/credentials.yml.enc @@ -0,0 +1 @@ +bdEHtHG0qweH4Gtiyrsg3FK/W5oo6Ny/nt7Dx5m7fXTFkPIDK8D15PLrl1iYD72npW50KhUY8IJFoTPQXbAmi0nQ0fPC3WSnpJfTU9Jb2VIP8rbAzqsTTAlaYLFkj0zp/0VmF2W0nOqOKgNx6siUhZo4Pa9b7+RVPHHIONm8oJM/uKS7h4ZCciCWN4cvB001hjNp1fhqbu2P0XTNdPV/kfwvEH+sZwhdyF+otCVtcnfYI1dCk7gtRGcSJ0RreV1EsqRvSDSQXmPepelytbcL6aNerNteIZefYodwRl/a7fGLV13cSnALmf6m3LNOReOisBfSj25/g9UseVYPNzNQhGMiIQ098/HuYJ9qvFo9YsMiIqUDtWhODBFM+FJ5PkEXZPaTYpC5Q11SJ3tni6ym5CijsdwHglRTOPo5--n3H7WcTrQAVwaNRu--GKpIvDJDuK2ccKAqch+BgA== \ No newline at end of file diff --git a/dummy/config/database.yml b/test/user/config/database.yml similarity index 91% rename from dummy/config/database.yml rename to test/user/config/database.yml index 1c1a37c..0d02f24 100644 --- a/dummy/config/database.yml +++ b/test/user/config/database.yml @@ -6,7 +6,7 @@ # default: &default adapter: sqlite3 - pool: 5 + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: diff --git a/dummy/config/environment.rb b/test/user/config/environment.rb similarity index 64% rename from dummy/config/environment.rb rename to test/user/config/environment.rb index ee8d90d..426333b 100644 --- a/dummy/config/environment.rb +++ b/test/user/config/environment.rb @@ -1,5 +1,5 @@ # Load the Rails application. -require File.expand_path('../application', __FILE__) +require_relative 'application' # Initialize the Rails application. Rails.application.initialize! diff --git a/test/user/config/environments/development.rb b/test/user/config/environments/development.rb new file mode 100644 index 0000000..208b2dd --- /dev/null +++ b/test/user/config/environments/development.rb @@ -0,0 +1,62 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/dummy/config/environments/production.rb b/test/user/config/environments/production.rb similarity index 56% rename from dummy/config/environments/production.rb rename to test/user/config/environments/production.rb index b93a877..a25cb75 100644 --- a/dummy/config/environments/production.rb +++ b/test/user/config/environments/production.rb @@ -14,13 +14,13 @@ config.consider_all_requests_local = false config.action_controller.perform_caching = true - # Enable Rack::Cache to put a simple HTTP cache in front of your application - # Add `rack-cache` to your Gemfile before enabling this. - # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. - # config.action_dispatch.rack_cache = true + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true - # Disable Rails's static asset server (Apache or nginx will already do this). - config.serve_static_assets = false + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Compress JavaScripts and CSS. config.assets.js_compressor = :uglifier @@ -29,32 +29,41 @@ # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false - # Generate digests for assets URLs. - config.assets.digest = true - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # config.force_ssl = true - # Set to :debug to see everything in the log. - config.log_level = :info + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug # Prepend all log lines with the following tags. - # config.log_tags = [ :subdomain, :uuid ] - - # Use a different logger for distributed setups. - # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + config.log_tags = [ :request_id ] # Use a different cache store in production. # config.cache_store = :mem_cache_store - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = "http://assets.example.com" + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "petergate_test_#{Rails.env}" + + config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. @@ -67,12 +76,19 @@ # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify - # Disable automatic flushing of the log to improve performance. - # config.autoflush_log = false - # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false end diff --git a/dummy/config/environments/test.rb b/test/user/config/environments/test.rb similarity index 79% rename from dummy/config/environments/test.rb rename to test/user/config/environments/test.rb index 053f5b6..0a38fd3 100644 --- a/dummy/config/environments/test.rb +++ b/test/user/config/environments/test.rb @@ -12,9 +12,11 @@ # preloads Rails for running tests, you may have to set it to true. config.eager_load = false - # Configure static asset server for tests with Cache-Control for performance. - config.serve_static_assets = true - config.static_cache_control = 'public, max-age=3600' + # 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}" + } # Show full error reports and disable caching. config.consider_all_requests_local = true @@ -26,6 +28,11 @@ # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + # Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. diff --git a/test/user/config/initializers/application_controller_renderer.rb b/test/user/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000..89d2efa --- /dev/null +++ b/test/user/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/test/user/config/initializers/assets.rb b/test/user/config/initializers/assets.rb new file mode 100644 index 0000000..4b828e8 --- /dev/null +++ b/test/user/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/petergate_test/config/initializers/backtrace_silencers.rb b/test/user/config/initializers/backtrace_silencers.rb similarity index 100% rename from petergate_test/config/initializers/backtrace_silencers.rb rename to test/user/config/initializers/backtrace_silencers.rb diff --git a/test/user/config/initializers/content_security_policy.rb b/test/user/config/initializers/content_security_policy.rb new file mode 100644 index 0000000..d3bcaa5 --- /dev/null +++ b/test/user/config/initializers/content_security_policy.rb @@ -0,0 +1,25 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/dummy/config/initializers/cookies_serializer.rb b/test/user/config/initializers/cookies_serializer.rb similarity index 51% rename from dummy/config/initializers/cookies_serializer.rb rename to test/user/config/initializers/cookies_serializer.rb index 7a06a89..5a6a32d 100644 --- a/dummy/config/initializers/cookies_serializer.rb +++ b/test/user/config/initializers/cookies_serializer.rb @@ -1,3 +1,5 @@ # Be sure to restart your server when you modify this file. -Rails.application.config.action_dispatch.cookies_serializer = :json \ No newline at end of file +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/dummy/config/initializers/devise.rb b/test/user/config/initializers/devise.rb similarity index 77% rename from dummy/config/initializers/devise.rb rename to test/user/config/initializers/devise.rb index 48d1010..98536d7 100644 --- a/dummy/config/initializers/devise.rb +++ b/test/user/config/initializers/devise.rb @@ -1,10 +1,18 @@ +# frozen_string_literal: true + # Use this hook to configure devise mailer, warden hooks and so forth. # Many of these configuration options can be set straight in your model. Devise.setup do |config| # The secret key used by Devise. Devise uses this key to generate # random tokens. Changing this key will render invalid all existing # confirmation, reset password and unlock tokens in the database. - # config.secret_key = 'f4ddb2a77bc7a00d9c347577bb3a65857c434ab36027b6a5aec778716a003d80be4eaffbe9e9adca3eac2e31b786be3d30d2c6a981bb9665bda1df0c1bf6777a' + # Devise will use the `secret_key_base` as its `secret_key` + # by default. You can change it below and use your own secret key. + # config.secret_key = '8386a86098dfe71bfd6dc636cdd7f3a54a973205bcd8a1042c1310cc08f5754858ee4394124b2cd29809bb22aff2cf9386bcbc56bc78459cf75f1f7f7ee18e23' + + # ==> Controller configuration + # Configure the parent class to the devise controllers. + # config.parent_controller = 'DeviseController' # ==> Mailer Configuration # Configure the e-mail address which will be shown in Devise::Mailer, @@ -15,6 +23,9 @@ # Configure the class responsible to send e-mails. # config.mailer = 'Devise::Mailer' + # Configure the parent class responsible to send e-mails. + # config.parent_mailer = 'ActionMailer::Base' + # ==> ORM configuration # Load and configure the ORM. Supports :active_record (default) and # :mongoid (bson_ext recommended) by default. Other ORMs may be @@ -29,7 +40,7 @@ # session. If you need permissions, you should implement that in a before filter. # You can also supply a hash where the value is a boolean determining whether # or not authentication should be aborted when the value is not present. - # config.authentication_keys = [ :email ] + # config.authentication_keys = [:email] # Configure parameters from the request object used for authentication. Each entry # given should be a request method and it will automatically be passed to the @@ -41,12 +52,12 @@ # Configure which authentication keys should be case-insensitive. # These keys will be downcased upon creating or modifying a user and when used # to authenticate or find a user. Default is :email. - config.case_insensitive_keys = [ :email ] + config.case_insensitive_keys = [:email] # Configure which authentication keys should have whitespace stripped. # These keys will have whitespace before and after removed upon creating or # modifying a user and when used to authenticate or find a user. Default is :email. - config.strip_whitespace_keys = [ :email ] + config.strip_whitespace_keys = [:email] # Tell if authentication through request.params is enabled. True by default. # It can be set to an array that will enable params authentication only for the @@ -85,26 +96,41 @@ # from the server. You can disable this option at your own risk. # config.clean_up_csrf_token_on_authentication = true + # When false, Devise will not attempt to reload routes on eager load. + # This can reduce the time taken to boot the app but if your application + # requires the Devise mappings to be loaded during boot time the application + # won't boot properly. + # config.reload_routes = true + # ==> Configuration for :database_authenticatable - # For bcrypt, this is the cost for hashing the password and defaults to 10. If - # using other encryptors, it sets how many times you want the password re-encrypted. + # For bcrypt, this is the cost for hashing the password and defaults to 11. If + # using other algorithms, it sets how many times you want the password to be hashed. # # Limiting the stretches to just one in testing will increase the performance of # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use # a value less than 10 in other environments. Note that, for bcrypt (the default - # encryptor), the cost increases exponentially with the number of stretches (e.g. + # algorithm), the cost increases exponentially with the number of stretches (e.g. # a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation). - config.stretches = Rails.env.test? ? 1 : 10 + config.stretches = Rails.env.test? ? 1 : 11 - # Setup a pepper to generate the encrypted password. - # config.pepper = 'cd6ab8ec802fe2ae53da888f53eb58b379093f716889ba8a517c7ad019b6dd22bcc18e10202383e44f9d4cb49e42fd334f699f25466fb5248ced3a9ba79feb8f' + # Set up a pepper to generate the hashed password. + # config.pepper = '1666f7a84aa372aeed81801a225dc02ca29463d19a53fabb7c82bc192b6ff6d3c41adf5fe807efc3fd7521c7cbfbdfd6dde019d261e6e3139fed34cd63a0c7e2' + + # Send a notification to the original email when the user's email is changed. + # config.send_email_changed_notification = false + + # Send a notification email when the user's password is changed. + # config.send_password_change_notification = false # ==> Configuration for :confirmable # A period that the user is allowed to access the website even without # confirming their account. For instance, if set to 2.days, the user will be # able to access the website for two days without confirming their account, - # access will be blocked just in the third day. Default is 0.days, meaning - # the user cannot access the website without confirming their account. + # access will be blocked just in the third day. + # You can also set it to nil, which will allow the user to access the website + # without confirming their account. + # Default is 0.days, meaning the user cannot access the website without + # confirming their account. # config.allow_unconfirmed_access_for = 2.days # A period that the user is allowed to confirm their account before their @@ -122,7 +148,7 @@ config.reconfirmable = true # Defines which key will be used when confirming an account - # config.confirmation_keys = [ :email ] + # config.confirmation_keys = [:email] # ==> Configuration for :rememberable # The time the user will be remembered without asking for credentials again. @@ -140,21 +166,18 @@ # ==> Configuration for :validatable # Range for password length. - config.password_length = 8..128 + config.password_length = 6..128 # Email regex used to validate email formats. It simply asserts that # one (and only one) @ exists in the given string. This is mainly # to give user feedback and not to assert the e-mail validity. - # config.email_regexp = /\A[^@]+@[^@]+\z/ + config.email_regexp = /\A[^@\s]+@[^@\s]+\z/ # ==> Configuration for :timeoutable # The time you want to timeout the user session without activity. After this # time the user will be asked for credentials again. Default is 30 minutes. # config.timeout_in = 30.minutes - # If true, expires auth token on session timeout. - # config.expire_auth_token_on_timeout = false - # ==> Configuration for :lockable # Defines which strategy will be used to lock an account. # :failed_attempts = Locks an account after a number of failed attempts to sign in. @@ -162,7 +185,7 @@ # config.lock_strategy = :failed_attempts # Defines which key will be used when locking and unlocking an account - # config.unlock_keys = [ :email ] + # config.unlock_keys = [:email] # Defines which strategy will be used to unlock an account. # :email = Sends an unlock link to the user email @@ -184,19 +207,23 @@ # ==> Configuration for :recoverable # # Defines which key will be used when recovering the password for an account - # config.reset_password_keys = [ :email ] + # config.reset_password_keys = [:email] # Time interval you can reset your password with a reset password key. # Don't put a too small interval or your users won't have the time to # change their passwords. config.reset_password_within = 6.hours + # When set to false, does not sign a user in automatically after their password is + # reset. Defaults to true, so a user is signed in automatically after a reset. + # config.sign_in_after_reset_password = true + # ==> Configuration for :encryptable - # Allow you to use another encryption algorithm besides bcrypt (default). You can use - # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, - # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) - # and :restful_authentication_sha1 (then you should set stretches to 10, and copy - # REST_AUTH_SITE_KEY to pepper). + # Allow you to use another hashing or encryption algorithm besides bcrypt (default). + # You can use :sha1, :sha512 or algorithms from others authentication tools as + # :clearance_sha1, :authlogic_sha512 (then you should set stretches above to 20 + # for default behavior) and :restful_authentication_sha1 (then you should set + # stretches to 10, and copy REST_AUTH_SITE_KEY to pepper). # # Require the `devise-encryptable` gem when using anything other than bcrypt # config.encryptor = :sha512 @@ -253,7 +280,20 @@ # The router that invoked `devise_for`, in the example above, would be: # config.router_name = :my_engine # - # When using omniauth, Devise cannot automatically set Omniauth path, + # When using OmniAuth, Devise cannot automatically set OmniAuth path, # so you need to do it manually. For the users scope, it would be: # config.omniauth_path_prefix = '/my_engine/users/auth' + + # ==> Turbolinks configuration + # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly: + # + # ActiveSupport.on_load(:devise_failure_app) do + # include Turbolinks::Controller + # end + + # ==> Configuration for :registerable + + # When set to false, does not sign a user in automatically after their password is + # changed. Defaults to true, so a user is signed in automatically after changing a password. + # config.sign_in_after_change_password = true end diff --git a/petergate_test/config/initializers/filter_parameter_logging.rb b/test/user/config/initializers/filter_parameter_logging.rb similarity index 100% rename from petergate_test/config/initializers/filter_parameter_logging.rb rename to test/user/config/initializers/filter_parameter_logging.rb diff --git a/petergate_test/config/initializers/inflections.rb b/test/user/config/initializers/inflections.rb similarity index 100% rename from petergate_test/config/initializers/inflections.rb rename to test/user/config/initializers/inflections.rb diff --git a/petergate_test/config/initializers/mime_types.rb b/test/user/config/initializers/mime_types.rb similarity index 100% rename from petergate_test/config/initializers/mime_types.rb rename to test/user/config/initializers/mime_types.rb diff --git a/dummy/config/initializers/wrap_parameters.rb b/test/user/config/initializers/wrap_parameters.rb similarity index 80% rename from dummy/config/initializers/wrap_parameters.rb rename to test/user/config/initializers/wrap_parameters.rb index 33725e9..bbfc396 100644 --- a/dummy/config/initializers/wrap_parameters.rb +++ b/test/user/config/initializers/wrap_parameters.rb @@ -5,10 +5,10 @@ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. ActiveSupport.on_load(:action_controller) do - wrap_parameters format: [:json] if respond_to?(:wrap_parameters) + wrap_parameters format: [:json] end # To enable root element in JSON for ActiveRecord objects. # ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true +# self.include_root_in_json = true # end diff --git a/dummy/config/locales/devise.en.yml b/test/user/config/locales/devise.en.yml similarity index 94% rename from dummy/config/locales/devise.en.yml rename to test/user/config/locales/devise.en.yml index 26a10f2..55617bd 100644 --- a/dummy/config/locales/devise.en.yml +++ b/test/user/config/locales/devise.en.yml @@ -23,6 +23,10 @@ en: subject: "Reset password instructions" unlock_instructions: subject: "Unlock instructions" + email_changed: + subject: "Email Changed" + password_change: + subject: "Password Changed" omniauth_callbacks: failure: "Could not authenticate you from %{kind} because \"%{reason}\"." success: "Successfully authenticated from %{kind} account." @@ -40,6 +44,7 @@ en: signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account." update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address." updated: "Your account has been updated successfully." + updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again" sessions: signed_in: "Signed in successfully." signed_out: "Signed out successfully." diff --git a/dummy/config/locales/en.yml b/test/user/config/locales/en.yml similarity index 74% rename from dummy/config/locales/en.yml rename to test/user/config/locales/en.yml index 0653957..decc5a8 100644 --- a/dummy/config/locales/en.yml +++ b/test/user/config/locales/en.yml @@ -16,6 +16,16 @@ # # This would use the information in config/locales/es.yml. # +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# # To learn more, please read the Rails Internationalization guide # available at http://guides.rubyonrails.org/i18n.html. diff --git a/test/user/config/puma.rb b/test/user/config/puma.rb new file mode 100644 index 0000000..a5eccf8 --- /dev/null +++ b/test/user/config/puma.rb @@ -0,0 +1,34 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/petergate_test/config/routes.rb b/test/user/config/routes.rb similarity index 100% rename from petergate_test/config/routes.rb rename to test/user/config/routes.rb diff --git a/test/user/config/spring.rb b/test/user/config/spring.rb new file mode 100644 index 0000000..9fa7863 --- /dev/null +++ b/test/user/config/spring.rb @@ -0,0 +1,6 @@ +%w[ + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +].each { |path| Spring.watch(path) } diff --git a/test/user/config/storage.yml b/test/user/config/storage.yml new file mode 100644 index 0000000..d32f76e --- /dev/null +++ b/test/user/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/dummy/db/migrate/20141117063228_create_blogs.rb b/test/user/db/migrate/20141117063228_create_blogs.rb similarity index 72% rename from dummy/db/migrate/20141117063228_create_blogs.rb rename to test/user/db/migrate/20141117063228_create_blogs.rb index 81d9813..bbe9e92 100644 --- a/dummy/db/migrate/20141117063228_create_blogs.rb +++ b/test/user/db/migrate/20141117063228_create_blogs.rb @@ -1,4 +1,4 @@ -class CreateBlogs < ActiveRecord::Migration +class CreateBlogs < ActiveRecord::Migration[5.1] def change create_table :blogs do |t| t.string :title diff --git a/petergate_test/db/migrate/20141117064643_devise_create_users.rb b/test/user/db/migrate/20141117064643_devise_create_users.rb similarity index 100% rename from petergate_test/db/migrate/20141117064643_devise_create_users.rb rename to test/user/db/migrate/20141117064643_devise_create_users.rb diff --git a/petergate_test/db/migrate/20141117064807_add_roles_to_users.rb b/test/user/db/migrate/20141117064807_add_roles_to_users.rb similarity index 100% rename from petergate_test/db/migrate/20141117064807_add_roles_to_users.rb rename to test/user/db/migrate/20141117064807_add_roles_to_users.rb diff --git a/petergate_test/db/schema.rb b/test/user/db/schema.rb similarity index 100% rename from petergate_test/db/schema.rb rename to test/user/db/schema.rb diff --git a/test/user/db/seeds.rb b/test/user/db/seeds.rb new file mode 100644 index 0000000..1beea2a --- /dev/null +++ b/test/user/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/test/user/lib/assets/.keep b/test/user/lib/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/lib/tasks/.keep b/test/user/lib/tasks/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/log/.keep b/test/user/log/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/package.json b/test/user/package.json new file mode 100644 index 0000000..88544fd --- /dev/null +++ b/test/user/package.json @@ -0,0 +1,5 @@ +{ + "name": "petergate_test", + "private": true, + "dependencies": {} +} diff --git a/dummy/public/404.html b/test/user/public/404.html similarity index 86% rename from dummy/public/404.html rename to test/user/public/404.html index b612547..2be3af2 100644 --- a/dummy/public/404.html +++ b/test/user/public/404.html @@ -4,7 +4,7 @@ The page you were looking for doesn't exist (404) - +
diff --git a/dummy/public/422.html b/test/user/public/422.html similarity index 86% rename from dummy/public/422.html rename to test/user/public/422.html index a21f82b..c08eac0 100644 --- a/dummy/public/422.html +++ b/test/user/public/422.html @@ -4,7 +4,7 @@ The change you wanted was rejected (422) - +
diff --git a/dummy/public/500.html b/test/user/public/500.html similarity index 85% rename from dummy/public/500.html rename to test/user/public/500.html index 061abc5..78a030a 100644 --- a/dummy/public/500.html +++ b/test/user/public/500.html @@ -4,7 +4,7 @@ We're sorry, but something went wrong (500) - +
diff --git a/test/user/public/apple-touch-icon-precomposed.png b/test/user/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000..e69de29 diff --git a/test/user/public/apple-touch-icon.png b/test/user/public/apple-touch-icon.png new file mode 100644 index 0000000..e69de29 diff --git a/test/user/public/favicon.ico b/test/user/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/test/user/public/robots.txt b/test/user/public/robots.txt new file mode 100644 index 0000000..37b576a --- /dev/null +++ b/test/user/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/test/user/storage/.keep b/test/user/storage/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/test/controllers/.keep b/test/user/test/controllers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/controllers/base_controller_test.rb b/test/user/test/controllers/base_controller_test.rb similarity index 100% rename from petergate_test/test/controllers/base_controller_test.rb rename to test/user/test/controllers/base_controller_test.rb diff --git a/petergate_test/test/controllers/blogs_multiple_controller_test.rb b/test/user/test/controllers/blogs_multiple_controller_test.rb similarity index 100% rename from petergate_test/test/controllers/blogs_multiple_controller_test.rb rename to test/user/test/controllers/blogs_multiple_controller_test.rb diff --git a/petergate_test/test/controllers/blogs_singular_controller_test.rb b/test/user/test/controllers/blogs_singular_controller_test.rb similarity index 100% rename from petergate_test/test/controllers/blogs_singular_controller_test.rb rename to test/user/test/controllers/blogs_singular_controller_test.rb diff --git a/petergate_test/test/controllers/test_controller_test.rb b/test/user/test/controllers/test_controller_test.rb similarity index 100% rename from petergate_test/test/controllers/test_controller_test.rb rename to test/user/test/controllers/test_controller_test.rb diff --git a/test/user/test/fixtures/.keep b/test/user/test/fixtures/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/fixtures/blogs.yml b/test/user/test/fixtures/blogs.yml similarity index 100% rename from petergate_test/test/fixtures/blogs.yml rename to test/user/test/fixtures/blogs.yml diff --git a/petergate_test/test/fixtures/users.yml b/test/user/test/fixtures/users.yml similarity index 100% rename from petergate_test/test/fixtures/users.yml rename to test/user/test/fixtures/users.yml diff --git a/test/user/test/helpers/.keep b/test/user/test/helpers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/test/integration/.keep b/test/user/test/integration/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/test/mailers/.keep b/test/user/test/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/test/models/.keep b/test/user/test/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/petergate_test/test/models/blog_test.rb b/test/user/test/models/blog_test.rb similarity index 100% rename from petergate_test/test/models/blog_test.rb rename to test/user/test/models/blog_test.rb diff --git a/dummy/test/models/user_test.rb b/test/user/test/models/user_test.rb similarity index 100% rename from dummy/test/models/user_test.rb rename to test/user/test/models/user_test.rb diff --git a/petergate_test/test/test_helper.rb b/test/user/test/test_helper.rb similarity index 100% rename from petergate_test/test/test_helper.rb rename to test/user/test/test_helper.rb diff --git a/test/user/tmp/.keep b/test/user/tmp/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/user/vendor/.keep b/test/user/vendor/.keep new file mode 100644 index 0000000..e69de29 From 282e31424bcfe02349815b72caa271204646ad4d Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Thu, 5 Sep 2019 12:48:46 -0700 Subject: [PATCH 07/12] Fixed merge conflicts --- .../blogs_multiple_controller_test.rb | 1 + .../blogs_singular_controller_test.rb | 62 +++++++++---------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/test/employee/test/controllers/blogs_multiple_controller_test.rb b/test/employee/test/controllers/blogs_multiple_controller_test.rb index e98597f..7b770bb 100644 --- a/test/employee/test/controllers/blogs_multiple_controller_test.rb +++ b/test/employee/test/controllers/blogs_multiple_controller_test.rb @@ -1,4 +1,5 @@ require "test_helper" + describe BlogsController do ################################################################################ # ADMIN ROLE diff --git a/test/employee/test/controllers/blogs_singular_controller_test.rb b/test/employee/test/controllers/blogs_singular_controller_test.rb index 90e1002..380abbf 100644 --- a/test/employee/test/controllers/blogs_singular_controller_test.rb +++ b/test/employee/test/controllers/blogs_singular_controller_test.rb @@ -13,42 +13,42 @@ let(:blog) { blogs :one } it "gets index" do - get blogs_url + get root_path assert_response :success - assert_not_equal 0, Blog.count + assert_not_nil blogs end it "gets new" do - get new_blog_url + get new_blog_path assert_response :success end it "creates blog" do assert_difference('Blog.count') do - post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + post blogs_path, params: { blog: { content: blog.content, title: blog.title } } end assert_redirected_to blog_path(Blog.last) end it "shows blog" do - get blog_url blog + get blog_path(blog) assert_response :success end it "gets edit" do - get edit_blog_url blog + get edit_blog_path(blog) assert_response :success end it "updates blog" do - put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + put blog_path(blog), params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to blog_path(blog) end it "destroys blog" do assert_difference('Blog.count', -1) do - delete blog_url blog + delete blog_path(blog) end assert_redirected_to blogs_path @@ -67,69 +67,68 @@ let(:blog) { blogs :one } it "plain user can see index" do - get blogs_url + get root_path assert_response :success - assert_not_equal 0, Blog.count + assert_not_nil blog end it "gets permission denied on new" do - get new_blog_url + get new_blog_path assert_response 302 flash[:notice].must_equal "Permission Denied" end it "gets forbidden and no redirect with json format on new" do assert_webservice_is_forbiddden do |format| - get new_blog_url(format: format) + get new_blog_path, headers: { 'Accept': Mime[format].to_s, 'Content-Type': Mime[format].to_s } end end it "doesn't allow plain user to create blog post" do assert_no_difference('Blog.count') do - post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + post blogs_path, params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - post blogs_url(format: format), params: { blog: { content: blog.content, title: blog.title } } + post blogs_path, headers: { 'Accept': Mime[format].to_s, 'Content-Type': Mime[format].to_s }, params: { blog: { content: blog.content, title: blog.title } }.to_json end end end it "can see show blog" do - get blog_url blog + get blog_path(blog) assert_response :success end it "can't get to edit page" do - get edit_blog_url blog + get edit_blog_path(blog) assert_response 302 end it "can't update blog" do - put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + put blog_path(blog), params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - put blog_url(blog, format: format), params: { blog: { content: blog.content, title: blog.title } } + put blog_path(blog), headers: { 'Accept': Mime[format].to_s, 'Content-Type': Mime[format].to_s }, params: { blog: { content: blog.content, title: blog.title } }.to_json end end it "can't destroy blog" do assert_no_difference('Blog.count') do - delete blog_url blog + delete blog_path(blog) assert_redirected_to root_path assert_webservice_is_forbiddden do |format| - delete blog_url blog - delete blog_url(blog, format: format) + delete blog_path(blog), headers: { 'Accept': Mime[format].to_s, 'Content-Type': Mime[format].to_s } end end end end - ################################################################################# + ################################################################################ # COMPANY_ADMIN ROLE - ################################################################################# + ################################################################################ describe "Singular: Test that everything works if company_admin is logged in" do before do Employee.petergate(roles: [:root_admin, :company_admin], multiple: false) @@ -139,42 +138,42 @@ let(:blog) { blogs :one } it "gets index" do - get blogs_url + get root_path assert_response :success - assert_not_equal 0, Blog.count + assert_not_nil blog end it "gets new" do - get new_blog_url + get new_blog_path assert_response :success end it "creates blog" do assert_difference('Blog.count') do - post blogs_url, params: { blog: { content: blog.content, title: blog.title } } + post blogs_path, params: { blog: { content: blog.content, title: blog.title } } end assert_redirected_to blog_path(Blog.last) end it "shows blog" do - get blog_url blog + get blog_path(blog) assert_response :success end it "gets edit" do - get edit_blog_url blog + get edit_blog_path(blog) assert_response :success end it "updates blog" do - put blog_url blog, params: { blog: { content: blog.content, title: blog.title } } + put blog_path(blog), params: { blog: { content: blog.content, title: blog.title } } assert_redirected_to blog_path(blog) end it "can't destroy blog" do assert_no_difference('Blog.count', -1) do - delete blog_url blog + delete blog_path(blog) end assert_redirected_to root_path @@ -190,3 +189,4 @@ def assert_webservice_is_forbiddden(&block) end end end + From d46e0817faa5babe86340e23d9398ab475f539c9 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Thu, 5 Sep 2019 12:54:54 -0700 Subject: [PATCH 08/12] added bundle install to travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 83de30a..b22187a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ rvm: - "2.5.1" before_script: - - "cd test/user && rails db:create db:migrate" - - "cd test/employee && rails db:create db:migrate" + - "cd test/user && bundle install && rails db:create db:migrate" + - "cd test/employee && bundle install && rails db:create db:migrate" script: - "cd test/user && bundle exec rails test" From 5e52dd56860465b767176cf11f84ada1cf823432 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Thu, 5 Sep 2019 14:21:13 -0700 Subject: [PATCH 09/12] fixed bundler version --- .travis.yml | 2 ++ petergate.gemspec | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b22187a..a7f25a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,8 +5,10 @@ rvm: before_script: - "cd test/user && bundle install && rails db:create db:migrate" + - "cd ../.." - "cd test/employee && bundle install && rails db:create db:migrate" script: - "cd test/user && bundle exec rails test" + - "cd ../.." - "cd test/employee && bundle exec rails test" diff --git a/petergate.gemspec b/petergate.gemspec index c048802..adb231e 100644 --- a/petergate.gemspec +++ b/petergate.gemspec @@ -18,7 +18,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.post_install_message = "NOTICE: As of version 1.5.0, the :admin role has been changed to :root_admin." - spec.add_development_dependency "bundler", "~> 1.7" + spec.add_development_dependency "bundler", "> 1.7" spec.add_development_dependency "rake", "~> 12.3" spec.add_dependency 'activerecord', "> 4.0.0" end From bf070633e45386d5ffa0fb2f58ff4613cf18e719 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Thu, 5 Sep 2019 16:08:43 -0700 Subject: [PATCH 10/12] added tests to travis.yml --- .travis.yml | 19 ++++++----- Gemfile | 64 ++++++++++++++++++++++++++++++++++++ test/employee/config/boot.rb | 2 +- test/user/config/boot.rb | 2 +- 4 files changed, 77 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index a7f25a9..d0fcabd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,12 +3,15 @@ language: ruby rvm: - "2.5.1" -before_script: - - "cd test/user && bundle install && rails db:create db:migrate" - - "cd ../.." - - "cd test/employee && bundle install && rails db:create db:migrate" - script: - - "cd test/user && bundle exec rails test" - - "cd ../.." - - "cd test/employee && bundle exec rails test" + - "cd test/user" + - "bundle install" + - "rake db:create" + - "rake db:migrate" + - "bundle exec rake test" + - "cd .." + - "cd employee" + - "bundle install" + - "rake db:create" + - "rake db:migrate" + - "bundle exec rake test" diff --git a/Gemfile b/Gemfile index 343b21b..a9ebed4 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,69 @@ source 'https://rubygems.org' +ruby '2.5.1' + # Specify your gem's dependencies in petergate.gemspec gemspec +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.2' +# Use sqlite3 as the database for Active Record +gem 'sqlite3' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'mini_racer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false +gem 'devise' + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + gem 'pry', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of chromedriver to run system tests with Chrome + gem 'chromedriver-helper' + gem "minitest-rails" + gem "minitest-reporters" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + diff --git a/test/employee/config/boot.rb b/test/employee/config/boot.rb index b9e460c..4423c97 100644 --- a/test/employee/config/boot.rb +++ b/test/employee/config/boot.rb @@ -1,4 +1,4 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +# require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/test/user/config/boot.rb b/test/user/config/boot.rb index b9e460c..4423c97 100644 --- a/test/user/config/boot.rb +++ b/test/user/config/boot.rb @@ -1,4 +1,4 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +# require 'bootsnap/setup' # Speed up boot time by caching expensive operations. From 2adf6e045cec4c007e7c8ab76bac6d52035a17e9 Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Thu, 5 Sep 2019 16:14:26 -0700 Subject: [PATCH 11/12] refactored yml --- .travis.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index d0fcabd..5323b6b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,14 +4,6 @@ rvm: - "2.5.1" script: - - "cd test/user" - - "bundle install" - - "rake db:create" - - "rake db:migrate" - - "bundle exec rake test" + - "cd test/user && bundle install && rake db:create && rake db:migrate && bundle exec rake test" - "cd .." - - "cd employee" - - "bundle install" - - "rake db:create" - - "rake db:migrate" - - "bundle exec rake test" + - "cd employee && bundle install && rake db:create && rake db:migrate && bundle exec rake test" From 67b8347d67227e81f1a8f41a2ace87f5da12cd8b Mon Sep 17 00:00:00 2001 From: Sam Holst Date: Fri, 6 Sep 2019 10:28:08 -0700 Subject: [PATCH 12/12] deleted previously created actions that are no longer needed --- test/employee/app/views/blogs/create.js.erb | 0 test/employee/app/views/blogs/create.json.jbuilder | 0 test/employee/app/views/blogs/create.xml | 0 test/employee/app/views/blogs/destroy.js.erb | 0 test/employee/app/views/blogs/destroy.json.jbuilder | 0 test/employee/app/views/blogs/destroy.xml | 0 test/employee/app/views/blogs/new.js.erb | 0 test/employee/app/views/blogs/new.json.jbuilder | 0 test/employee/app/views/blogs/new.xml | 0 test/employee/app/views/blogs/show.json.jbuilder | 1 - test/employee/app/views/blogs/update.js.erb | 0 test/employee/app/views/blogs/update.json.jbuilder | 0 test/employee/app/views/blogs/update.xml | 0 test/employee/app/views/test/index.js | 0 test/user/app/views/blogs/create.js.erb | 0 test/user/app/views/blogs/create.json.jbuilder | 0 test/user/app/views/blogs/create.xml | 0 test/user/app/views/blogs/destroy.js.erb | 0 test/user/app/views/blogs/destroy.json.jbuilder | 0 test/user/app/views/blogs/destroy.xml | 0 test/user/app/views/blogs/new.js.erb | 0 test/user/app/views/blogs/new.json.jbuilder | 0 test/user/app/views/blogs/new.xml | 0 test/user/app/views/blogs/show.json.jbuilder | 1 - test/user/app/views/blogs/update.js.erb | 0 test/user/app/views/blogs/update.json.jbuilder | 0 test/user/app/views/blogs/update.xml | 0 test/user/app/views/test/index.js | 0 28 files changed, 2 deletions(-) delete mode 100644 test/employee/app/views/blogs/create.js.erb delete mode 100644 test/employee/app/views/blogs/create.json.jbuilder delete mode 100644 test/employee/app/views/blogs/create.xml delete mode 100644 test/employee/app/views/blogs/destroy.js.erb delete mode 100644 test/employee/app/views/blogs/destroy.json.jbuilder delete mode 100644 test/employee/app/views/blogs/destroy.xml delete mode 100644 test/employee/app/views/blogs/new.js.erb delete mode 100644 test/employee/app/views/blogs/new.json.jbuilder delete mode 100644 test/employee/app/views/blogs/new.xml delete mode 100644 test/employee/app/views/blogs/show.json.jbuilder delete mode 100644 test/employee/app/views/blogs/update.js.erb delete mode 100644 test/employee/app/views/blogs/update.json.jbuilder delete mode 100644 test/employee/app/views/blogs/update.xml delete mode 100644 test/employee/app/views/test/index.js delete mode 100644 test/user/app/views/blogs/create.js.erb delete mode 100644 test/user/app/views/blogs/create.json.jbuilder delete mode 100644 test/user/app/views/blogs/create.xml delete mode 100644 test/user/app/views/blogs/destroy.js.erb delete mode 100644 test/user/app/views/blogs/destroy.json.jbuilder delete mode 100644 test/user/app/views/blogs/destroy.xml delete mode 100644 test/user/app/views/blogs/new.js.erb delete mode 100644 test/user/app/views/blogs/new.json.jbuilder delete mode 100644 test/user/app/views/blogs/new.xml delete mode 100644 test/user/app/views/blogs/show.json.jbuilder delete mode 100644 test/user/app/views/blogs/update.js.erb delete mode 100644 test/user/app/views/blogs/update.json.jbuilder delete mode 100644 test/user/app/views/blogs/update.xml delete mode 100644 test/user/app/views/test/index.js diff --git a/test/employee/app/views/blogs/create.js.erb b/test/employee/app/views/blogs/create.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/create.json.jbuilder b/test/employee/app/views/blogs/create.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/create.xml b/test/employee/app/views/blogs/create.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/destroy.js.erb b/test/employee/app/views/blogs/destroy.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/destroy.json.jbuilder b/test/employee/app/views/blogs/destroy.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/destroy.xml b/test/employee/app/views/blogs/destroy.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/new.js.erb b/test/employee/app/views/blogs/new.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/new.json.jbuilder b/test/employee/app/views/blogs/new.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/new.xml b/test/employee/app/views/blogs/new.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/show.json.jbuilder b/test/employee/app/views/blogs/show.json.jbuilder deleted file mode 100644 index c324ac2..0000000 --- a/test/employee/app/views/blogs/show.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.extract! @blog, :id, :title, :content, :created_at, :updated_at diff --git a/test/employee/app/views/blogs/update.js.erb b/test/employee/app/views/blogs/update.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/update.json.jbuilder b/test/employee/app/views/blogs/update.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/blogs/update.xml b/test/employee/app/views/blogs/update.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/employee/app/views/test/index.js b/test/employee/app/views/test/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/create.js.erb b/test/user/app/views/blogs/create.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/create.json.jbuilder b/test/user/app/views/blogs/create.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/create.xml b/test/user/app/views/blogs/create.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/destroy.js.erb b/test/user/app/views/blogs/destroy.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/destroy.json.jbuilder b/test/user/app/views/blogs/destroy.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/destroy.xml b/test/user/app/views/blogs/destroy.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/new.js.erb b/test/user/app/views/blogs/new.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/new.json.jbuilder b/test/user/app/views/blogs/new.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/new.xml b/test/user/app/views/blogs/new.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/show.json.jbuilder b/test/user/app/views/blogs/show.json.jbuilder deleted file mode 100644 index c324ac2..0000000 --- a/test/user/app/views/blogs/show.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.extract! @blog, :id, :title, :content, :created_at, :updated_at diff --git a/test/user/app/views/blogs/update.js.erb b/test/user/app/views/blogs/update.js.erb deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/update.json.jbuilder b/test/user/app/views/blogs/update.json.jbuilder deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/blogs/update.xml b/test/user/app/views/blogs/update.xml deleted file mode 100644 index e69de29..0000000 diff --git a/test/user/app/views/test/index.js b/test/user/app/views/test/index.js deleted file mode 100644 index e69de29..0000000