From 45380368458327d908d00021aac415cf1e8529c3 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Tue, 1 Dec 2020 18:40:32 -0800 Subject: [PATCH 01/48] Fist commit, .idea .generators to gitignore. --- .gitignore | 29 +++ .rakeTasks | 7 + .ruby-version | 1 + Gemfile | 57 +++++ Gemfile.lock | 212 ++++++++++++++++++ Guardfile | 9 + Rakefile | 6 + app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/jobs/application_job.rb | 7 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/mailer.html.erb | 13 ++ app/views/layouts/mailer.text.erb | 1 + bin/bundle | 114 ++++++++++ bin/rails | 9 + bin/rake | 9 + bin/setup | 33 +++ bin/spring | 17 ++ config.ru | 5 + config/application.rb | 41 ++++ config/boot.rb | 4 + config/cable.yml | 10 + config/credentials.yml.enc | 1 + config/database.yml | 85 +++++++ config/environment.rb | 5 + config/environments/development.rb | 52 +++++ config/environments/production.rb | 105 +++++++++ config/environments/test.rb | 49 ++++ config/initializers/action_view.rb | 1 + .../application_controller_renderer.rb | 8 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/cors.rb | 16 ++ .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 ++ config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 ++ config/locales/en.yml | 33 +++ config/puma.rb | 38 ++++ config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 +++ lib/tasks/.keep | 0 log/.keep | 0 node_modules/.yarn-integrity | 10 + public/robots.txt | 1 + storage/.keep | 0 .../application_cable/connection_test.rb | 11 + test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/test_helper.rb | 21 ++ tmp/.keep | 0 tmp/pids/.keep | 0 vendor/.keep | 0 yarn.lock | 4 + 59 files changed, 1129 insertions(+) create mode 100644 .gitignore create mode 100644 .rakeTasks create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 Rakefile create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/action_view.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cors.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/spring.rb create mode 100644 config/storage.yml create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 node_modules/.yarn-integrity create mode 100644 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/channels/application_cable/connection_test.rb create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 tmp/pids/.keep create mode 100644 vendor/.keep create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..c871695c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# 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 +.generators +.idea + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/ +!/tmp/pids/.keep + +# Ignore uploaded files in development. +/storage/* +!/storage/.keep +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/.rakeTasks b/.rakeTasks new file mode 100644 index 000000000..16fb1f24a --- /dev/null +++ b/.rakeTasks @@ -0,0 +1,7 @@ + + diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 000000000..57cf282eb --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.6.5 diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..bfacd7a13 --- /dev/null +++ b/Gemfile @@ -0,0 +1,57 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.6.5' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 6.0.3', '>= 6.0.3.4' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 4.1' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +# gem 'jbuilder', '~> 2.7' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use Active Model has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Active Storage variant +# gem 'image_processing', '~> 1.2' + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.4.2', require: false + +# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible +# gem 'rack-cors' + +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 + gem 'listen', '~> 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 + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'guard' + gem 'guard-minitest' + gem 'debase', '>= 0.2.4.1' + gem 'ruby-debug-ide', '>= 0.7.0' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..fc039d7d8 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,212 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (6.0.3.4) + actionpack (= 6.0.3.4) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (6.0.3.4) + actionpack (= 6.0.3.4) + activejob (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + mail (>= 2.7.1) + actionmailer (6.0.3.4) + actionpack (= 6.0.3.4) + actionview (= 6.0.3.4) + activejob (= 6.0.3.4) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (6.0.3.4) + actionview (= 6.0.3.4) + activesupport (= 6.0.3.4) + rack (~> 2.0, >= 2.0.8) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.0.3.4) + actionpack (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + nokogiri (>= 1.8.5) + actionview (6.0.3.4) + activesupport (= 6.0.3.4) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + activejob (6.0.3.4) + activesupport (= 6.0.3.4) + globalid (>= 0.3.6) + activemodel (6.0.3.4) + activesupport (= 6.0.3.4) + activerecord (6.0.3.4) + activemodel (= 6.0.3.4) + activesupport (= 6.0.3.4) + activestorage (6.0.3.4) + actionpack (= 6.0.3.4) + activejob (= 6.0.3.4) + activerecord (= 6.0.3.4) + marcel (~> 0.3.1) + activesupport (6.0.3.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + ansi (1.5.0) + bootsnap (1.5.1) + msgpack (~> 1.0) + builder (3.2.4) + byebug (11.1.3) + coderay (1.1.3) + concurrent-ruby (1.1.7) + crass (1.0.6) + debase (2.3.0) + debase-ruby_core_source (~> 0.10.10) + debase-ruby_core_source (0.10.11) + erubi (1.10.0) + ffi (1.13.1) + formatador (0.2.5) + globalid (0.4.2) + activesupport (>= 4.2.0) + guard (2.16.2) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-minitest (2.4.6) + guard-compat (~> 1.2) + minitest (>= 3.0) + i18n (1.8.5) + concurrent-ruby (~> 1.0) + listen (3.3.3) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + loofah (2.8.0) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.2.8) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (1.0.0) + mimemagic (0.3.5) + mini_mime (1.0.2) + mini_portile2 (2.4.0) + minitest (5.14.2) + minitest-rails (6.0.1) + minitest (~> 5.10) + railties (~> 6.0.0) + minitest-reporters (1.4.2) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.3.3) + nenv (0.3.0) + nio4r (2.5.4) + nokogiri (1.10.10) + mini_portile2 (~> 2.4.0) + notiffany (0.1.3) + nenv (~> 0.1) + shellany (~> 0.0) + pg (1.2.3) + pry (0.13.1) + coderay (~> 1.1) + method_source (~> 1.0) + pry-rails (0.3.9) + pry (>= 0.10.4) + puma (4.3.7) + nio4r (~> 2.0) + rack (2.2.3) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (6.0.3.4) + actioncable (= 6.0.3.4) + actionmailbox (= 6.0.3.4) + actionmailer (= 6.0.3.4) + actionpack (= 6.0.3.4) + actiontext (= 6.0.3.4) + actionview (= 6.0.3.4) + activejob (= 6.0.3.4) + activemodel (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + bundler (>= 1.3.0) + railties (= 6.0.3.4) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + railties (6.0.3.4) + actionpack (= 6.0.3.4) + activesupport (= 6.0.3.4) + method_source + rake (>= 0.8.7) + thor (>= 0.20.3, < 2.0) + rake (13.0.1) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + ruby-debug-ide (2.3.0) + debase (~> 2.3.0) + ruby-progressbar (1.10.1) + shellany (0.0.1) + spring (2.1.1) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (4.0.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.2) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (1.0.1) + thread_safe (0.3.6) + tzinfo (1.2.8) + thread_safe (~> 0.1) + websocket-driver (0.7.3) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + zeitwerk (2.4.2) + +PLATFORMS + ruby + +DEPENDENCIES + bootsnap (>= 1.4.2) + byebug + debase (>= 0.2.4.1) + guard + guard-minitest + listen (~> 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 4.1) + rails (~> 6.0.3, >= 6.0.3.4) + ruby-debug-ide (>= 0.7.0) + spring + spring-watcher-listen (~> 2.0.0) + tzinfo-data + +RUBY VERSION + ruby 2.6.5p114 + +BUNDLED WITH + 2.1.4 diff --git a/Guardfile b/Guardfile new file mode 100644 index 000000000..e34f706f4 --- /dev/null +++ b/Guardfile @@ -0,0 +1,9 @@ +guard :minitest, autorun: false, spring: true do + watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' } + watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" } + watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" } + watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" } + watch(%r{^test/.+_test.rb$}) + watch(%r{^test/test_helper.rb$}) { 'test' } +end diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..e85f91391 --- /dev/null +++ b/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/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 000000000..d67269728 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 000000000..0ff5442f4 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 000000000..4ac8823b0 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::API +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 000000000..d394c3d10 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,7 @@ +class ApplicationJob < ActiveJob::Base + # Automatically retry jobs that encountered a deadlock + # retry_on ActiveRecord::Deadlocked + + # Most jobs are safe to ignore if the underlying records are no longer available + # discard_on ActiveJob::DeserializationError +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 000000000..286b2239d --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 000000000..10a4cba84 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 000000000..cbd34d2e9 --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 000000000..37f0bddbd --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 000000000..a71368e32 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,114 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'bundle' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "rubygems" + +m = Module.new do + module_function + + def invoked_as_script? + File.expand_path($0) == File.expand_path(__FILE__) + end + + def env_var_version + ENV["BUNDLER_VERSION"] + end + + def cli_arg_version + return unless invoked_as_script? # don't want to hijack other binstubs + return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` + bundler_version = nil + update_index = nil + ARGV.each_with_index do |a, i| + if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN + bundler_version = a + end + next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ + bundler_version = $1 + update_index = i + end + bundler_version + end + + def gemfile + gemfile = ENV["BUNDLE_GEMFILE"] + return gemfile if gemfile && !gemfile.empty? + + File.expand_path("../../Gemfile", __FILE__) + end + + def lockfile + lockfile = + case File.basename(gemfile) + when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) + else "#{gemfile}.lock" + end + File.expand_path(lockfile) + end + + def lockfile_version + return unless File.file?(lockfile) + lockfile_contents = File.read(lockfile) + return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ + Regexp.last_match(1) + end + + def bundler_version + @bundler_version ||= + env_var_version || cli_arg_version || + lockfile_version + end + + def bundler_requirement + return "#{Gem::Requirement.default}.a" unless bundler_version + + bundler_gem_version = Gem::Version.new(bundler_version) + + requirement = bundler_gem_version.approximate_recommendation + + return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") + + requirement += ".a" if bundler_gem_version.prerelease? + + requirement + end + + def load_bundler! + ENV["BUNDLE_GEMFILE"] ||= gemfile + + activate_bundler + end + + def activate_bundler + gem_error = activation_error_handling do + gem "bundler", bundler_requirement + end + return if gem_error.nil? + require_error = activation_error_handling do + require "bundler/version" + end + return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) + warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" + exit 42 + end + + def activation_error_handling + yield + nil + rescue StandardError, LoadError => e + e + end +end + +m.load_bundler! + +if m.invoked_as_script? + load Gem.bin_path("bundler", "bundle") +end diff --git a/bin/rails b/bin/rails new file mode 100755 index 000000000..5badb2fde --- /dev/null +++ b/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/bin/rake b/bin/rake new file mode 100755 index 000000000..d87d5f578 --- /dev/null +++ b/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/bin/setup b/bin/setup new file mode 100755 index 000000000..0e39e8cb1 --- /dev/null +++ b/bin/setup @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby +require 'fileutils' + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +FileUtils.chdir APP_ROOT do + # This script is a way to setup or update your development environment automatically. + # This script is idempotent, so that you can run it at anytime and get an expectable outcome. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:prepare' + + 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/bin/spring b/bin/spring new file mode 100755 index 000000000..d89ee495f --- /dev/null +++ b/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/config.ru b/config.ru new file mode 100644 index 000000000..f7ba0b527 --- /dev/null +++ b/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/config/application.rb b/config/application.rb new file mode 100644 index 000000000..43301a817 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,41 @@ +require_relative 'boot' + +require "rails" +# Pick the frameworks you want: +require "active_model/railtie" +require "active_job/railtie" +require "active_record/railtie" +require "active_storage/engine" +require "action_controller/railtie" +require "action_mailer/railtie" +require "action_mailbox/engine" +require "action_text/engine" +require "action_view/railtie" +require "action_cable/engine" +# require "sprockets/railtie" +require "rails/test_unit/railtie" + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module VideoStoreApi + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 6.0 + + # 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. + + # Only loads a smaller set of middleware suitable for API only apps. + # Middleware like session, flash, cookies can be added back manually. + # Skip views, helpers and assets when generating a new resource. + config.api_only = true + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 000000000..b9e460cef --- /dev/null +++ b/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/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..6b21ab7bc --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: test + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: video_store_api_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 000000000..8390b040c --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +84MRcRrJIYOL90rJn51LH3oO2CV7BWxZM2LPOrSga+25BKfZOW137qzjToW2wVnFu7r6rPNOC7LCQ/lovHQY6yCFtoPjmVqH5GBFwAUl4q9DAgRsdSXfEd8PZJAlN62LbihrwW6kfVF1bFfRpRJRtiTEzHYiSH5lSneOngOWwOWo1UUAr+KrnvYmJ/oS4IuhArXQQZq5cHeavdvcUeaCqZ8eAtl3+L2IdDkt5W6bZdy3Bm7D9DT9X4n4AMU0c//iKcPguUxE5DW4SY6MQKHdFmyEUqFRfYOd91kBqjtA63QIYaCl5P+3mBSTFwjQGe/3cWRkWl62HyZEq8FGnf7kEGj6lqZ2E6xj53FhdRNJP2m8amF6Soog9NQHgFRr1MS3vH/D1Pc/am2w6TYCaYanli2ZqZB6rX+V2Cu1--UbIjamPZICW+QX3Z--P7xtJQi4HWWrV0LwQNP2Ew== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 000000000..8536d1cda --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.3 and up are supported. +# +# Install the pg driver: +# gem install pg +# On macOS with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On macOS with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # https://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: video_store_api_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: video_store_api + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# 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: video_store_api_test + +# As with config/credentials.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: video_store_api_production + username: video_store_api + password: <%= ENV['VIDEO_STORE_API_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 000000000..426333bb4 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 000000000..698f159d8 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,52 @@ +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.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 + + + # 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/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 000000000..7a3bb3e50 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,105 @@ +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 + + # 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? + + # 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 = "video_store_api_production" + + 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 + + # Inserts middleware to perform automatic connection switching. + # The `database_selector` hash is used to pass options to the DatabaseSelector + # middleware. The `delay` is used to determine how long to wait after a write + # to send a subsequent read to the primary. + # + # The `database_resolver` class is used by the middleware to determine which + # database is appropriate to use based on the time delay. + # + # The `database_resolver_context` class is used by the middleware to set + # timestamps for the last write to the primary. The resolver uses the context + # class timestamps to determine how long to wait before reading from the + # replica. + # + # By default Rails will store a last write timestamp in the session. The + # DatabaseSelector middleware is designed as such you can define your own + # strategy for connection switching and pass that into the middleware through + # these configuration options. + # config.active_record.database_selector = { delay: 2.seconds } + # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 000000000..0cb24249b --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,49 @@ +# 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! + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + config.cache_classes = false + config.action_view.cache_template_loading = true + + # 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 + config.cache_store = :null_store + + # 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/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 000000000..142d382f8 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1 @@ +Rails.application.config.action_view.form_with_generates_remote_forms = false diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/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/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 000000000..59385cdf3 --- /dev/null +++ b/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/config/initializers/cors.rb b/config/initializers/cors.rb new file mode 100644 index 000000000..3b1c1b5ed --- /dev/null +++ b/config/initializers/cors.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Avoid CORS issues when API is called from the frontend app. +# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. + +# Read more: https://github.com/cyu/rack-cors + +# Rails.application.config.middleware.insert_before 0, Rack::Cors do +# allow do +# origins 'example.com' +# +# resource '*', +# headers: :any, +# methods: [:get, :post, :put, :patch, :delete, :options, :head] +# end +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 000000000..4a994e1e7 --- /dev/null +++ b/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/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 000000000..ac033bf9d --- /dev/null +++ b/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/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 000000000..dc1899682 --- /dev/null +++ b/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/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 000000000..bbfc3961b --- /dev/null +++ b/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/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 000000000..cf9b342d0 --- /dev/null +++ b/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 https://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 000000000..5ed443774 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,38 @@ +# 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. +# +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_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 `pidfile` that Puma will use. +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked web server 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/config/routes.rb b/config/routes.rb new file mode 100644 index 000000000..c06383a17 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html +end diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..db5bf1307 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +Spring.watch( + ".ruby-version", + ".rbenv-vars", + "tmp/restart.txt", + "tmp/caching-dev.txt" +) diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 000000000..d32f76e8f --- /dev/null +++ b/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/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/log/.keep b/log/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 000000000..19c018ab8 --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "darwin-x64-88", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..c19f78ab6 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/channels/application_cable/connection_test.rb b/test/channels/application_cable/connection_test.rb new file mode 100644 index 000000000..800405f15 --- /dev/null +++ b/test/channels/application_cable/connection_test.rb @@ -0,0 +1,11 @@ +require "test_helper" + +class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase + # test "connects with cookies" do + # cookies.signed[:user_id] = 42 + # + # connect + # + # assert_equal connection.user_id, "42" + # end +end diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 000000000..b19af0d5b --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,21 @@ +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +require 'rails/test_help' +require "minitest/rails" +require "minitest/reporters" # for Colorized output +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + +class ActiveSupport::TestCase + # Run tests in parallel with specified workers + # parallelize(workers: :number_of_processors) # causes out of order output. + + # 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/tmp/.keep b/tmp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/tmp/pids/.keep b/tmp/pids/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..fb57ccd13 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + From fd13e39064932a2c0b1492b3f6581b3db1b36470 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Tue, 1 Dec 2020 19:25:55 -0800 Subject: [PATCH 02/48] Added Videos and Cutomers controllers. --- app/controllers/customers_controller.rb | 10 ++++++++++ app/controllers/videos_controller.rb | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 app/controllers/customers_controller.rb create mode 100644 app/controllers/videos_controller.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb new file mode 100644 index 000000000..ecd1ca570 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,10 @@ +class CustomersController < ApplicationController + + def index + + end + + def show + + end +end diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb new file mode 100644 index 000000000..bf3b98047 --- /dev/null +++ b/app/controllers/videos_controller.rb @@ -0,0 +1,11 @@ +class VideosController < ApplicationController + + def index + + end + + def show + + end + +end From 1db0dacc425060dfb133c7a89ba1a437cda6dbee Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Tue, 1 Dec 2020 19:36:12 -0800 Subject: [PATCH 03/48] Added Video and Customer models. --- app/models/customer.rb | 2 ++ app/models/video.rb | 2 ++ db/migrate/20201202033153_create_videos.rb | 13 +++++++++++++ db/migrate/20201202033556_create_customers.rb | 16 ++++++++++++++++ test/models/customer_test.rb | 7 +++++++ test/models/video_test.rb | 7 +++++++ 6 files changed, 47 insertions(+) create mode 100644 app/models/customer.rb create mode 100644 app/models/video.rb create mode 100644 db/migrate/20201202033153_create_videos.rb create mode 100644 db/migrate/20201202033556_create_customers.rb create mode 100644 test/models/customer_test.rb create mode 100644 test/models/video_test.rb diff --git a/app/models/customer.rb b/app/models/customer.rb new file mode 100644 index 000000000..0b5277335 --- /dev/null +++ b/app/models/customer.rb @@ -0,0 +1,2 @@ +class Customer < ApplicationRecord +end diff --git a/app/models/video.rb b/app/models/video.rb new file mode 100644 index 000000000..dc572b44b --- /dev/null +++ b/app/models/video.rb @@ -0,0 +1,2 @@ +class Video < ApplicationRecord +end diff --git a/db/migrate/20201202033153_create_videos.rb b/db/migrate/20201202033153_create_videos.rb new file mode 100644 index 000000000..166cf0b96 --- /dev/null +++ b/db/migrate/20201202033153_create_videos.rb @@ -0,0 +1,13 @@ +class CreateVideos < ActiveRecord::Migration[6.0] + def change + create_table :videos do |t| + t.string :title + t.string :overview + t.date :release_date + t.integer :total_inventory + t.integer :available_inventory + + t.timestamps + end + end +end diff --git a/db/migrate/20201202033556_create_customers.rb b/db/migrate/20201202033556_create_customers.rb new file mode 100644 index 000000000..06c6c5788 --- /dev/null +++ b/db/migrate/20201202033556_create_customers.rb @@ -0,0 +1,16 @@ +class CreateCustomers < ActiveRecord::Migration[6.0] + def change + create_table :customers do |t| + t.string :name + t.datetime :registered_at + t.string :address + t.string :city + t.string :state + t.string :postal_code + t.string :phone + t.integer :videos_checked_out_count + + t.timestamps + end + end +end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb new file mode 100644 index 000000000..30d5c5309 --- /dev/null +++ b/test/models/customer_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Customer do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/models/video_test.rb b/test/models/video_test.rb new file mode 100644 index 000000000..eead50d2f --- /dev/null +++ b/test/models/video_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Video do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From f4cd8196500c06862a83c2113db00962b2b9c7bb Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Tue, 1 Dec 2020 19:39:27 -0800 Subject: [PATCH 04/48] Migrated new models --- db/schema.rb | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 db/schema.rb diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..0beaeb7f6 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,41 @@ +# 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. +# +# This file is the source Rails uses to define your schema when running `rails +# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2020_12_02_033556) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "customers", force: :cascade do |t| + t.string "name" + t.datetime "registered_at" + t.string "address" + t.string "city" + t.string "state" + t.string "postal_code" + t.string "phone" + t.integer "videos_checked_out_count" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + + create_table "videos", force: :cascade do |t| + t.string "title" + t.string "overview" + t.date "release_date" + t.integer "total_inventory" + t.integer "available_inventory" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + +end From 7cf7acd6f9c3dceac857490243d2b0a0e239cc1a Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 10:22:21 -0600 Subject: [PATCH 05/48] routes for customer index and controller action, 2 tests are passed --- app/controllers/customers_controller.rb | 3 ++- config/routes.rb | 2 ++ node_modules/.yarn-integrity | 6 ++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index ecd1ca570..2bb74d9a6 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,7 +1,8 @@ class CustomersController < ApplicationController def index - + customers = Customer.all.as_json(only: [:id, :name, :phone, :postal_code, :registered_at, :videos_checked_out_count]) + render json: customers, status: :ok end def show diff --git a/config/routes.rb b/config/routes.rb index c06383a17..2171bfa64 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,5 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + + resources :customers, only: [:index] end diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity index 19c018ab8..833cabeb5 100644 --- a/node_modules/.yarn-integrity +++ b/node_modules/.yarn-integrity @@ -1,6 +1,8 @@ { - "systemParams": "darwin-x64-88", - "modulesFolders": [], + "systemParams": "darwin-x64-83", + "modulesFolders": [ + "node_modules" + ], "flags": [], "linkedModules": [], "topLevelPatterns": [], From d40a1458d3cdfd48d9374ef6991c43f23720770c Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 10:42:25 -0600 Subject: [PATCH 06/48] added validations and writing tests --- app/models/customer.rb | 6 ++++++ test/models/customer_test.rb | 23 ++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/models/customer.rb b/app/models/customer.rb index 0b5277335..b3292be14 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,2 +1,8 @@ class Customer < ApplicationRecord + # unique name? + # name must be present? + # what else do we need to be present? + # videos_checked_out_count must be positive number + validates :name, presence: true + validates :videos_checked_out_count, numericality: { greater_than: 0 } end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 30d5c5309..729afb8d0 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,7 +1,24 @@ require "test_helper" describe Customer do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + before do + @customer = customers(:customer_one) + end + + it "can be instiantiated when the fields are present" do + expect(@customer.valid?).must_equal true + end + + it "responds to the fields" do + fields = [:name, :registered_at, :postal_code, :videos_checked_out_count] + + fields.each do |field| + expect(@customer).must_respond_to field + end + end + + describe "validations" do + + + end end From a3ec4df03e9dbfb1f651d047790f3b3a9b93f8d4 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 10:48:44 -0600 Subject: [PATCH 07/48] added validation tests for customers --- test/models/customer_test.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 729afb8d0..cecb7c883 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,6 +1,7 @@ require "test_helper" describe Customer do + before do @customer = customers(:customer_one) end @@ -19,6 +20,28 @@ describe "validations" do + it "must have a name" do + @customer.name = nil + expect(@customer.valid?).must_equal false + expect(@customer.errors.messages).must_include :name + expect(@customer.errors.messages[:name]).must_equal ["can't be blank"] + end + + it "must have videos checked out count greater than 0" do + @customer.videos_checked_out_count = -5 + + expect(@customer.valid?).must_equal false + expect(@customer.errors.messages).must_include :videos_checked_out_count + expect(@customer.errors.messages[:videos_checked_out_count]).must_equal ["must be greater than 0"] + end + + end + + describe "relations" do + + end + describe "custom methods" do + end end From 6ebee0e9c3668201cf12324f6ecf85f26d5a0458 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 10:52:24 -0600 Subject: [PATCH 08/48] added videos routes --- app/models/customer.rb | 4 +--- config/routes.rb | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/models/customer.rb b/app/models/customer.rb index b3292be14..4a233604c 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,8 +1,6 @@ class Customer < ApplicationRecord + # unique name? - # name must be present? - # what else do we need to be present? - # videos_checked_out_count must be positive number validates :name, presence: true validates :videos_checked_out_count, numericality: { greater_than: 0 } end diff --git a/config/routes.rb b/config/routes.rb index 2171bfa64..be59068da 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,4 +2,5 @@ # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html resources :customers, only: [:index] + resources :videos, only: [:index, :show, :create] end From cdcbaf0188653c7e116270b5fb7ea297196f1f3d Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 12:53:55 -0600 Subject: [PATCH 09/48] passsed the tests for video create --- app/controllers/videos_controller.rb | 21 +++++++++++++++++++ test/controllers/videos_controller_test.rb | 24 +++++++++++++--------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index bf3b98047..f0358555e 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -8,4 +8,25 @@ def show end + def create + video = Video.new(video_params) + + if video.save + render json: video.as_json(only: [:id]), status: :created + return + else + render json: { + ok: false, + errors: video.errors.messages + }, status: :bad_request + return + end + end + + private + + def video_params + return params.require(:video).permit(:title, :overview, :release_date, :total_inventory, :available_inventory) + end + end diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index c1d9564b5..1f77026df 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -74,11 +74,13 @@ it "can create a valid video" do # Arrange video_hash = { - title: "Alf the movie", - overview: "The most early 90s movie of all time", - release_date: "December 16th 2025", - total_inventory: 6, - available_inventory: 6 + video: { + title: "Alf the movie", + overview: "The most early 90s movie of all time", + release_date: "December 16th 2025", + total_inventory: 6, + available_inventory: 6 + } } # Assert @@ -92,11 +94,13 @@ it "will respond with bad request and errors for an invalid movie" do # Arrange video_hash = { - title: "Alf the movie", - overview: "The most early 90s movie of all time", - release_date: "December 16th 2025", - total_inventory: 6, - available_inventory: 6 + video: { + title: "Alf the movie", + overview: "The most early 90s movie of all time", + release_date: "December 16th 2025", + total_inventory: 6, + available_inventory: 6 + } } video_hash[:title] = nil From 6582b013b7df1721d406f8e1e74466b1882f6e31 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Wed, 2 Dec 2020 14:50:56 -0800 Subject: [PATCH 10/48] Video index action written, index action tests passing. --- app/controllers/videos_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index f0358555e..739a22351 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -1,7 +1,8 @@ class VideosController < ApplicationController def index - + videos = Video.all.as_json(only: [:id, :title, :phone, :release_date, :available_inventory]) + render json: videos, status: :ok end def show From 28ead27fda8270d91dead8b7784e6b0c9ae43546 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Wed, 2 Dec 2020 15:43:39 -0800 Subject: [PATCH 11/48] Video validations and validation tests passing. --- app/controllers/videos_controller.rb | 2 +- app/models/video.rb | 4 ++ test/models/video_test.rb | 72 ++++++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 739a22351..8b46b9d7e 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -1,7 +1,7 @@ class VideosController < ApplicationController def index - videos = Video.all.as_json(only: [:id, :title, :phone, :release_date, :available_inventory]) + videos = Video.all.as_json(only: [:id, :title, :release_date, :available_inventory]) render json: videos, status: :ok end diff --git a/app/models/video.rb b/app/models/video.rb index dc572b44b..232027de9 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -1,2 +1,6 @@ class Video < ApplicationRecord + + validates :title, presence: true, uniqueness: true + validates :release_date, presence: true + validates :available_inventory, presence: true, numericality: { greater_than: 0 } end diff --git a/test/models/video_test.rb b/test/models/video_test.rb index eead50d2f..cacf45f7d 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -1,7 +1,73 @@ require "test_helper" describe Video do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + + describe "validations" do + + it "video must have a title" do + # Arrange + video = Video.first + video.title = nil + # Assert + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :title + expect(video.errors.messages[:title]).must_equal ["can't be blank"] + end + + it "video title must be unique" do + #Arrange + video_1 = Video.find_by(title: 'Wonder Woman 2') + video_2 = Video.find_by(title: 'Black Widow') + video_2.title = video_1.title + video_2.save + #Assert + expect(video_2.valid?).must_equal false + expect(video_2.errors.messages).must_include :title + expect(video_2.errors.messages[:title]).must_equal ["has already been taken"] + end + + it "video must have a release date" do + #Arrange + video = Video.first + video.release_date = nil + #Assert + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :release_date + expect(video.errors.messages[:release_date]).must_equal ["can't be blank"] + end + + it "video must have an available inventory" do + video = Video.last + video.available_inventory = nil + video.save + + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :available_inventory + expect(video.errors.messages[:available_inventory]).must_include "can't be blank" + end + + it "video's available inventory must be a number" do + video = Video.last + video.available_inventory = 'five' + video.save + + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :available_inventory + expect(video.errors.messages[:available_inventory]).must_include "is not a number" + end + + it "video's available inventory must be a number" do + video = Video.last + video.available_inventory = 0 + video.save + + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :available_inventory + expect(video.errors.messages[:available_inventory]).must_include "must be greater than 0" + end + + end + + + end From b373266f48ff88bc8758df5dd70d49b00a5c0473 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Wed, 2 Dec 2020 16:22:57 -0800 Subject: [PATCH 12/48] Video show action added, 2 tests failing. --- app/controllers/videos_controller.rb | 18 ++++++++++++++++-- config/application.rb | 4 ++++ test/controllers/videos_controller_test.rb | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 8b46b9d7e..0880981e1 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -1,12 +1,26 @@ class VideosController < ApplicationController def index - videos = Video.all.as_json(only: [:id, :title, :release_date, :available_inventory]) - render json: videos, status: :ok + videos = Video.all.order(:title) + + render json: videos.as_json(only: [:id, :title, :release_date, :available_inventory]), + status: :ok end def show + video = Video.find_by(id: params[:id]) + + if video.nil? + render json: { + ok: false, + errors: 'Not found', + status: :not_found + } + return + end + render json: video.as_json(only: [:available_inventory, :overview, :release_date, :title, :total_inventory]), + status: :ok end def create diff --git a/config/application.rb b/config/application.rb index 43301a817..bc77856a3 100644 --- a/config/application.rb +++ b/config/application.rb @@ -15,6 +15,9 @@ # require "sprockets/railtie" require "rails/test_unit/railtie" +require 'active_support/core_ext/integer/inflections' + + # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) @@ -38,4 +41,5 @@ class Application < Rails::Application # Skip views, helpers and assets when generating a new resource. config.api_only = true end + end diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index 1f77026df..9fced0bfd 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -50,7 +50,7 @@ fields = ["title", "overview", "release_date", "total_inventory", "available_inventory"].sort expect(body.keys.sort).must_equal fields expect(body["title"]).must_equal "Wonder Woman 2" - expect(body["release_date"]).must_equal "December 25th 2020" + expect(body["release_date"]).must_equal "2020-12-25" expect(body["available_inventory"]).must_equal 100 expect(body["overview"]).must_equal "Wonder Woman squares off against Maxwell Lord and the Cheetah, a villainess who possesses superhuman strength and agility." expect(body["total_inventory"]).must_equal 100 From c0e58c084894fae62e555f50fc338708e9f6dbc7 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 18:45:59 -0600 Subject: [PATCH 13/48] added more validation tests for customers --- app/models/customer.rb | 3 +++ test/controllers/videos_controller_test.rb | 2 +- test/models/customer_test.rb | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/models/customer.rb b/app/models/customer.rb index 4a233604c..a3924f992 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -2,5 +2,8 @@ class Customer < ApplicationRecord # unique name? validates :name, presence: true + validates :registered_at, presence: true + validates :postal_code, presence: true + validates :phone, presence: true validates :videos_checked_out_count, numericality: { greater_than: 0 } end diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index 9fced0bfd..1b82be77a 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -103,7 +103,7 @@ } } - video_hash[:title] = nil + video_hash[:video][:title] = nil # Assert expect { diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index cecb7c883..06220b16c 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -26,6 +26,21 @@ expect(@customer.errors.messages).must_include :name expect(@customer.errors.messages[:name]).must_equal ["can't be blank"] end + + it "must have a phone" do + @customer.phone = nil + expect(@customer.valid?).must_equal false + expect(@customer.errors.messages).must_include :phone + expect(@customer.errors.messages[:phone]).must_equal ["can't be blank"] + end + + it "must have a registered_at" do + @customer.registered_at = nil + expect(@customer.valid?).must_equal false + expect(@customer.errors.messages).must_include :registered_at + expect(@customer.errors.messages[:registered_at]).must_equal ["can't be blank"] + + end it "must have videos checked out count greater than 0" do @customer.videos_checked_out_count = -5 From c12286f40eccdfada6f6950451c8644b8a9867d3 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 19:39:03 -0600 Subject: [PATCH 14/48] fixed the video show test --- app/controllers/videos_controller.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 0880981e1..d4b6684dc 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -13,9 +13,8 @@ def show if video.nil? render json: { ok: false, - errors: 'Not found', - status: :not_found - } + errors: 'Not Found' + }, status: :not_found return end From 6739098fc483039b6008be492e547c3f040a83cc Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 19:55:24 -0600 Subject: [PATCH 15/48] created rental model and migrations --- app/models/rental.rb | 2 ++ db/migrate/20201203015145_create_rentals.rb | 9 +++++++++ db/migrate/20201203015310_relate_rentalsto_videos.rb | 5 +++++ db/migrate/20201203015441_relate_rentals_to_customers.rb | 5 +++++ test/models/rental_test.rb | 7 +++++++ 5 files changed, 28 insertions(+) create mode 100644 app/models/rental.rb create mode 100644 db/migrate/20201203015145_create_rentals.rb create mode 100644 db/migrate/20201203015310_relate_rentalsto_videos.rb create mode 100644 db/migrate/20201203015441_relate_rentals_to_customers.rb create mode 100644 test/models/rental_test.rb diff --git a/app/models/rental.rb b/app/models/rental.rb new file mode 100644 index 000000000..79e3a65ca --- /dev/null +++ b/app/models/rental.rb @@ -0,0 +1,2 @@ +class Rental < ApplicationRecord +end diff --git a/db/migrate/20201203015145_create_rentals.rb b/db/migrate/20201203015145_create_rentals.rb new file mode 100644 index 000000000..98aa3c29c --- /dev/null +++ b/db/migrate/20201203015145_create_rentals.rb @@ -0,0 +1,9 @@ +class CreateRentals < ActiveRecord::Migration[6.0] + def change + create_table :rentals do |t| + t.date :due_date + + t.timestamps + end + end +end diff --git a/db/migrate/20201203015310_relate_rentalsto_videos.rb b/db/migrate/20201203015310_relate_rentalsto_videos.rb new file mode 100644 index 000000000..26b179ad3 --- /dev/null +++ b/db/migrate/20201203015310_relate_rentalsto_videos.rb @@ -0,0 +1,5 @@ +class RelateRentalstoVideos < ActiveRecord::Migration[6.0] + def change + add_reference :rentals, :video, index: true + end +end diff --git a/db/migrate/20201203015441_relate_rentals_to_customers.rb b/db/migrate/20201203015441_relate_rentals_to_customers.rb new file mode 100644 index 000000000..2af652c79 --- /dev/null +++ b/db/migrate/20201203015441_relate_rentals_to_customers.rb @@ -0,0 +1,5 @@ +class RelateRentalsToCustomers < ActiveRecord::Migration[6.0] + def change + add_reference :rentals, :customer, index: true + end +end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb new file mode 100644 index 000000000..3e64959b4 --- /dev/null +++ b/test/models/rental_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Rental do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 130ef4e0b8eb3c9017466be0f70a4b08198157a6 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 19:56:13 -0600 Subject: [PATCH 16/48] alter the schema --- db/schema.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 0beaeb7f6..bee7dc4b8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_12_02_033556) do +ActiveRecord::Schema.define(version: 2020_12_03_015441) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -28,6 +28,16 @@ t.datetime "updated_at", precision: 6, null: false end + create_table "rentals", force: :cascade do |t| + t.date "due_date" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.bigint "video_id" + t.bigint "customer_id" + t.index ["customer_id"], name: "index_rentals_on_customer_id" + t.index ["video_id"], name: "index_rentals_on_video_id" + end + create_table "videos", force: :cascade do |t| t.string "title" t.string "overview" From baa955c9ce4b90bbd1c45fdb9a5b30640cd4de9c Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 20:00:42 -0600 Subject: [PATCH 17/48] added the relations to the models --- app/models/customer.rb | 3 +++ app/models/rental.rb | 2 ++ app/models/video.rb | 2 ++ 3 files changed, 7 insertions(+) diff --git a/app/models/customer.rb b/app/models/customer.rb index a3924f992..b9719fda0 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,5 +1,8 @@ class Customer < ApplicationRecord + has_many :rentals + has_many :videos, through: :rentals + # unique name? validates :name, presence: true validates :registered_at, presence: true diff --git a/app/models/rental.rb b/app/models/rental.rb index 79e3a65ca..0449e1916 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,2 +1,4 @@ class Rental < ApplicationRecord + belongs_to :customer + belongs_to :video end diff --git a/app/models/video.rb b/app/models/video.rb index 232027de9..74414f0e0 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -1,4 +1,6 @@ class Video < ApplicationRecord + has_many :rentals + has_many :customers, through: :rentals validates :title, presence: true, uniqueness: true validates :release_date, presence: true From 8c2944f8f086ea9d69b3c3cad08e6878de3118b8 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 20:12:25 -0600 Subject: [PATCH 18/48] added custom routes to rentals --- app/controllers/rentals_controller.rb | 9 +++++++++ config/routes.rb | 3 +++ test/controllers/rentals_controller_test.rb | 7 +++++++ 3 files changed, 19 insertions(+) create mode 100644 app/controllers/rentals_controller.rb create mode 100644 test/controllers/rentals_controller_test.rb diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb new file mode 100644 index 000000000..1ed8be912 --- /dev/null +++ b/app/controllers/rentals_controller.rb @@ -0,0 +1,9 @@ +class RentalsController < ApplicationController + def check_out + + end + + def check_in + + end +end diff --git a/config/routes.rb b/config/routes.rb index be59068da..f122ab449 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,4 +3,7 @@ resources :customers, only: [:index] resources :videos, only: [:index, :show, :create] + + post '/rentals/check-out', to: 'rentals#check_out', as: "check_out" + post '/rentals/check-in', to: 'rentals#check_in', as: "check_in" end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb new file mode 100644 index 000000000..dc043d4df --- /dev/null +++ b/test/controllers/rentals_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe RentalsController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 85874a40ba6edd6018e46577c8fab37bbdbddf6b Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 20:30:40 -0600 Subject: [PATCH 19/48] tried to write check-out action --- app/controllers/rentals_controller.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 1ed8be912..949bdab42 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,9 +1,22 @@ class RentalsController < ApplicationController def check_out + rental = Rental.new(video: @video, customer: @customer ,due_date: Time.now + 7 ) end def check_in end + + private + + def find_customer + @customer = Customer.find_by(id: params[:id]) + end + + def find_video + @video = Video.find_by(id: params[:id]) + end + + end From be7daa47d38618aa3dc72839c89553acd3fb2e15 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 20:49:53 -0600 Subject: [PATCH 20/48] created .yml for rentals --- test/fixtures/rentals.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/fixtures/rentals.yml diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml new file mode 100644 index 000000000..b3af848e2 --- /dev/null +++ b/test/fixtures/rentals.yml @@ -0,0 +1,12 @@ +rental_one: + customer: customer_one + video: wonder_woman + due_date: "December 9th 2020" +rental_two: + customer: customer_one + video: black_widow + due_date: "December 9th 2020" +rental_three: + customer: customer_two + video: black_widow + due_date: "December 10th 2020" \ No newline at end of file From cd4a6aed5c372dbe09ada5e959bc69b25996209d Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 20:55:46 -0600 Subject: [PATCH 21/48] added instianting tests to Video model --- test/models/video_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index cacf45f7d..f37c17994 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -2,6 +2,18 @@ describe Video do + it "can be instianted with the fields" do + video = Video.first + expect(video.valid?).must_equal true + end + + it "responds to the fields" do + video = Video.first + [:title, :release_date, :available_inventory].each do |field| + expect(video).must_respond_to field + end + end + describe "validations" do it "video must have a title" do From abc6d86e2296bb8222fa70e8faefd658f7c9d3ed Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 21:08:00 -0600 Subject: [PATCH 22/48] wrote relation tests for video model --- test/fixtures/videos.yml | 6 ++++++ test/models/video_test.rb | 31 ++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/test/fixtures/videos.yml b/test/fixtures/videos.yml index cef2102b7..bb7dd4327 100644 --- a/test/fixtures/videos.yml +++ b/test/fixtures/videos.yml @@ -10,3 +10,9 @@ black_widow: available_inventory: 6 overview: At birth the Black Widow (aka Natasha Romanova) is given to the KGB, which grooms her to become its ultimate operative. When the U.S.S.R. breaks up, the government tries to kill her as the action moves to present-day New York, where she is a freelance operative. total_inventory: 7 +inception: + title: Inception + release_date: "May 7th 2011" + available_inventory: 4 + overview: A group of dream spies go into their target's mind to extract valuable memories. + total_inventory: 4 diff --git a/test/models/video_test.rb b/test/models/video_test.rb index f37c17994..96e064100 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -77,9 +77,38 @@ expect(video.errors.messages).must_include :available_inventory expect(video.errors.messages[:available_inventory]).must_include "must be greater than 0" end - end + describe "relations" do + before do + @video_1 = videos(:inception) + @video_2 = videos(:black_widow) + end + + describe "rentals" do + it "can have many rentals" do + @video_2.rentals.each do |rental| + expect(rental).must_be_instance_of Rental + end + + expect(@video_2.rentals.count).must_equal 2 + end + it "can have zero rental" do + expect(@video_1.rentals.count).must_equal 0 + end + end + + describe "customers" do + it "can have many customers through rentals" do + @video_2.customers.each do |customer| + expect(customer).must_be_instance_of Customer + end + end + it "can have zero customers" do + expect(@video_1.customers.count).must_equal 0 + end + end + end end From f373f9dcbe5e14e23c45c2ea2be3303a18202db0 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Wed, 2 Dec 2020 19:25:46 -0800 Subject: [PATCH 23/48] Added Customer relations tests --- test/models/customer_test.rb | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 06220b16c..fe17d685f 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -51,11 +51,30 @@ end end - - describe "relations" do - + + describe "relations" do + + it "has a list of rentals" do + customer = customers(:customer_one) + expect(customer).must_respond_to :rentals + + customer.rentals.each do |rental| + expect(rental).must_be_kind_of Rental + end + + expect(customer.rentals.count).must_equal 2 + end + + it "has many videos through rentals" do + customer = customers(:customer_one) + expect(customer).must_respond_to :videos + customer.videos.each do |video| + expect(video).must_be_kind_of Video + end + end end + describe "custom methods" do end From 50f8d18101e0704f96f2a82625e43f024e17d759 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 21:35:04 -0600 Subject: [PATCH 24/48] added relations tests to rental model --- test/models/rental_test.rb | 58 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 3e64959b4..4ecd6830a 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,7 +1,59 @@ require "test_helper" describe Rental do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe "validations" do + + end + + describe "relations" do + describe "videos" do + before do + @video = videos(:wonder_woman) + customer = customers(:customer_one) + @rental = Rental.new(customer: customer, + due_date: "2020-12-25") + end + + it "can set the video using Video" do + @rental.video = @video + expect(@rental.video_id).must_equal @video.id + end + + it "can set the video using video_id" do + @rental.video_id = @video.id + expect(@rental.video).must_equal @video + end + + it "has a video" do + rental = rentals(:rental_one) + expect(rental).must_respond_to :video + expect(rental.video).must_be_kind_of Video + end + + end + + describe "customers" do + before do + video = videos(:wonder_woman) + @customer = customers(:customer_one) + @rental = Rental.new(video: video, + due_date: "2020-12-25") + end + it "has a customer" do + rental = rentals(:rental_one) + expect(rental).must_respond_to :customer + expect(rental.customer).must_be_kind_of Customer + end + + it "can set the customer using Customer" do + @rental.customer = @customer + expect(@rental.customer_id).must_equal @customer.id + end + + it "can set the customer using customer_id" do + @rental.customer_id = @customer.id + expect(@rental.customer).must_equal @customer + end + end + end end From 120c1a5d50f214f16bae3798982071912f50688c Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 21:38:49 -0600 Subject: [PATCH 25/48] added more expectations to video model tests --- test/models/video_test.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index 96e064100..4f50987ea 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -87,6 +87,8 @@ describe "rentals" do it "can have many rentals" do + expect(@video_2).must_respond_to :rentals + @video_2.rentals.each do |rental| expect(rental).must_be_instance_of Rental end @@ -101,6 +103,8 @@ describe "customers" do it "can have many customers through rentals" do + expect(@video_2).must_respond_to :customers + @video_2.customers.each do |customer| expect(customer).must_be_instance_of Customer end From 78241c960cc0f217fc72311ff9685918fa938e66 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Wed, 2 Dec 2020 22:28:07 -0600 Subject: [PATCH 26/48] revert the create video controller tests back --- app/controllers/videos_controller.rb | 2 +- test/controllers/videos_controller_test.rb | 26 +++++++++------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index d4b6684dc..75c6bfe1c 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -40,7 +40,7 @@ def create private def video_params - return params.require(:video).permit(:title, :overview, :release_date, :total_inventory, :available_inventory) + return params.permit(:title, :overview, :release_date, :total_inventory, :available_inventory) end end diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index 1b82be77a..e8fe8b984 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -74,13 +74,11 @@ it "can create a valid video" do # Arrange video_hash = { - video: { - title: "Alf the movie", - overview: "The most early 90s movie of all time", - release_date: "December 16th 2025", - total_inventory: 6, - available_inventory: 6 - } + title: "Alf the movie", + overview: "The most early 90s movie of all time", + release_date: "December 16th 2025", + total_inventory: 6, + available_inventory: 6 } # Assert @@ -94,16 +92,14 @@ it "will respond with bad request and errors for an invalid movie" do # Arrange video_hash = { - video: { - title: "Alf the movie", - overview: "The most early 90s movie of all time", - release_date: "December 16th 2025", - total_inventory: 6, - available_inventory: 6 - } + title: "Alf the movie", + overview: "The most early 90s movie of all time", + release_date: "December 16th 2025", + total_inventory: 6, + available_inventory: 6 } - video_hash[:video][:title] = nil + video_hash[:title] = nil # Assert expect { From d855d7162e62d90f7170994e020a1ea861a51c7c Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 10:52:36 -0600 Subject: [PATCH 27/48] worked on check_out controller logic and custom methods --- app/controllers/rentals_controller.rb | 14 +++++++++++++- app/models/rental.rb | 10 ++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 949bdab42..91f9a6924 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,6 +1,18 @@ class RentalsController < ApplicationController def check_out - rental = Rental.new(video: @video, customer: @customer ,due_date: Time.now + 7 ) + rental = Rental.new(video: @video, customer: @customer ,due_date: Time.now + 7.days ) + + if rental.save + # do something + rental.decrease_available_inventory + rental.increase_videos_checked_out + + render json: rental.as_json(only: [:id, :due_date]), status: :created + return + else # doesn't save, surface error messages + render json: {ok: false, errors: rental.errors.messages}, status: :bad_request + return + end end diff --git a/app/models/rental.rb b/app/models/rental.rb index 0449e1916..9a1ffa955 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,4 +1,14 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :video + + def decrease_available_inventory + self.video.available_inventory -= 1 + self.video.save! + end + + def increase_videos_checked_out + self.customer.videos_checked_out_count += 1 + self.customer.save! + end end From d56149aceeacc46539bb65d50cb2b307eff7eeb1 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 11:04:06 -0600 Subject: [PATCH 28/48] nominal tests for custom rental methods --- test/models/rental_test.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 4ecd6830a..39f4ea181 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -56,4 +56,38 @@ end end end + + describe "custom methods" do + describe "decrease available inventory" do + it "decreases the video's available inventory" do + rental = rentals(:rental_one) + start_inventory_count = rental.video.available_inventory + + rental.decrease_available_inventory + + found_rental = Rental.find_by(id: rental.id) + end_count = found_rental.video.available_inventory + expect(found_rental.video.available_inventory).must_equal start_inventory_count - 1 + expect(end_count).must_equal start_inventory_count - 1 + end + # TODO: negative or edge test case? + end + + describe "increase_videos_checked_out" do + it "increases the videos checked out count for the customer" do + rental = rentals(:rental_one) + start_inventory_count = rental.customer.videos_checked_out_count + + rental.increase_videos_checked_out + + found_rental = Rental.find_by(id: rental.id) + end_count = found_rental.customer.videos_checked_out_count + + expect(found_rental.customer.videos_checked_out_count).must_equal start_inventory_count + 1 + expect(end_count).must_equal start_inventory_count + 1 + end + end + + + end end From 91f8b90647fa44883589e52f6716a6aa069f8149 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 11:18:28 -0600 Subject: [PATCH 29/48] added controller tests to rental controller --- test/controllers/rentals_controller_test.rb | 46 +++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index dc043d4df..84bb21030 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,7 +1,47 @@ require "test_helper" describe RentalsController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + before do + @video = videos(:inception) + @customer = customers(:customer_one) + end + describe "check out" do + it "can create a valid rental when checking out" do + rental_hash = { + customer: @customer, + video: @video, + due_date: Time.now + 7.days + } + + expect { + post check_out_path, params: rental_hash + }.must_differ "Rental.count", 1 + + must_respond_with :created + end + + it "will respond with bad request and errors for invalid params" do + rental_hash = { + customer: @customer, + video: @video, + due_date: Time.now + 7.days + } + + rental_hash[:customer] = nil + + expect { + post check_out_path, params: rental_hash + }.wont_differ "Rental.count" + body = JSON.parse(response.body) + + expect(body.keys).must_include "errors" + expect(body["errors"].keys).must_include "customer" + must_respond_with :bad_request + + end + end + + describe "check in" do + + end end From 315351106c86e74f208ae1dd0ff72fc574259da0 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 10:23:51 -0800 Subject: [PATCH 30/48] Added rental validations tests --- app/controllers/rentals_controller.rb | 2 -- app/models/rental.rb | 2 ++ test/models/rental_test.rb | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 949bdab42..a89c3f435 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -17,6 +17,4 @@ def find_customer def find_video @video = Video.find_by(id: params[:id]) end - - end diff --git a/app/models/rental.rb b/app/models/rental.rb index 0449e1916..c3228547c 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,4 +1,6 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :video + + validates due_date, presence: true end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 4ecd6830a..c28f6c2be 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,8 +1,17 @@ require "test_helper" describe Rental do + describe "validations" do + it "has a due date" do + video = Video.first + video.due_date = nil + video.save + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :due_date + expect(video.errors.messages[:due_date]).must_equal ["can't be blank"] + end end describe "relations" do From 6c224910e26b6f8e4b7bc37cb46842a914458545 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 12:38:21 -0600 Subject: [PATCH 31/48] fixed the merge errors --- app/models/rental.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index 4ddc381df..d02385583 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -2,7 +2,8 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :video -<<<<<<< HEAD + validates :due_date, presence: true + def decrease_available_inventory self.video.available_inventory -= 1 self.video.save! @@ -12,7 +13,6 @@ def increase_videos_checked_out self.customer.videos_checked_out_count += 1 self.customer.save! end -======= - validates due_date, presence: true ->>>>>>> master + + end From 8c3dd79920e41c9c6672d3a36c6b458817eaa867 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 12:42:52 -0600 Subject: [PATCH 32/48] commented out a rental controller test --- test/controllers/rentals_controller_test.rb | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 84bb21030..6ec7db3ec 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -6,19 +6,19 @@ @customer = customers(:customer_one) end describe "check out" do - it "can create a valid rental when checking out" do - rental_hash = { - customer: @customer, - video: @video, - due_date: Time.now + 7.days - } - - expect { - post check_out_path, params: rental_hash - }.must_differ "Rental.count", 1 - - must_respond_with :created - end + # it "can create a valid rental when checking out" do + # rental_hash = { + # customer: @customer, + # video: @video, + # due_date: Time.now + 7.days + # } + # + # expect { + # post check_out_path, params: rental_hash + # }.must_differ "Rental.count", 1 + # + # must_respond_with :created + # end it "will respond with bad request and errors for invalid params" do rental_hash = { From d43bbb5754ccfb21ca4b99398db34e3e1ad0689e Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 10:49:31 -0800 Subject: [PATCH 33/48] merge conflict --- app/controllers/rentals_controller.rb | 15 ++++++++------- app/models/rental.rb | 1 - test/fixtures/rentals.yml | 6 +++--- test/models/rental_test.rb | 13 +++++++------ 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 603fce8be..a5ffa7644 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,5 +1,6 @@ class RentalsController < ApplicationController def check_out + rental = Rental.new(video: @video, customer: @customer ,due_date: Time.now + 7.days ) if rental.save @@ -22,11 +23,11 @@ def check_in private - def find_customer - @customer = Customer.find_by(id: params[:id]) - end - - def find_video - @video = Video.find_by(id: params[:id]) - end + # def find_customer + # @customer = Customer.find_by(id: params[:id]) + # end + # + # def find_video + # @video = Video.find_by(id: params[:id]) + # end end diff --git a/app/models/rental.rb b/app/models/rental.rb index d02385583..31ea9f7aa 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -14,5 +14,4 @@ def increase_videos_checked_out self.customer.save! end - end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index b3af848e2..646ea31c7 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -1,12 +1,12 @@ rental_one: customer: customer_one video: wonder_woman - due_date: "December 9th 2020" + due_date: 2020-12-25 rental_two: customer: customer_one video: black_widow - due_date: "December 9th 2020" + due_date: 2020-12-25 rental_three: customer: customer_two video: black_widow - due_date: "December 10th 2020" \ No newline at end of file + due_date: 2020-12-25 \ No newline at end of file diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 4f18a5430..f68244494 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -3,14 +3,15 @@ describe Rental do describe "validations" do + it "has a due date" do - video = Video.first - video.due_date = nil - video.save + rental = Rental.first + rental.due_date = nil + rental.save - expect(video.valid?).must_equal false - expect(video.errors.messages).must_include :due_date - expect(video.errors.messages[:due_date]).must_equal ["can't be blank"] + expect(rental.valid?).must_equal false + expect(rental.errors.messages).must_include :due_date + expect(rental.errors.messages[:due_date]).must_equal ["can't be blank"] end end From cae4292f3f3fef7ca589dbbb4cd7128da35a455d Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 11:31:15 -0800 Subject: [PATCH 34/48] Bug fixed in error output for smoke tests, wave_1 tests passing --- app/controllers/rentals_controller.rb | 14 +++++++------- app/controllers/videos_controller.rb | 6 +++--- app/models/video.rb | 5 +++++ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index a5ffa7644..e5642b9f4 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -23,11 +23,11 @@ def check_in private - # def find_customer - # @customer = Customer.find_by(id: params[:id]) - # end - # - # def find_video - # @video = Video.find_by(id: params[:id]) - # end + def find_customer + @customer = Customer.find_by(id: params[:id]) + end + + def find_video + @video = Video.find_by(id: params[:id]) + end end diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 75c6bfe1c..f297d730d 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -12,8 +12,8 @@ def show if video.nil? render json: { - ok: false, - errors: 'Not Found' + # ok: false, + errors: ['Not Found'] }, status: :not_found return end @@ -30,7 +30,7 @@ def create return else render json: { - ok: false, + # ok: false, errors: video.errors.messages }, status: :bad_request return diff --git a/app/models/video.rb b/app/models/video.rb index 74414f0e0..918c9d1ed 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -1,8 +1,13 @@ class Video < ApplicationRecord + has_many :rentals has_many :customers, through: :rentals validates :title, presence: true, uniqueness: true validates :release_date, presence: true validates :available_inventory, presence: true, numericality: { greater_than: 0 } + + validates :total_inventory, presence: true + validates :overview, presence: true + end From 95a57725f3dc9362b2f9cee42c51dda6ba93e31b Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 12:12:51 -0800 Subject: [PATCH 35/48] Partial Rental json output, added rental validations. --- app/controllers/rentals_controller.rb | 9 ++++++--- app/models/video.rb | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index e5642b9f4..4c4832b44 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,5 +1,8 @@ class RentalsController < ApplicationController + def check_out + find_customer + find_video rental = Rental.new(video: @video, customer: @customer ,due_date: Time.now + 7.days ) @@ -8,7 +11,7 @@ def check_out rental.decrease_available_inventory rental.increase_videos_checked_out - render json: rental.as_json(only: [:id, :due_date]), status: :created + render json: rental.as_json(only: [:id, :due_date, :customer_id, :video_id, rental.customer.videos_checked_out_count, rental.video.available_inventory]), status: :created return else # doesn't save, surface error messages render json: {ok: false, errors: rental.errors.messages}, status: :bad_request @@ -24,10 +27,10 @@ def check_in private def find_customer - @customer = Customer.find_by(id: params[:id]) + @customer = Customer.find_by(id: params[:customer_id]) end def find_video - @video = Video.find_by(id: params[:id]) + @video = Video.find_by(id: params[:video_id]) end end diff --git a/app/models/video.rb b/app/models/video.rb index 918c9d1ed..e8f0a85ac 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -5,9 +5,10 @@ class Video < ApplicationRecord validates :title, presence: true, uniqueness: true validates :release_date, presence: true - validates :available_inventory, presence: true, numericality: { greater_than: 0 } + validates :available_inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :total_inventory, presence: true + # , numericality: { greater_than: 0} validates :overview, presence: true end From 1d932e3b78fec069c3a6996fd189565afba0e6aa Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 12:55:01 -0800 Subject: [PATCH 36/48] Fixing broken video validation test. --- test/models/video_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index 4f50987ea..8163f94a5 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -68,14 +68,14 @@ expect(video.errors.messages[:available_inventory]).must_include "is not a number" end - it "video's available inventory must be a number" do + it "video's available inventory must be greater or equal to 0" do video = Video.last - video.available_inventory = 0 + video.available_inventory = -1 video.save expect(video.valid?).must_equal false expect(video.errors.messages).must_include :available_inventory - expect(video.errors.messages[:available_inventory]).must_include "must be greater than 0" + expect(video.errors.messages[:available_inventory]).must_include "must be greater than or equal to 0" end end From 38bc5c72dadb14c03c668c101205ab1c335de446 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 15:00:34 -0600 Subject: [PATCH 37/48] modified the rental controller --- app/controllers/rentals_controller.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 4c4832b44..1e1a2dd2f 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -11,7 +11,17 @@ def check_out rental.decrease_available_inventory rental.increase_videos_checked_out - render json: rental.as_json(only: [:id, :due_date, :customer_id, :video_id, rental.customer.videos_checked_out_count, rental.video.available_inventory]), status: :created + + # render json: rental.as_json(only: [:id, :due_date, :customer_id, :video_id, :available_inventory => @video.available_inventory,:videos_checked_out_count => @customer.videos_checked_out_count]), status: :created + + render json: { + # rental: rental.as_json(only: [:id, :due_date, :customer_id, :video_id]), + id: rental.id, + customer_id: @customer.id, + video_id: @video.id, + videos_checked_out_count: @customer.videos_checked_out_count, + available_inventory: @video.available_inventory + }, status: :created return else # doesn't save, surface error messages render json: {ok: false, errors: rental.errors.messages}, status: :bad_request From b3504210abfe2546ed68333644a82f011241e3f7 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 15:21:12 -0600 Subject: [PATCH 38/48] fixed check out action controller and tests --- app/controllers/rentals_controller.rb | 7 ++-- app/models/video.rb | 3 +- test/controllers/rentals_controller_test.rb | 36 ++++++++++----------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 1e1a2dd2f..9921a6b44 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,8 +1,9 @@ class RentalsController < ApplicationController + before_action :find_customer + before_action :find_video + def check_out - find_customer - find_video rental = Rental.new(video: @video, customer: @customer ,due_date: Time.now + 7.days ) @@ -21,7 +22,7 @@ def check_out video_id: @video.id, videos_checked_out_count: @customer.videos_checked_out_count, available_inventory: @video.available_inventory - }, status: :created + }, status: :ok return else # doesn't save, surface error messages render json: {ok: false, errors: rental.errors.messages}, status: :bad_request diff --git a/app/models/video.rb b/app/models/video.rb index e8f0a85ac..a8d911b16 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -7,8 +7,7 @@ class Video < ApplicationRecord validates :release_date, presence: true validates :available_inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } - validates :total_inventory, presence: true - # , numericality: { greater_than: 0} + validates :total_inventory, presence: true, numericality: { greater_than: 0} validates :overview, presence: true end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 6ec7db3ec..58d55e454 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -6,28 +6,26 @@ @customer = customers(:customer_one) end describe "check out" do - # it "can create a valid rental when checking out" do - # rental_hash = { - # customer: @customer, - # video: @video, - # due_date: Time.now + 7.days - # } - # - # expect { - # post check_out_path, params: rental_hash - # }.must_differ "Rental.count", 1 - # - # must_respond_with :created - # end - - it "will respond with bad request and errors for invalid params" do + it "can create a valid rental when checking out" do rental_hash = { - customer: @customer, - video: @video, - due_date: Time.now + 7.days + customer_id: @customer.id, + video_id: @video.id } - rental_hash[:customer] = nil + expect { + post check_out_path, params: rental_hash + }.must_differ "Rental.count", 1 + + must_respond_with :ok + end + + it "will respond with bad request and errors for invalid customer" do + rental_hash = { + customer_id: -1, + video_id: @video.id + } + + # rental_hash[:customer] = nil expect { post check_out_path, params: rental_hash From e70e487283f76c0f4ade1eb7cf6123cadd4ce785 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 15:29:03 -0600 Subject: [PATCH 39/48] fixed a smoke tests with result print out --- app/controllers/rentals_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 9921a6b44..75da2a096 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -17,9 +17,10 @@ def check_out render json: { # rental: rental.as_json(only: [:id, :due_date, :customer_id, :video_id]), - id: rental.id, + # id: rental.id, customer_id: @customer.id, video_id: @video.id, + due_date: rental.due_date, videos_checked_out_count: @customer.videos_checked_out_count, available_inventory: @video.available_inventory }, status: :ok From 78915ccd86cf10247b70b518c0133149b468d877 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 16:05:09 -0600 Subject: [PATCH 40/48] pair programming work with checkout --- app/controllers/rentals_controller.rb | 11 ++++++++--- app/models/customer.rb | 2 +- app/models/rental.rb | 1 + test/controllers/rentals_controller_test.rb | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 75da2a096..51cc96c47 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -26,10 +26,15 @@ def check_out }, status: :ok return else # doesn't save, surface error messages - render json: {ok: false, errors: rental.errors.messages}, status: :bad_request - return + if @customer.nil? + render json: { errors: ['Not Found'] }, status: :not_found + elsif @video.nil? + render json: { errors: ['Not Found'] }, status: :not_found + else + render json: { errors: rental.errors.messages}, status: :not_found + return + end end - end def check_in diff --git a/app/models/customer.rb b/app/models/customer.rb index b9719fda0..d035c3f59 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -8,5 +8,5 @@ class Customer < ApplicationRecord validates :registered_at, presence: true validates :postal_code, presence: true validates :phone, presence: true - validates :videos_checked_out_count, numericality: { greater_than: 0 } + validates :videos_checked_out_count, numericality: { greater_than_or_equal_to: 0 } end diff --git a/app/models/rental.rb b/app/models/rental.rb index 31ea9f7aa..f16b09b2b 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -3,6 +3,7 @@ class Rental < ApplicationRecord belongs_to :video validates :due_date, presence: true + # validates :customer, presence: true def decrease_available_inventory self.video.available_inventory -= 1 diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 58d55e454..a85b9485e 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -34,7 +34,7 @@ expect(body.keys).must_include "errors" expect(body["errors"].keys).must_include "customer" - must_respond_with :bad_request + must_respond_with :not_found end end From d80f803f4bd1793c0df9fca5e0bcfcae34181c58 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 18:46:14 -0600 Subject: [PATCH 41/48] fixed the failing tests and DRY up rental controller tests for checkout --- app/controllers/rentals_controller.rb | 2 ++ test/controllers/rentals_controller_test.rb | 35 ++++++++++++++------- test/models/customer_test.rb | 2 +- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 51cc96c47..5e2d299c3 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -28,8 +28,10 @@ def check_out else # doesn't save, surface error messages if @customer.nil? render json: { errors: ['Not Found'] }, status: :not_found + return elsif @video.nil? render json: { errors: ['Not Found'] }, status: :not_found + return else render json: { errors: rental.errors.messages}, status: :not_found return diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index a85b9485e..4dc24c943 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -5,37 +5,48 @@ @video = videos(:inception) @customer = customers(:customer_one) end + describe "check out" do - it "can create a valid rental when checking out" do - rental_hash = { + + before do + @rental_hash = { customer_id: @customer.id, video_id: @video.id } + end + it "can create a valid rental when checking out" do expect { - post check_out_path, params: rental_hash + post check_out_path, params: @rental_hash }.must_differ "Rental.count", 1 must_respond_with :ok end - it "will respond with bad request and errors for invalid customer" do - rental_hash = { - customer_id: -1, - video_id: @video.id - } - - # rental_hash[:customer] = nil + it "will respond with not_found and errors for invalid customer" do + @rental_hash[:customer_id] = -1 expect { - post check_out_path, params: rental_hash + post check_out_path, params: @rental_hash }.wont_differ "Rental.count" body = JSON.parse(response.body) expect(body.keys).must_include "errors" - expect(body["errors"].keys).must_include "customer" + expect(body["errors"]).must_include "Not Found" must_respond_with :not_found + end + + it "will respond with not_found and errors for invalid video" do + @rental_hash[:video_id] = -1 + + expect { + post check_out_path, params: @rental_hash + }.wont_differ "Rental.count" + body = JSON.parse(response.body) + expect(body.keys).must_include "errors" + expect(body["errors"]).must_include "Not Found" + must_respond_with :not_found end end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index fe17d685f..0e3e5cf7a 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -47,7 +47,7 @@ expect(@customer.valid?).must_equal false expect(@customer.errors.messages).must_include :videos_checked_out_count - expect(@customer.errors.messages[:videos_checked_out_count]).must_equal ["must be greater than 0"] + expect(@customer.errors.messages[:videos_checked_out_count]).must_equal ["must be greater than or equal to 0"] end end From f727410908a3e1ef8f4cc246bd36bf661da2c230 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 19:31:41 -0600 Subject: [PATCH 42/48] wrote last edge case test --- app/controllers/rentals_controller.rb | 34 +++++++++------------ test/controllers/rentals_controller_test.rb | 21 +++++++++++++ 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 5e2d299c3..4c0622d76 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -4,20 +4,23 @@ class RentalsController < ApplicationController before_action :find_video def check_out - rental = Rental.new(video: @video, customer: @customer ,due_date: Time.now + 7.days ) - if rental.save - # do something - rental.decrease_available_inventory - rental.increase_videos_checked_out + if !@video.nil? && @video.available_inventory == 0 + render json: { + errors: "No available copies for this title" + }, status: :bad_request + return + end + if rental.save + # rental.decrease_available_inventory + # rental.increase_videos_checked_out - # render json: rental.as_json(only: [:id, :due_date, :customer_id, :video_id, :available_inventory => @video.available_inventory,:videos_checked_out_count => @customer.videos_checked_out_count]), status: :created + rental.video.decrement!(:available_inventory) + rental.customer.increment!(:videos_checked_out_count) render json: { - # rental: rental.as_json(only: [:id, :due_date, :customer_id, :video_id]), - # id: rental.id, customer_id: @customer.id, video_id: @video.id, due_date: rental.due_date, @@ -25,18 +28,11 @@ def check_out available_inventory: @video.available_inventory }, status: :ok return - else # doesn't save, surface error messages - if @customer.nil? - render json: { errors: ['Not Found'] }, status: :not_found - return - elsif @video.nil? - render json: { errors: ['Not Found'] }, status: :not_found - return - else - render json: { errors: rental.errors.messages}, status: :not_found - return - end + else + render json: { errors: ['Not Found'] }, status: :not_found + return end + end def check_in diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 4dc24c943..de92fee12 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -48,6 +48,27 @@ expect(body["errors"]).must_include "Not Found" must_respond_with :not_found end + + it "return bad request if video does not have available inventory" do + video = videos(:inception) + video.available_inventory = 0 + video.save! + + rental_hash = { + customer_id: @customer.id, + video_id: video.id + } + + expect { + post check_out_path, params: rental_hash + }.wont_differ "Rental.count" + body = JSON.parse(response.body) + + expect(body.keys).must_include "errors" + expect(body["errors"]).must_include "No available copies for this title" + must_respond_with :bad_request + + end end describe "check in" do From 4bd4d1b6de91c68a9d7014ad4a4955aa4e07f7dd Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Thu, 3 Dec 2020 20:09:51 -0600 Subject: [PATCH 43/48] added video validation tests --- test/models/video_test.rb | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index 8163f94a5..8cfde0a05 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -77,6 +77,35 @@ expect(video.errors.messages).must_include :available_inventory expect(video.errors.messages[:available_inventory]).must_include "must be greater than or equal to 0" end + + it "must have an overview" do + video = Video.first + video.overview = nil + + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :overview + expect(video.errors.messages[:overview]).must_include "can't be blank" + + end + + it "must have a total inventory" do + video = Video.first + video.total_inventory = nil + + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :total_inventory + expect(video.errors.messages[:total_inventory]).must_include "can't be blank" + + end + + it "must have a total inventory of more than 0 " do + video = Video.first + video.total_inventory = 0 + + expect(video.valid?).must_equal false + expect(video.errors.messages).must_include :total_inventory + expect(video.errors.messages[:total_inventory]).must_include "must be greater than 0" + end end describe "relations" do From 69f60f6921b9fe3ee294f8543987b1d6e96cccd1 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 18:24:34 -0800 Subject: [PATCH 44/48] Added check in date column to Rentals table --- app/controllers/rentals_controller.rb | 1 + db/migrate/20201204022117_add_check_in_to_rental.rb | 5 +++++ db/schema.rb | 3 ++- test/controllers/rentals_controller_test.rb | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20201204022117_add_check_in_to_rental.rb diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 4c0622d76..661b85ba0 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -37,6 +37,7 @@ def check_out def check_in + rental = Rental.where(video: @video, customer: @customer) end private diff --git a/db/migrate/20201204022117_add_check_in_to_rental.rb b/db/migrate/20201204022117_add_check_in_to_rental.rb new file mode 100644 index 000000000..5646ac33a --- /dev/null +++ b/db/migrate/20201204022117_add_check_in_to_rental.rb @@ -0,0 +1,5 @@ +class AddCheckInToRental < ActiveRecord::Migration[6.0] + def change + add_column :rentals, :check_in_date, :date + end +end diff --git a/db/schema.rb b/db/schema.rb index bee7dc4b8..f2b92c5f3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_12_03_015441) do +ActiveRecord::Schema.define(version: 2020_12_04_022117) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -34,6 +34,7 @@ t.datetime "updated_at", precision: 6, null: false t.bigint "video_id" t.bigint "customer_id" + t.date "check_in_date" t.index ["customer_id"], name: "index_rentals_on_customer_id" t.index ["video_id"], name: "index_rentals_on_video_id" end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index de92fee12..fb27d6687 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -63,7 +63,7 @@ post check_out_path, params: rental_hash }.wont_differ "Rental.count" body = JSON.parse(response.body) - + p body expect(body.keys).must_include "errors" expect(body["errors"]).must_include "No available copies for this title" must_respond_with :bad_request From d2622df639ee9ea92b2108df17645ee5756da3f9 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 21:22:11 -0800 Subject: [PATCH 45/48] Index order added, debugging attempts, check-in test written - not passing --- app/controllers/customers_controller.rb | 2 +- app/controllers/rentals_controller.rb | 22 +++++++- app/controllers/videos_controller.rb | 2 +- test/controllers/rentals_controller_test.rb | 58 +++++++++++++++++++++ 4 files changed, 81 insertions(+), 3 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 2bb74d9a6..92ed9d687 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,7 +1,7 @@ class CustomersController < ApplicationController def index - customers = Customer.all.as_json(only: [:id, :name, :phone, :postal_code, :registered_at, :videos_checked_out_count]) + customers = Customer.all.as_json(only: [:id, :name, :phone, :postal_code, :registered_at, :videos_checked_out_count]).order(:id) render json: customers, status: :ok end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 661b85ba0..dba3ae972 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -37,7 +37,27 @@ def check_out def check_in - rental = Rental.where(video: @video, customer: @customer) + rental = Rental.find_by(video: @video, customer: @customer) + # , check_in_date: nil + + if rental + + + rental.check_in_date = Date.today + rental.video.increment!(:available_inventory) + rental.customer.decrement!(:videos_checked_out_count) + + render json: { + customer_id: @customer.id, + video_id: @video.id, + videos_checked_out_count: @customer.videos_checked_out_count, + available_inventory: @video.available_inventory + }, status: :ok + return + else + render json: { errors: ['Not Found'] }, status: :not_found + return + end end private diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index f297d730d..d927ea900 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -1,7 +1,7 @@ class VideosController < ApplicationController def index - videos = Video.all.order(:title) + videos = Video.all.order(:id) render json: videos.as_json(only: [:id, :title, :release_date, :available_inventory]), status: :ok diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index fb27d6687..83dfcfc1d 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -72,6 +72,64 @@ end describe "check in" do + before do + @rental_hash = { + customer_id: @customer.id, + video_id: @video.id + } + + post check_out_path, params: @rental_hash + end + + it "will respond with correct values for checked in rental" do + + p @customer.videos_checked_out_count + p @video.available_inventory + + post check_in_path, params: @rental_hash + + p @customer.videos_checked_out_count + p @video.available_inventory + + body = JSON.parse(response.body) + + p body + + fields = ["customer_id", "video_id", "videos_checked_out_count", "available_inventory"].sort + expect(body.keys.sort).must_equal fields + expect(body["customer_id"]).must_equal @customer.id + expect(body["video_id"]).must_equal @video.id + expect(body["videos_checked_out_count"]).must_equal @customer.videos_checked_out_count + expect(body["available_inventory"]).must_equal @video.available_inventory + + must_respond_with :ok + end + + it "will respond with not_found and errors for invalid customer" do + @rental_hash[:customer_id] = -1 + + expect { + post check_in_path, params: @rental_hash + }.wont_differ "Rental.count" + body = JSON.parse(response.body) + + expect(body.keys).must_include "errors" + expect(body["errors"]).must_include "Not Found" + must_respond_with :not_found + end + + it "will respond with not_found and errors for invalid video" do + @rental_hash[:video_id] = -1 + + expect { + post check_in_path, params: @rental_hash + }.wont_differ "Rental.count" + body = JSON.parse(response.body) + + expect(body.keys).must_include "errors" + expect(body["errors"]).must_include "Not Found" + must_respond_with :not_found + end end end From ab381fb16891e089a2a91873eb544cd7cac7d8aa Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Thu, 3 Dec 2020 21:42:18 -0800 Subject: [PATCH 46/48] Still debugging check-in tests. --- app/controllers/customers_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 92ed9d687..62d0d5abc 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,7 +1,7 @@ class CustomersController < ApplicationController def index - customers = Customer.all.as_json(only: [:id, :name, :phone, :postal_code, :registered_at, :videos_checked_out_count]).order(:id) + customers = Customer.all.order(:id).as_json(only: [:id, :name, :phone, :postal_code, :registered_at, :videos_checked_out_count]) render json: customers, status: :ok end From 772ab8c52dd6b4daa73683fb48a59a192508d6c8 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Fri, 4 Dec 2020 12:59:26 -0600 Subject: [PATCH 47/48] added tests to rental controller --- test/controllers/rentals_controller_test.rb | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 83dfcfc1d..eb06a56cc 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -15,11 +15,24 @@ } end - it "can create a valid rental when checking out" do + it "can create a valid rental when checking out and return the correct fields " do expect { post check_out_path, params: @rental_hash }.must_differ "Rental.count", 1 + body = JSON.parse(response.body) + rental = Rental.first + due_date = (rental.created_at + 7.days).strftime("%Y-%m-%d") + + + fields = ["customer_id", "video_id", "due_date", "videos_checked_out_count", "available_inventory"].sort + expect(body.keys.sort).must_equal fields + expect(body["customer_id"]).must_equal @customer.id + expect(body["video_id"]).must_equal @video.id + expect(body["due_date"]).must_equal due_date + expect(body["videos_checked_out_count"]).must_equal @customer.videos_checked_out_count + 1 + expect(body["available_inventory"]).must_equal @video.available_inventory - 1 + must_respond_with :ok end @@ -82,7 +95,6 @@ end it "will respond with correct values for checked in rental" do - p @customer.videos_checked_out_count p @video.available_inventory From 9bbb3ce94e9bad06b1c63da953baf6fa8f539039 Mon Sep 17 00:00:00 2001 From: Schanen Ryan Date: Fri, 4 Dec 2020 13:32:00 -0800 Subject: [PATCH 48/48] Finshed check-in tests, all wave_02 tests passing. --- app/controllers/rentals_controller.rb | 8 +++----- test/controllers/rentals_controller_test.rb | 11 ++++------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index dba3ae972..2f298cb00 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -37,12 +37,10 @@ def check_out def check_in - rental = Rental.find_by(video: @video, customer: @customer) - # , check_in_date: nil + rental = Rental.find_by(video: @video, customer: @customer, check_in_date: nil) if rental - rental.check_in_date = Date.today rental.video.increment!(:available_inventory) rental.customer.decrement!(:videos_checked_out_count) @@ -50,8 +48,8 @@ def check_in render json: { customer_id: @customer.id, video_id: @video.id, - videos_checked_out_count: @customer.videos_checked_out_count, - available_inventory: @video.available_inventory + videos_checked_out_count: rental.customer.videos_checked_out_count, + available_inventory: rental.video.available_inventory }, status: :ok return else diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 83dfcfc1d..ca8409f28 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -82,19 +82,16 @@ end it "will respond with correct values for checked in rental" do - - p @customer.videos_checked_out_count - p @video.available_inventory + @customer.reload + @video.reload post check_in_path, params: @rental_hash - p @customer.videos_checked_out_count - p @video.available_inventory + @customer.reload + @video.reload body = JSON.parse(response.body) - p body - fields = ["customer_id", "video_id", "videos_checked_out_count", "available_inventory"].sort expect(body.keys.sort).must_equal fields expect(body["customer_id"]).must_equal @customer.id