From 9df6e9a6829c6f70108ff7a5b0cc739db093bc36 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Tue, 14 May 2019 11:44:06 -0700 Subject: [PATCH 01/36] Generate rails app --- .gitignore | 23 +++ .ruby-version | 1 + Gemfile | 54 ++++++ Gemfile.lock | 169 ++++++++++++++++++ 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 | 2 + 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 | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 33 ++++ bin/spring | 17 ++ bin/update | 28 +++ 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 | 54 ++++++ config/environments/production.rb | 85 +++++++++ config/environments/test.rb | 46 +++++ 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 | 34 ++++ config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 ++++ lib/tasks/.keep | 0 log/.keep | 0 public/robots.txt | 1 + storage/.keep | 0 test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/test_helper.rb | 24 +++ tmp/.keep | 0 vendor/.keep | 0 58 files changed, 935 insertions(+) create mode 100644 .gitignore 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 100755 bin/update 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 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep 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 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ea4b32f59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.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/.ruby-version b/.ruby-version new file mode 100644 index 000000000..25c81fe39 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-2.5.1 \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..687a6f632 --- /dev/null +++ b/Gemfile @@ -0,0 +1,54 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.5.1' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.3' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +# gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false + +# 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.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + + +# 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 :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..87697ba34 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,169 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.2.3) + actionpack (= 5.2.3) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.2.3) + actionview (= 5.2.3) + activesupport (= 5.2.3) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.3) + activesupport (= 5.2.3) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.3) + activesupport (= 5.2.3) + globalid (>= 0.3.6) + activemodel (5.2.3) + activesupport (= 5.2.3) + activerecord (5.2.3) + activemodel (= 5.2.3) + activesupport (= 5.2.3) + arel (>= 9.0) + activestorage (5.2.3) + actionpack (= 5.2.3) + activerecord (= 5.2.3) + marcel (~> 0.3.1) + activesupport (5.2.3) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + ansi (1.5.0) + arel (9.0.0) + bootsnap (1.4.4) + msgpack (~> 1.0) + builder (3.2.3) + byebug (11.0.1) + coderay (1.1.2) + concurrent-ruby (1.1.5) + crass (1.0.4) + erubi (1.8.0) + ffi (1.10.0) + globalid (0.4.2) + activesupport (>= 4.2.0) + i18n (1.6.0) + concurrent-ruby (~> 1.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.2.3) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (0.9.2) + mimemagic (0.3.3) + mini_mime (1.0.1) + mini_portile2 (2.4.0) + minitest (5.11.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.3.6) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.2.10) + nio4r (2.3.1) + nokogiri (1.10.3) + mini_portile2 (~> 2.4.0) + pg (1.1.4) + pry (0.12.2) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.9) + pry (>= 0.10.4) + puma (3.12.1) + rack (2.0.7) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.3) + actioncable (= 5.2.3) + actionmailer (= 5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) + activemodel (= 5.2.3) + activerecord (= 5.2.3) + activestorage (= 5.2.3) + activesupport (= 5.2.3) + bundler (>= 1.3.0) + railties (= 5.2.3) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.4) + loofah (~> 2.2, >= 2.2.2) + railties (5.2.3) + actionpack (= 5.2.3) + activesupport (= 5.2.3) + method_source + rake (>= 0.8.7) + thor (>= 0.19.0, < 2.0) + rake (12.3.2) + rb-fsevent (0.10.3) + rb-inotify (0.10.0) + ffi (~> 1.0) + ruby-progressbar (1.10.0) + ruby_dep (1.5.0) + spring (2.0.2) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.3) + thread_safe (0.3.6) + tzinfo (1.2.5) + thread_safe (~> 0.1) + websocket-driver (0.7.0) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.3) + +PLATFORMS + ruby + +DEPENDENCIES + bootsnap (>= 1.1.0) + byebug + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 3.11) + rails (~> 5.2.3) + spring + spring-watcher-listen (~> 2.0.0) + tzinfo-data + +RUBY VERSION + ruby 2.5.1p57 + +BUNDLED WITH + 2.0.1 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..a009ace51 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +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..f19acf5b5 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +load Gem.bin_path('bundler', 'bundle') diff --git a/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..a334d86a6 --- /dev/null +++ b/bin/setup @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 000000000..fb2ec2ebb --- /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/bin/update b/bin/update new file mode 100755 index 000000000..67d0d4964 --- /dev/null +++ b/bin/update @@ -0,0 +1,28 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/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..641b5d08c --- /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_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 + # Always use .js files, never .coffee + g.javascript_engine :js + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.2 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + + # 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..0d86702e8 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: VideoStoreAPI_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 000000000..a7564565d --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +zaPb8FIWAWsudGl1hDwOE4chvr6Co31Dm622NPufk5y0GGm+587C5+hvziMYQ6aulsMkbYVPEHAJs+eyiVJQxPwyNiCusFD8PLm/zQWL78MsAZVMC4rVgIKIVtid9+YYI10DXJqIS4I6taM0v//XtOV8SyzkGyElTE9hMUXgyZWwuAINIf9O7hUxclXHUufGQVOBHzqjCjQHYeRbR2EDAFA6Z8pbq1lQYpHA76Nd5yj8ft3OYa1jde7LxJ6UiU3pgGAPuvZagYrEMxTaJKx4tcMgfihDsVgh8cjMITMc2EgNadVE6I2VmXCNWY5D7OnLKbnz7UZuLURih0KiJaBxtdQABTWuvvATIG/lJpYyUKLjzXMgOhBO6PishdFRawZ6O9/j70+bLc9H/qt3qcHhv5YMfcWDR5qDfgBc--Oy7Zp7hHrU1HB32n--fSPFqvkcKucGdsA4gxYeog== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 000000000..720570700 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X 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 + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: VideoStoreAPI_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: VideoStoreAPI + + # 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: VideoStoreAPI_test + +# As with config/secrets.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 http://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: VideoStoreAPI_production + username: VideoStoreAPI + password: <%= ENV['VIDEOSTOREAPI_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..d52ec9efb --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,54 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + + # 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..5f44b9bda --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,85 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # 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 = "VideoStoreAPI_#{Rails.env}" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 000000000..0a38fd3ce --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,46 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/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..decc5a857 --- /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 http://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..a5eccf816 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,34 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 000000000..787824f88 --- /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 http://guides.rubyonrails.org/routing.html +end diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..9fa7863f9 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w[ + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +].each { |path| Spring.watch(path) } diff --git a/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/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..37b576a4a --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 000000000..e69de29bb 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..2b5172a7d --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,24 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +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 +) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 000000000..e69de29bb From 0098722a0ad7979aac8b41e9aef9ef5635b6867c Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 12:07:50 -0700 Subject: [PATCH 02/36] Zomg controller set --- .vscode/settings.json | 5 +++++ app/controllers/zomg_controller.rb | 7 +++++++ test/controllers/zomg_controller_test.rb | 7 +++++++ 3 files changed, 19 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 app/controllers/zomg_controller.rb create mode 100644 test/controllers/zomg_controller_test.rb diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..953e32145 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "workbench.colorCustomizations": { + "tab.unfocusedActiveBorder": "#fff0" + } +} \ No newline at end of file diff --git a/app/controllers/zomg_controller.rb b/app/controllers/zomg_controller.rb new file mode 100644 index 000000000..f9d7f6e78 --- /dev/null +++ b/app/controllers/zomg_controller.rb @@ -0,0 +1,7 @@ +class ZomgController < ApplicationController + def index + + render json: "It works!" + + end +end diff --git a/test/controllers/zomg_controller_test.rb b/test/controllers/zomg_controller_test.rb new file mode 100644 index 000000000..203f1f08b --- /dev/null +++ b/test/controllers/zomg_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ZomgController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From e26a4ab1a336ee46390f20b880fd4cd18eebcd12 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Tue, 14 May 2019 12:09:47 -0700 Subject: [PATCH 03/36] Add zomg route --- app/controllers/zomg_controller.rb | 2 -- config/routes.rb | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/zomg_controller.rb b/app/controllers/zomg_controller.rb index f9d7f6e78..8e02ef826 100644 --- a/app/controllers/zomg_controller.rb +++ b/app/controllers/zomg_controller.rb @@ -1,7 +1,5 @@ class ZomgController < ApplicationController def index - render json: "It works!" - end end diff --git a/config/routes.rb b/config/routes.rb index 787824f88..2f14152ac 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 http://guides.rubyonrails.org/routing.html + + get "/zomg", to: "zomg#index" end From b09eeffed5bfa0409ca0d9e9681f8546dfabbc97 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 12:23:50 -0700 Subject: [PATCH 04/36] Sets up model migrations --- app/models/customer.rb | 2 ++ app/models/movie.rb | 2 ++ app/models/rental.rb | 2 ++ db/migrate/20190514191452_create_customers.rb | 16 ++++++++++++++++ db/migrate/20190514191956_create_movies.rb | 13 +++++++++++++ db/migrate/20190514192101_create_rentals.rb | 10 ++++++++++ test/fixtures/customers.yml | 11 +++++++++++ test/fixtures/movies.yml | 11 +++++++++++ test/fixtures/rentals.yml | 11 +++++++++++ test/models/customer_test.rb | 9 +++++++++ test/models/movie_test.rb | 9 +++++++++ test/models/rental_test.rb | 9 +++++++++ 12 files changed, 105 insertions(+) create mode 100644 app/models/customer.rb create mode 100644 app/models/movie.rb create mode 100644 app/models/rental.rb create mode 100644 db/migrate/20190514191452_create_customers.rb create mode 100644 db/migrate/20190514191956_create_movies.rb create mode 100644 db/migrate/20190514192101_create_rentals.rb create mode 100644 test/fixtures/customers.yml create mode 100644 test/fixtures/movies.yml create mode 100644 test/fixtures/rentals.yml create mode 100644 test/models/customer_test.rb create mode 100644 test/models/movie_test.rb create mode 100644 test/models/rental_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/movie.rb b/app/models/movie.rb new file mode 100644 index 000000000..dc614df15 --- /dev/null +++ b/app/models/movie.rb @@ -0,0 +1,2 @@ +class Movie < ApplicationRecord +end 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/20190514191452_create_customers.rb b/db/migrate/20190514191452_create_customers.rb new file mode 100644 index 000000000..f2e89fff7 --- /dev/null +++ b/db/migrate/20190514191452_create_customers.rb @@ -0,0 +1,16 @@ +class CreateCustomers < ActiveRecord::Migration[5.2] + 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.timestamps + end + end +end diff --git a/db/migrate/20190514191956_create_movies.rb b/db/migrate/20190514191956_create_movies.rb new file mode 100644 index 000000000..dbf825b36 --- /dev/null +++ b/db/migrate/20190514191956_create_movies.rb @@ -0,0 +1,13 @@ +class CreateMovies < ActiveRecord::Migration[5.2] + def change + create_table :movies do |t| + + t.string :title + t.string :inventory + t.string :overview + t.date :release_date + + t.timestamps + end + end +end diff --git a/db/migrate/20190514192101_create_rentals.rb b/db/migrate/20190514192101_create_rentals.rb new file mode 100644 index 000000000..d78c26e93 --- /dev/null +++ b/db/migrate/20190514192101_create_rentals.rb @@ -0,0 +1,10 @@ +class CreateRentals < ActiveRecord::Migration[5.2] + def change + create_table :rentals do |t| + t.datetime :checkout_date + t.datetime :due_date + + t.timestamps + end + end +end diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml new file mode 100644 index 000000000..dc3ee79b5 --- /dev/null +++ b/test/fixtures/customers.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml new file mode 100644 index 000000000..dc3ee79b5 --- /dev/null +++ b/test/fixtures/movies.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml new file mode 100644 index 000000000..dc3ee79b5 --- /dev/null +++ b/test/fixtures/rentals.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb new file mode 100644 index 000000000..5ebc5c850 --- /dev/null +++ b/test/models/customer_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Customer do + let(:customer) { Customer.new } + + it "must be valid" do + value(customer).must_be :valid? + end +end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb new file mode 100644 index 000000000..34d1d30a5 --- /dev/null +++ b/test/models/movie_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Movie do + let(:movie) { Movie.new } + + it "must be valid" do + value(movie).must_be :valid? + end +end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb new file mode 100644 index 000000000..6ea53d94f --- /dev/null +++ b/test/models/rental_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Rental do + let(:rental) { Rental.new } + + it "must be valid" do + value(rental).must_be :valid? + end +end From a2dcb23f70aba77ad9bee29a975117a837a4c12b Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 12:26:45 -0700 Subject: [PATCH 05/36] Adds validations and relationships --- app/models/customer.rb | 2 ++ app/models/movie.rb | 2 ++ app/models/rental.rb | 2 ++ db/schema.rb | 46 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 db/schema.rb diff --git a/app/models/customer.rb b/app/models/customer.rb index 0b5277335..8ce4b2c3d 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,2 +1,4 @@ class Customer < ApplicationRecord + validates :name, presence: true + has_many :rentals end diff --git a/app/models/movie.rb b/app/models/movie.rb index dc614df15..29401b57f 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,2 +1,4 @@ class Movie < ApplicationRecord + validates :title, presence: true + validates :inventory, presence: true end diff --git a/app/models/rental.rb b/app/models/rental.rb index 79e3a65ca..e001ff37c 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,2 +1,4 @@ class Rental < ApplicationRecord + belongs_to :customer + belongs_to :movie end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..9c8a27ff3 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,46 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2019_05_14_192101) 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.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "movies", force: :cascade do |t| + t.string "title" + t.string "inventory" + t.string "overview" + t.date "release_date" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "rentals", force: :cascade do |t| + t.datetime "checkout_date" + t.datetime "due_date" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end From 4504875f6b6080f27ee61f85ad09b8ccb79c068f Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 12:32:28 -0700 Subject: [PATCH 06/36] Corrects data type in movie model --- db/migrate/20190514193047_change_inventory_to_integer.rb | 5 +++++ db/schema.rb | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20190514193047_change_inventory_to_integer.rb diff --git a/db/migrate/20190514193047_change_inventory_to_integer.rb b/db/migrate/20190514193047_change_inventory_to_integer.rb new file mode 100644 index 000000000..ac3cf666c --- /dev/null +++ b/db/migrate/20190514193047_change_inventory_to_integer.rb @@ -0,0 +1,5 @@ +class ChangeInventoryToInteger < ActiveRecord::Migration[5.2] + def change + change_column :movies, :inventory, 'integer USING CAST(inventory AS integer)' + end +end diff --git a/db/schema.rb b/db/schema.rb index 9c8a27ff3..434aad5dd 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: 2019_05_14_192101) do +ActiveRecord::Schema.define(version: 2019_05_14_193047) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -29,7 +29,7 @@ create_table "movies", force: :cascade do |t| t.string "title" - t.string "inventory" + t.integer "inventory" t.string "overview" t.date "release_date" t.datetime "created_at", null: false From ab242ed4fd5e6e7f7ff61602b04b34cb946d3623 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Tue, 14 May 2019 13:42:16 -0700 Subject: [PATCH 07/36] Add movie model relation and validation tests --- app/models/movie.rb | 1 + test/models/movie_test.rb | 54 ++++++++++++++++++++++++++++++++++++--- test/test_helper.rb | 4 +-- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index 29401b57f..2b7140341 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,4 +1,5 @@ class Movie < ApplicationRecord validates :title, presence: true validates :inventory, presence: true + has_many :rentals end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 34d1d30a5..c6830eac6 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,9 +1,57 @@ require "test_helper" describe Movie do - let(:movie) { Movie.new } + before do + @movie = Movie.new(title: "test movie", inventory: 5) + end + + describe "validations" do + it "is valid when all fields are present" do + result = @movie.valid? + + expect(result).must_equal true + end + + it "is valid when title is present" do + expect(@movie.title).wont_be_nil + result = @movie.valid? + + expect(result).must_equal true + end + + it "is valid when inventory is present" do + expect(@movie.inventory).wont_be_nil + result = @movie.valid? + + expect(result).must_equal true + end + + it "is invalid without a title" do + @movie.title = nil + + result = @movie.valid? + + expect(result).must_equal false + end + + it "is invalid without an inventory" do + @movie.inventory = nil + + result = @movie.valid? + + expect(result).must_equal false + end + end + + describe "relations" do + it "can add a rental through .rentals" do + rental = Rental.new() + @movie.rentals << rental + expect(@movie.rentals).must_include rental + end - it "must be valid" do - value(movie).must_be :valid? + it "returns empty array if no rentals" do + expect(@movie.rentals).must_equal [] + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 2b5172a7d..3f7dc7d3e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,8 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails"require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, @@ -9,7 +10,6 @@ Minitest.backtrace_filter ) - # To add Capybara feature tests add `gem "minitest-rails-capybara"` # to the test group in the Gemfile and uncomment the following: # require "minitest/rails/capybara" From 68ce01dc4b626a6201c133dda92710b1ee1c1883 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 13:48:33 -0700 Subject: [PATCH 08/36] Tests for customer model --- test/models/customer_test.rb | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 5ebc5c850..af8220074 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,9 +1,38 @@ require "test_helper" describe Customer do - let(:customer) { Customer.new } + let(:customer) { customers(:sontag) } - it "must be valid" do - value(customer).must_be :valid? + describe "validations" do + + it "is valid with all all fields present" do + expect(customer).must_be :valid? + end + + it "is invalid without a name" do + customer.name = "" + expect(customer).wont_be :valid? + customer.name = nil + expect(customer).wont_be :valid? + end + + end + + describe "relations" do + + it 'has a list of rentals associated with the account' do + customer.must_respond_to :rentals + customer.rentals.count.must_equal 1 + customer.rentals.each do |rental| + rental.must_be_kind_of Rental + end + end + + it "returns empty array if no rentals" do + customer2 = customers(:laverne) + expect(customer2.rentals).must_equal [] + end + + end end end From 15226093be16eaf2a4c6880cc8018eeb5d007f3c Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 14:06:23 -0700 Subject: [PATCH 09/36] Tests for rental model --- test/models/rental_test.rb | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6ea53d94f..3c2b80f03 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,9 +1,28 @@ require "test_helper" describe Rental do - let(:rental) { Rental.new } + let(:rental) { rentals(:rentalone) } - it "must be valid" do - value(rental).must_be :valid? + describe "validations" do + + it 'is valid if all fields are present' do + expect(rental).must_be :valid? + end + + it 'is not valid if it does not have a movie' do + expect(rental).must_be :valid? + + rental.movie = nil + + expect(rental).wont_be :valid? + end + + it 'is not valid if it does not have a customer' do + expect(rental).must_be :valid? + + rental.customer = nil + + expect(rental).wont_be :valid? + end end -end +end \ No newline at end of file From 1adc8fb30750dbd5d00d6a1028896501fafeea29 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 14:06:42 -0700 Subject: [PATCH 10/36] Tests for rental model --- test/models/rental_test.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 3c2b80f03..9ad2f01a1 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -4,12 +4,11 @@ let(:rental) { rentals(:rentalone) } describe "validations" do - - it 'is valid if all fields are present' do + it "is valid if all fields are present" do expect(rental).must_be :valid? end - it 'is not valid if it does not have a movie' do + it "is not valid if it does not have a movie" do expect(rental).must_be :valid? rental.movie = nil @@ -17,7 +16,7 @@ expect(rental).wont_be :valid? end - it 'is not valid if it does not have a customer' do + it "is not valid if it does not have a customer" do expect(rental).must_be :valid? rental.customer = nil @@ -25,4 +24,4 @@ expect(rental).wont_be :valid? end end -end \ No newline at end of file +end From 0fbef4cb4005453310b973714b3a5c64cdcbaa93 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 14:44:45 -0700 Subject: [PATCH 11/36] Controller for customers --- app/controllers/customers_controller.rb | 13 +++++++++ test/controllers/customers_controller_test.rb | 28 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 app/controllers/customers_controller.rb create mode 100644 test/controllers/customers_controller_test.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb new file mode 100644 index 000000000..6286a2030 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,13 @@ +class CustomersController < ApplicationController + def index + sort_options = ["name", "registered_at", "postal_code"] + list = Customer.all + @customers = sort_and_paginate(sort_options, list, params) + end + + private + + def customer_params + params.require(:customer).permit(:name, :registered_at, :address, :city, :state, :postal_code, :phone, :sort, :p, :n) + end +end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb new file mode 100644 index 000000000..ba18bc976 --- /dev/null +++ b/test/controllers/customers_controller_test.rb @@ -0,0 +1,28 @@ +require "test_helper" + +describe CustomersController do + describe "index" do + it "returns JSON and the route is working" do + get customers_path, as: :json + + expect(response.header["Content-Type"]).must_include "json" + must_respond_with :success + end + + it "returns an array" do + get customers_path, as: :json + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Array + end + + it "returns all of the customers" do + get customers_path, as: :json + + body = JSON.parse(response.body) + + expect(body.length).must_equal Customer.count + end + end +end From 3dc832e297182901ad705b807e518d4ac4b845b8 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Tue, 14 May 2019 14:45:37 -0700 Subject: [PATCH 12/36] Add movies routes, index & show actions and tests --- app/controllers/movies_controller.rb | 15 ++++++++ config/routes.rb | 2 + test/controllers/movies_controller_test.rb | 45 ++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 app/controllers/movies_controller.rb create mode 100644 test/controllers/movies_controller_test.rb diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb new file mode 100644 index 000000000..d8b5ef06c --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,15 @@ +class MoviesController < ApplicationController + def index + movies = Movie.all + render json: movies.as_json(only: [:id, :title, :release_date]), status: :ok + end + + def show + movie = Movie.find_by(id: params[:id]) + if movie + render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok + else + render json: {errors: ["Movie with id: #{params[:id]} was not found"]}, status: :not_found + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 2f14152ac..be08cc27d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + resources :movies, only: [:index, :show, :create] + get "/zomg", to: "zomg#index" end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb new file mode 100644 index 000000000..4d403b3f2 --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,45 @@ +require "test_helper" + +describe MoviesController do + describe "index" do + it "is a real working route" do + get movies_path + must_respond_with :success + end + + it "returns json" do + get movies_path + expect(response.header["Content-Type"]).must_include "json" + end + + it "returns an Array" do + get movies_path + + body = JSON.parse(response.body) + body.must_be_kind_of Array + end + + it "returns all of the movies" do + get movies_path + + body = JSON.parse(response.body) + body.length.must_equal Movie.count + end + + it "returns movies with exactly the required fields" do + keys = %w(id release_date title) + get movies_path + body = JSON.parse(response.body) + body.each do |movie| + movie.keys.sort.must_equal keys + end + end + end + + describe "show" do + it "can get a movie" do + get movie_path(movies(:one).id) + must_respond_with :success + end + end +end From 2538612481634ab17b28e37c4bd7c1e1044b7c84 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 15:09:32 -0700 Subject: [PATCH 13/36] Adds customer controller and routes for index --- app/controllers/customers_controller.rb | 8 ++++---- config/routes.rb | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 6286a2030..3c2a06d18 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,13 +1,13 @@ class CustomersController < ApplicationController def index - sort_options = ["name", "registered_at", "postal_code"] list = Customer.all - @customers = sort_and_paginate(sort_options, list, params) + + render json: format_json(list), status: :ok end private - def customer_params - params.require(:customer).permit(:name, :registered_at, :address, :city, :state, :postal_code, :phone, :sort, :p, :n) + def format_json(customer_data) + return customer_data.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone]) end end diff --git a/config/routes.rb b/config/routes.rb index be08cc27d..63167dd00 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,7 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :movies, only: [:index, :show, :create] + resources :customers, only: [:index] get "/zomg", to: "zomg#index" end From dbff9be3f10252cf31c9c21edf8e939adaff2dba Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 15:17:58 -0700 Subject: [PATCH 14/36] Adds create to movies --- app/controllers/movies_controller.rb | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d8b5ef06c..9531e6005 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -9,7 +9,24 @@ def show if movie render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok else - render json: {errors: ["Movie with id: #{params[:id]} was not found"]}, status: :not_found + render json: { errors: ["Movie with id: #{params[:id]} was not found"] }, status: :not_found end end + + def create + @movie = Movie.new(movie_params) + if @movie.save + flash[:success] = "Movie successfully added to database" + redirect_to @movie + else + flash[:error] = "Something went wrong; could not add movie" + render "new" + end + end + + private + + def movie_params + params.require(:movie).permit(:title, :overview, :release_date, :inventory) + end end From 1a1ab37ecfe469f33fe0c6181420966f0ec07618 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 15:21:27 -0700 Subject: [PATCH 15/36] Fixes mistyping in create --- app/controllers/movies_controller.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 9531e6005..33865aec0 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -14,13 +14,11 @@ def show end def create - @movie = Movie.new(movie_params) + movie = Movie.new(movie_params) if @movie.save - flash[:success] = "Movie successfully added to database" - redirect_to @movie + render json: { id: movie.id } else - flash[:error] = "Something went wrong; could not add movie" - render "new" + render_error(:bad_request, movie.errors.messages) end end From abcf5a2eac97c880a0c0b85501cb3ec3bd6c2ebb Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 15:23:53 -0700 Subject: [PATCH 16/36] Another minute fixy fix --- app/controllers/movies_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 33865aec0..09d5cd6be 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -15,8 +15,8 @@ def show def create movie = Movie.new(movie_params) - if @movie.save - render json: { id: movie.id } + if movie.save + render json: { id: movie.id }, status: ok else render_error(:bad_request, movie.errors.messages) end From 2c27a6b53abf1b9b77a08b5ca59d28105ffc29b0 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 15:52:13 -0700 Subject: [PATCH 17/36] Creates rental controller --- app/controllers/movies_controller.rb | 4 ++-- app/controllers/rentals_controller.rb | 2 ++ test/controllers/rentals_controller_test.rb | 7 +++++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 app/controllers/rentals_controller.rb create mode 100644 test/controllers/rentals_controller_test.rb diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 09d5cd6be..6981439ea 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -16,7 +16,7 @@ def show def create movie = Movie.new(movie_params) if movie.save - render json: { id: movie.id }, status: ok + render json: { id: movie.id }, status: :ok else render_error(:bad_request, movie.errors.messages) end @@ -25,6 +25,6 @@ def create private def movie_params - params.require(:movie).permit(:title, :overview, :release_date, :inventory) + params.permit(:title, :overview, :release_date, :inventory) end end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb new file mode 100644 index 000000000..58c72b791 --- /dev/null +++ b/app/controllers/rentals_controller.rb @@ -0,0 +1,2 @@ +class RentalsController < ApplicationController +end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb new file mode 100644 index 000000000..f0227216c --- /dev/null +++ b/test/controllers/rentals_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe RentalsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From 4b55883ee9e9d4437df6bc90a9af92834fe5cccf Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Tue, 14 May 2019 16:03:09 -0700 Subject: [PATCH 18/36] Adds checkout custom method --- app/controllers/rentals_controller.rb | 30 +++++++++++++++++++++++++++ app/models/rental.rb | 11 ++++++++++ 2 files changed, 41 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 58c72b791..9c4dd7816 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,2 +1,32 @@ class RentalsController < ApplicationController + def checkout + rental = Rental.new(rental_params) + customer = find_customer + movie = find_movie + + if movie.available_inventory > 0 + rental.due_date = Date.today + 7 + if rental.save + render json: { rental_id: rental.id }, status: :ok + else + render_error(:bad_request, rental.errors.messages) + end + else + render_error(:forbidden, "No movie in available inventory.") + end + end + + private + + def rental_params + params.permit(:customer_id, :movie_id) + end + + def find_customer + return Customer.find_by(id: rental_params[:customer_id]) + end + + def find_movie + return Movie.find_by(id: rental_params[:movie_id]) + end end diff --git a/app/models/rental.rb b/app/models/rental.rb index e001ff37c..d417b50a7 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,4 +1,15 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :movie + + validates :customer_id, presence: true + validates :movie_id, presence: true + + # def rent_movie(customer, movie) + # checked_out = customer.movies_checked_out_count + # customer.update(movies_checked_out_count: checked_out +1) + + # inventory = movie.available_inventory + # movie.update(available_inventory: inventory - 1) + # end end From e2b7ab70c39cdff633b840b373b7c1f3151f145a Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Wed, 15 May 2019 13:15:17 -0700 Subject: [PATCH 19/36] Add checkin route --- app/controllers/movies_controller.rb | 4 ++-- app/controllers/rentals_controller.rb | 2 ++ config/routes.rb | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 6981439ea..d19f04f67 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -9,14 +9,14 @@ def show if movie render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok else - render json: { errors: ["Movie with id: #{params[:id]} was not found"] }, status: :not_found + render json: {errors: ["Movie with id: #{params[:id]} was not found"]}, status: :not_found end end def create movie = Movie.new(movie_params) if movie.save - render json: { id: movie.id }, status: :ok + render json: {id: movie.id}, status: :ok else render_error(:bad_request, movie.errors.messages) end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 58c72b791..db8369273 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,2 +1,4 @@ class RentalsController < ApplicationController + def checkin + end end diff --git a/config/routes.rb b/config/routes.rb index 63167dd00..2978c687f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,5 +4,6 @@ resources :movies, only: [:index, :show, :create] resources :customers, only: [:index] + post "/rentals/check-in", to: "rentals#checkin", as: "checkin" get "/zomg", to: "zomg#index" end From c2f17cb5644fdd9d747cc71e2dcd6931ac4857b9 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Wed, 15 May 2019 13:22:17 -0700 Subject: [PATCH 20/36] Add avail_inv to movies --- .../20190515201948_add_available_inventory_to_movies.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20190515201948_add_available_inventory_to_movies.rb diff --git a/db/migrate/20190515201948_add_available_inventory_to_movies.rb b/db/migrate/20190515201948_add_available_inventory_to_movies.rb new file mode 100644 index 000000000..9bcb714a6 --- /dev/null +++ b/db/migrate/20190515201948_add_available_inventory_to_movies.rb @@ -0,0 +1,5 @@ +class AddAvailableInventoryToMovies < ActiveRecord::Migration[5.2] + def change + add_column :movies, :available_inventory, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 434aad5dd..2399cae96 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: 2019_05_14_193047) do +ActiveRecord::Schema.define(version: 2019_05_15_201948) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -34,6 +34,7 @@ t.date "release_date" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "available_inventory" end create_table "rentals", force: :cascade do |t| From 0ecf4098931f83964bc6dc40f319deef7ecd3989 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Wed, 15 May 2019 13:28:48 -0700 Subject: [PATCH 21/36] Movies Checked Out added to customers --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 63167dd00..7e4067641 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,5 +4,5 @@ resources :movies, only: [:index, :show, :create] resources :customers, only: [:index] - get "/zomg", to: "zomg#index" + post "/rentals/check-out", to: "rentals#checkout", as: "checkout" end From 1a237d0c0c20f53e3bb9b035bc16ccbe9a44ce12 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Wed, 15 May 2019 13:29:34 -0700 Subject: [PATCH 22/36] Checkout method added --- app/controllers/rentals_controller.rb | 2 +- db/migrate/20190515202223_add_column.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20190515202223_add_column.rb diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 9c4dd7816..7014ed652 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -12,7 +12,7 @@ def checkout render_error(:bad_request, rental.errors.messages) end else - render_error(:forbidden, "No movie in available inventory.") + render_error(:forbidden, "Not in stock.") end end diff --git a/db/migrate/20190515202223_add_column.rb b/db/migrate/20190515202223_add_column.rb new file mode 100644 index 000000000..f9923b6bc --- /dev/null +++ b/db/migrate/20190515202223_add_column.rb @@ -0,0 +1,5 @@ +class AddColumn < ActiveRecord::Migration[5.2] + def change + add_column :customers, :movies_checked_out_count, 'integer' + end +end diff --git a/db/schema.rb b/db/schema.rb index 434aad5dd..15ba87005 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: 2019_05_14_193047) do +ActiveRecord::Schema.define(version: 2019_05_15_202223) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -25,6 +25,7 @@ t.string "phone" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "movies_checked_out_count" end create_table "movies", force: :cascade do |t| From 332ebd5df2bbe332368d77780096bafcd1533f34 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Wed, 15 May 2019 13:34:29 -0700 Subject: [PATCH 23/36] No idea. --- db/schema.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 2399cae96..428173833 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: 2019_05_15_201948) do +ActiveRecord::Schema.define(version: 2019_05_15_202223) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -25,6 +25,7 @@ t.string "phone" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "movies_checked_out_count" end create_table "movies", force: :cascade do |t| From 56f4bb47dc40379afcd2b11302ab3e7dcaa8d4f1 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Wed, 15 May 2019 13:36:18 -0700 Subject: [PATCH 24/36] Fix migration for customers --- db/migrate/20190515202223_add_column.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20190515202223_add_column.rb b/db/migrate/20190515202223_add_column.rb index f9923b6bc..484004db9 100644 --- a/db/migrate/20190515202223_add_column.rb +++ b/db/migrate/20190515202223_add_column.rb @@ -1,5 +1,5 @@ class AddColumn < ActiveRecord::Migration[5.2] def change - add_column :customers, :movies_checked_out_count, 'integer' + add_column :customers, :movies_checked_out_count, "integer" end end From c4fe0b00d99035552f00d1e90e174b6ba03ae0d4 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Wed, 15 May 2019 14:24:41 -0700 Subject: [PATCH 25/36] Add movie and cutomer ids to rental --- db/migrate/20190515211833_add_customer_to_rentals.rb | 5 +++++ db/migrate/20190515212253_add_movie_to_rentals.rb | 5 +++++ db/schema.rb | 9 ++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20190515211833_add_customer_to_rentals.rb create mode 100644 db/migrate/20190515212253_add_movie_to_rentals.rb diff --git a/db/migrate/20190515211833_add_customer_to_rentals.rb b/db/migrate/20190515211833_add_customer_to_rentals.rb new file mode 100644 index 000000000..dc305c68a --- /dev/null +++ b/db/migrate/20190515211833_add_customer_to_rentals.rb @@ -0,0 +1,5 @@ +class AddCustomerToRentals < ActiveRecord::Migration[5.2] + def change + add_reference :rentals, :customer, foreign_key: true + end +end diff --git a/db/migrate/20190515212253_add_movie_to_rentals.rb b/db/migrate/20190515212253_add_movie_to_rentals.rb new file mode 100644 index 000000000..d331952de --- /dev/null +++ b/db/migrate/20190515212253_add_movie_to_rentals.rb @@ -0,0 +1,5 @@ +class AddMovieToRentals < ActiveRecord::Migration[5.2] + def change + add_reference :rentals, :movie, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 9d59e2739..fcc401abf 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: 2019_05_15_202223) do +ActiveRecord::Schema.define(version: 2019_05_15_212253) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -43,5 +43,12 @@ t.datetime "due_date" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "customer_id" + t.bigint "movie_id" + t.index ["customer_id"], name: "index_rentals_on_customer_id" + t.index ["movie_id"], name: "index_rentals_on_movie_id" end + + add_foreign_key "rentals", "customers" + add_foreign_key "rentals", "movies" end From 12b07a02af0a804211fc482127a32fa584784370 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Wed, 15 May 2019 14:51:10 -0700 Subject: [PATCH 26/36] Fixtures for tests --- app/controllers/movies_controller.rb | 5 ++-- app/controllers/rentals_controller.rb | 17 ++++++++++---- app/models/rental.rb | 8 ------- test/fixtures/customers.yml | 22 ++++++++++++++---- test/fixtures/movies.yml | 18 +++++++++++---- test/fixtures/rentals.yml | 3 +++ test/models/customer_test.rb | 33 ++++++++++++--------------- test/models/rental_test.rb | 2 +- 8 files changed, 64 insertions(+), 44 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d19f04f67..902c494ef 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -9,14 +9,15 @@ def show if movie render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok else - render json: {errors: ["Movie with id: #{params[:id]} was not found"]}, status: :not_found + render json: { errors: ["Movie with id: #{params[:id]} was not found"] }, status: :not_found end end def create movie = Movie.new(movie_params) + movie.available_inventory = movie.inventory if movie.save - render json: {id: movie.id}, status: :ok + render json: { id: movie.id }, status: :ok else render_error(:bad_request, movie.errors.messages) end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index cbb167eab..cd35390ce 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,5 +1,4 @@ class RentalsController < ApplicationController - def checkout rental = Rental.new(rental_params) customer = find_customer @@ -9,6 +8,8 @@ def checkout rental.due_date = Date.today + 7 if rental.save render json: { rental_id: rental.id }, status: :ok + customer.movies_checked_out_count += 1 + movie.available_inventory -= 1 else render_error(:bad_request, rental.errors.messages) end @@ -17,6 +18,17 @@ def checkout end end + def checkin + customer = find_customer + movie = find_movie + rental = Rental.find_by(id: params[:customer_id, :movie_id]) + customer.movies_checked_out_count -= 1 + movie.available_inventory += 1 + if rental.save + render json: { id: rental.id }, status: :ok + end + end + private def rental_params @@ -29,8 +41,5 @@ def find_customer def find_movie return Movie.find_by(id: rental_params[:movie_id]) - - def checkin - end end diff --git a/app/models/rental.rb b/app/models/rental.rb index d417b50a7..41e46d01b 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -4,12 +4,4 @@ class Rental < ApplicationRecord validates :customer_id, presence: true validates :movie_id, presence: true - - # def rent_movie(customer, movie) - # checked_out = customer.movies_checked_out_count - # customer.update(movies_checked_out_count: checked_out +1) - - # inventory = movie.available_inventory - # movie.update(available_inventory: inventory - 1) - # end end diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index dc3ee79b5..fb44ef3bb 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -4,8 +4,20 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +one: + name: "jasmine" + address: "1250 4th Ave." + city: "Seattle" + state: "WA" + postal_code: "98101" + phone: "206-555-1212" + movies_checked_out_count: 2 + +two: + name: "igor" + address: "1250 3th Ave." + city: "Seattle" + state: "WA" + postal_code: "98102" + phone: "313-555-1212" + movies_checked_out_count: 10 diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index dc3ee79b5..1a9080238 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -4,8 +4,16 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +one: + title: "Babe 2: Pig in the City" + inventory: 2 + overview: "This post-modern gothic addresses themes of loyalty and sacrifice in the context of the inescapable cruelties of proto-urban nihilism." + release_date: 1998-10-15 + available_inventory: 2 + +two: + title: "So I Married an Axe Murderer" + inventory: 4 + overview: "A parable about trust, friendship, and the strong bonds of family in San Francisco's bustling early-'90s poetry/butcher-shop scene." + release_date: 1993-10-15 + available_inventory: 4 diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index dc3ee79b5..db0a6e8d0 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -9,3 +9,6 @@ one: {} # two: {} # column: value + +three: {} +# column: value diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index af8220074..5a5bba641 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,38 +1,33 @@ require "test_helper" describe Customer do - let(:customer) { customers(:sontag) } + let(:customer) { customers(:two) } describe "validations" do - it "is valid with all all fields present" do expect(customer).must_be :valid? end it "is invalid without a name" do customer.name = "" - expect(customer).wont_be :valid? + expect(customer).wont_be :valid? customer.name = nil - expect(customer).wont_be :valid? - end - + expect(customer).wont_be :valid? end + end - describe "relations" do - - it 'has a list of rentals associated with the account' do - customer.must_respond_to :rentals - customer.rentals.count.must_equal 1 - customer.rentals.each do |rental| - rental.must_be_kind_of Rental - end - end - - it "returns empty array if no rentals" do - customer2 = customers(:laverne) - expect(customer2.rentals).must_equal [] + describe "relations" do + it "has a list of rentals associated with the account" do + customer.must_respond_to :rentals + customer.rentals.count.must_equal 1 + customer.rentals.each do |rental| + rental.must_be_kind_of Rental end + end + it "returns empty array if no rentals" do + customer2 = customers(:one) + expect(customer2.rentals).must_equal [2] end end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 9ad2f01a1..8c91b24ce 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,7 +1,7 @@ require "test_helper" describe Rental do - let(:rental) { rentals(:rentalone) } + let(:rental) { rentals(:one) } describe "validations" do it "is valid if all fields are present" do From b1d9c057350cf01270522159282efb326b0876a2 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Wed, 15 May 2019 15:06:16 -0700 Subject: [PATCH 27/36] Yaml adjustment --- test/fixtures/rentals.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index db0a6e8d0..ef723c1d9 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -4,11 +4,20 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +one: + checkout_date: Date.today - 4 + due_date: Date.today + 2 + customer: one + movie: two + +two: + checkout_date: Date.today - 4 + due_date: Date.today + 2 + customer: one + movie: one -three: {} -# column: value +three: + checkout_date: Date.today - 1 + due_date: Date.today + 5 + customer: two + movie: one From f07592b10f6a688cb9b216821120f12827afde99 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Wed, 15 May 2019 15:15:57 -0700 Subject: [PATCH 28/36] Revise customer test --- test/fixtures/customers.yml | 9 +++++++++ test/models/customer_test.rb | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index fb44ef3bb..db95cd1d7 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -21,3 +21,12 @@ two: postal_code: "98102" phone: "313-555-1212" movies_checked_out_count: 10 + +three: + name: "igor" + address: "1250 2nd Ave." + city: "Seattle" + state: "WA" + postal_code: "98102" + phone: "310-555-1212" + movies_checked_out_count: 0 \ No newline at end of file diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 5a5bba641..086881a5d 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -26,8 +26,8 @@ end it "returns empty array if no rentals" do - customer2 = customers(:one) - expect(customer2.rentals).must_equal [2] + customer2 = customers(:three) + expect(customer2.rentals).must_equal [] end end end From c0e0818677f8a77c27e8fa448e96eeb6f7be5e0f Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Wed, 15 May 2019 15:37:53 -0700 Subject: [PATCH 29/36] Fixed a test --- 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 3c2a06d18..88c2992ec 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -8,6 +8,6 @@ def index private def format_json(customer_data) - return customer_data.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone]) + return customer_data.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count]) end end From 301afab224b8713c9492ef8305b687d38fa65c7b Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Thu, 16 May 2019 10:09:58 -0700 Subject: [PATCH 30/36] Update finding customer and movie --- app/controllers/rentals_controller.rb | 22 +++++++++------------ test/controllers/rentals_controller_test.rb | 19 +++++++++++++++--- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index cd35390ce..728154ffb 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,3 +1,5 @@ +require "pry" + class RentalsController < ApplicationController def checkout rental = Rental.new(rental_params) @@ -7,7 +9,7 @@ def checkout if movie.available_inventory > 0 rental.due_date = Date.today + 7 if rental.save - render json: { rental_id: rental.id }, status: :ok + render json: {rental_id: rental.id}, status: :ok customer.movies_checked_out_count += 1 movie.available_inventory -= 1 else @@ -19,13 +21,15 @@ def checkout end def checkin - customer = find_customer - movie = find_movie - rental = Rental.find_by(id: params[:customer_id, :movie_id]) + customer = Customer.find_by(id: rental_params[:customer_id]) + movie = Movie.find_by(id: rental_params[:movie_id]) + rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id]) + customer.movies_checked_out_count -= 1 movie.available_inventory += 1 + binding.pry if rental.save - render json: { id: rental.id }, status: :ok + render json: {id: rental.id}, status: :ok end end @@ -34,12 +38,4 @@ def checkin def rental_params params.permit(:customer_id, :movie_id) end - - def find_customer - return Customer.find_by(id: rental_params[:customer_id]) - end - - def find_movie - return Movie.find_by(id: rental_params[:movie_id]) - end end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index f0227216c..0f6db76c3 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,7 +1,20 @@ require "test_helper" describe RentalsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + let (:customer) { customers(:one) } + let (:movie) { movies(:one) } + + describe "check-in" do + let(:checkin_params) { + {customer_id: customer.id, + movie_id: movie.id} + } + + it "decreases customers movies checked out count" do + checkout_count = customer.movies_checked_out_count + post checkin_path, params: checkin_params + + expect(customer.movies_checked_out_count).must_equal checkout_count - 1 + end + end end From 6ef6d90d62e02d4a6c8dd06ba80af70e51a1ba0a Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Thu, 16 May 2019 21:26:11 -0700 Subject: [PATCH 31/36] Revise checkin action and add tests --- app/controllers/rentals_controller.rb | 11 +++-- test/controllers/rentals_controller_test.rb | 45 +++++++++++++++++++-- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 728154ffb..5b57114cc 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -25,11 +25,14 @@ def checkin movie = Movie.find_by(id: rental_params[:movie_id]) rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id]) - customer.movies_checked_out_count -= 1 - movie.available_inventory += 1 - binding.pry - if rental.save + if rental + rental.movie.available_inventory += 1 + rental.movie.save + rental.customer.movies_checked_out_count -= 1 + rental.customer.save render json: {id: rental.id}, status: :ok + else + render json: {errors: ["Rental could not be located"]}, status: :not_found end end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 0f6db76c3..70f24716e 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,8 +1,11 @@ require "test_helper" - +require "pry" describe RentalsController do let (:customer) { customers(:one) } let (:movie) { movies(:one) } + let (:rental) { + Rental.new(customer.id, movie.id) + } describe "check-in" do let(:checkin_params) { @@ -10,11 +13,47 @@ movie_id: movie.id} } - it "decreases customers movies checked out count" do - checkout_count = customer.movies_checked_out_count + let(:bad_checkin_params) { + {customer_id: -1, + movie_id: -1} + } + + it "a valid rental will return success and json" do post checkin_path, params: checkin_params + must_respond_with :success + end + it "a valid rental decreases customers movies checked out count" do + checkout_count = customer.movies_checked_out_count + post checkin_path, params: checkin_params + customer.reload expect(customer.movies_checked_out_count).must_equal checkout_count - 1 end + + it "a valid rental increases the movies available inventory count" do + available_inventory = movie.available_inventory + post checkin_path, params: checkin_params + movie.reload + expect(movie.available_inventory).must_equal available_inventory + 1 + end + + it "returns 404 if rental not found" do + post checkin_path, params: bad_checkin_params + must_respond_with :not_found + end + + it "an invalid rental will not decrease customers movies checked out count" do + checkout_count = customer.movies_checked_out_count + post checkin_path, params: bad_checkin_params + customer.reload + expect(customer.movies_checked_out_count).must_equal checkout_count + end + + it "an invalid rental will not increase the movies available inventory count" do + available_inventory = movie.available_inventory + post checkin_path, params: bad_checkin_params + movie.reload + expect(movie.available_inventory).must_equal available_inventory + end end end From 11d465959245c3580ebc653e7e2db034a800a259 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Fri, 17 May 2019 12:22:08 -0700 Subject: [PATCH 32/36] Add movie controller tests --- app/controllers/movies_controller.rb | 9 ++-- test/controllers/movies_controller_test.rb | 53 ++++++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 902c494ef..9796a8f56 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -9,7 +9,7 @@ def show if movie render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok else - render json: { errors: ["Movie with id: #{params[:id]} was not found"] }, status: :not_found + render json: {errors: ["Movie with id: #{params[:id]} was not found"]}, status: :not_found end end @@ -17,15 +17,16 @@ def create movie = Movie.new(movie_params) movie.available_inventory = movie.inventory if movie.save - render json: { id: movie.id }, status: :ok + render json: {id: movie.id}, status: :ok else - render_error(:bad_request, movie.errors.messages) + render json: {errors: movie.errors.messages}, + status: :bad_request end end private def movie_params - params.permit(:title, :overview, :release_date, :inventory) + params.require(:movie).permit(:title, :overview, :release_date, :inventory) end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 4d403b3f2..17383a9c5 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -39,7 +39,60 @@ describe "show" do it "can get a movie" do get movie_path(movies(:one).id) + expect(response.header["Content-Type"]).must_include "json" must_respond_with :success end + + it "still returns json if the movie doesn't exist" do + get movie_path(-1) + expect(response.header["Content-Type"]).must_include "json" + end + + it "returns 404 if movie not found" do + get movie_path(-1) + must_respond_with :not_found + end + end + + describe "create" do + let(:movie_data) { + { + title: "Test Movie", + inventory: 1, + available_inventory: 1, + overview: "test", + release_date: 2018 - 10 - 20, + } + } + + it "creates a new movie given valid data" do + expect { + post movies_path, params: {movie: movie_data} + }.must_change "Movie.count", 1 + + body = JSON.parse(response.body) + expect(body).must_be_kind_of Hash + expect(body).must_include "id" + + movie = Movie.find(body["id"].to_i) + + expect(movie.title).must_equal movie_data[:title] + must_respond_with :success + end + + it "returns an error for invalid movie data" do + movie_data["title"] = nil + + expect { + post movies_path, params: {movie: movie_data} + }.wont_change "Movie.count" + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Hash + expect(body).must_include "errors" + expect(body["errors"]).must_include "title" + must_respond_with :bad_request + end end end From d203e60e77bf29f129adb29a7c019cafbd54ddd9 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Fri, 17 May 2019 13:55:08 -0700 Subject: [PATCH 33/36] Not entirely sure. --- app/controllers/rentals_controller.rb | 43 +++++++++++++++++---------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 728154ffb..e289ebcf2 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -2,21 +2,34 @@ class RentalsController < ApplicationController def checkout - rental = Rental.new(rental_params) - customer = find_customer - movie = find_movie - - if movie.available_inventory > 0 - rental.due_date = Date.today + 7 - if rental.save - render json: {rental_id: rental.id}, status: :ok - customer.movies_checked_out_count += 1 - movie.available_inventory -= 1 + movie = Movie.find_by(id: rental_params[:movie_id]) + if !movie + render json: { "errors": { "movie": ["Movie not found."] } }, status: :bad_request + else + customer = Customer.find_by(id: rental_params[:customer_id]) + if !customer + render json: { "errors": { "customer": ["Customer not found."] } }, status: :bad_request else - render_error(:bad_request, rental.errors.messages) + checkout_date = Date.today + due_date = checkout_date + 7 + rental = Rental.new(customer_id: customer.id, checkout_date: checkout_date, due_date: due_date, movie_id: movie.id) + + if rental.movie.available_inventory > 0 + if rental.save + customer.movies_checked_out_count += 1 + movie.available_inventory -= 1 + if !rental.save + render json: { "errors": { "movie": rental.movie.errors.messages } }, status: :bad_request + else + render json: rental.as_json(only: [:id]), status: :ok + end + else + render json: { "errors": { "movie": rental.errors.messages } }, status: :bad_request + end + else + render json: { "errors": { "movie": ["#{movie.title} is out of stock"] } }, status: :bad_request + end end - else - render_error(:forbidden, "Not in stock.") end end @@ -29,10 +42,10 @@ def checkin movie.available_inventory += 1 binding.pry if rental.save - render json: {id: rental.id}, status: :ok + render json: { id: rental.id }, status: :ok end end - + private def rental_params From e0f7f029f38b0422ec66b0ef1f403aa8c3043cf9 Mon Sep 17 00:00:00 2001 From: Kelly Downes Date: Fri, 17 May 2019 14:06:45 -0700 Subject: [PATCH 34/36] Clean up merge --- app/controllers/rentals_controller.rb | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 6501c00d8..75f8f05e9 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -4,11 +4,11 @@ class RentalsController < ApplicationController def checkout movie = Movie.find_by(id: rental_params[:movie_id]) if !movie - render json: { "errors": { "movie": ["Movie not found."] } }, status: :bad_request + render json: {"errors": {"movie": ["Movie not found."]}}, status: :bad_request else customer = Customer.find_by(id: rental_params[:customer_id]) if !customer - render json: { "errors": { "customer": ["Customer not found."] } }, status: :bad_request + render json: {"errors": {"customer": ["Customer not found."]}}, status: :bad_request else checkout_date = Date.today due_date = checkout_date + 7 @@ -19,15 +19,15 @@ def checkout customer.movies_checked_out_count += 1 movie.available_inventory -= 1 if !rental.save - render json: { "errors": { "movie": rental.movie.errors.messages } }, status: :bad_request + render json: {"errors": {"movie": rental.movie.errors.messages}}, status: :bad_request else render json: rental.as_json(only: [:id]), status: :ok end else - render json: { "errors": { "movie": rental.errors.messages } }, status: :bad_request + render json: {"errors": {"movie": rental.errors.messages}}, status: :bad_request end else - render json: { "errors": { "movie": ["#{movie.title} is out of stock"] } }, status: :bad_request + render json: {"errors": {"movie": ["#{movie.title} is out of stock"]}}, status: :bad_request end end end @@ -38,13 +38,6 @@ def checkin movie = Movie.find_by(id: rental_params[:movie_id]) rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id]) -<<<<<<< HEAD - customer.movies_checked_out_count -= 1 - movie.available_inventory += 1 - binding.pry - if rental.save - render json: { id: rental.id }, status: :ok -======= if rental rental.movie.available_inventory += 1 rental.movie.save @@ -53,10 +46,9 @@ def checkin render json: {id: rental.id}, status: :ok else render json: {errors: ["Rental could not be located"]}, status: :not_found ->>>>>>> 058d121aac852cb889b78f2c99af0bcf21344e4c end end - + private def rental_params From 47131ec76cec7ba4fdb0e03998a9a59289b1c529 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Fri, 17 May 2019 14:42:38 -0700 Subject: [PATCH 35/36] Checkout method tests --- app/controllers/rentals_controller.rb | 14 ++---- app/models/customer.rb | 5 ++ app/models/movie.rb | 5 ++ test/controllers/rentals_controller_test.rb | 53 +++++++++++++++++++-- 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 6501c00d8..cf04760f1 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -38,25 +38,17 @@ def checkin movie = Movie.find_by(id: rental_params[:movie_id]) rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id]) -<<<<<<< HEAD - customer.movies_checked_out_count -= 1 - movie.available_inventory += 1 - binding.pry - if rental.save - render json: { id: rental.id }, status: :ok -======= if rental rental.movie.available_inventory += 1 rental.movie.save rental.customer.movies_checked_out_count -= 1 rental.customer.save - render json: {id: rental.id}, status: :ok + render json: { id: rental.id }, status: :ok else - render json: {errors: ["Rental could not be located"]}, status: :not_found ->>>>>>> 058d121aac852cb889b78f2c99af0bcf21344e4c + render json: { errors: ["Rental could not be located"] }, status: :not_found end end - + private def rental_params diff --git a/app/models/customer.rb b/app/models/customer.rb index 8ce4b2c3d..eb21cef34 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,4 +1,9 @@ class Customer < ApplicationRecord validates :name, presence: true has_many :rentals + + after_initialize do |customer| + customer.movies_checked_out_count = 0 + customer.save + end end diff --git a/app/models/movie.rb b/app/models/movie.rb index 2b7140341..9360a9fc5 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -2,4 +2,9 @@ class Movie < ApplicationRecord validates :title, presence: true validates :inventory, presence: true has_many :rentals + + after_initialize do |movie| + movie.available_inventory = movie.inventory + movie.save + end end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 70f24716e..d97365158 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -7,15 +7,60 @@ Rental.new(customer.id, movie.id) } + let(:rental_params) { + { + customer_id: customers(:one).id, + movie_id: movies(:one).id, + } + } + + describe "checkout" do + it "checkout path is a working route and returns JSON" do + post checkout_path params: rental_params + expect(response.header["Content-Type"]).must_include "json" + must_respond_with :success + end + + it "checkout works with valid data" do + expect { post checkout_path, params: rental_params }.must_change "Rental.count", 1 + + body = JSON.parse(response.body) + expect(body).must_be_kind_of Hash + expect(body).must_include "id" + + rental = Rental.find_by(id: body["id"].to_i) + + expect(rental.customer_id).must_equal rental_params[:customer_id] + expect(rental.movie_id).must_equal rental_params[:movie_id] + expect(rental.checkout_date).must_equal Date.today + expect(rental.due_date).must_equal Date.today + 7 + must_respond_with :success + end + + it "checkout does not work with invalid data" do + rental_params[:customer_id] = -1 + + expect { + post checkout_path, params: rental_params + }.wont_change "Rental.count" + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Hash + expect(body["errors"]).must_include "customer" + must_respond_with :bad_request + end + end + describe "check-in" do let(:checkin_params) { - {customer_id: customer.id, - movie_id: movie.id} + { customer_id: customer.id, + movie_id: movie.id } } let(:bad_checkin_params) { - {customer_id: -1, - movie_id: -1} + { customer_id: -1, + movie_id: -1 } } it "a valid rental will return success and json" do From fdff489e87620ffbba0fb708dea1b7a76bc43e85 Mon Sep 17 00:00:00 2001 From: Kate Sandler Date: Fri, 17 May 2019 15:29:19 -0700 Subject: [PATCH 36/36] Fix rental checkout done --- app/controllers/rentals_controller.rb | 12 +++++++----- app/models/customer.rb | 2 +- app/models/movie.rb | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index cf04760f1..960e99587 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -3,22 +3,24 @@ class RentalsController < ApplicationController def checkout movie = Movie.find_by(id: rental_params[:movie_id]) + if !movie - render json: { "errors": { "movie": ["Movie not found."] } }, status: :bad_request + render json: { "errors": { "movie": ["Movie not found"] } }, status: :bad_request else customer = Customer.find_by(id: rental_params[:customer_id]) if !customer - render json: { "errors": { "customer": ["Customer not found."] } }, status: :bad_request + render json: { "errors": { "customer": ["Customer not found"] } }, status: :bad_request else checkout_date = Date.today due_date = checkout_date + 7 - rental = Rental.new(customer_id: customer.id, checkout_date: checkout_date, due_date: due_date, movie_id: movie.id) + rental = Rental.new(customer: customer, checkout_date: checkout_date, due_date: due_date, movie: movie) if rental.movie.available_inventory > 0 if rental.save + rental.movie.available_inventory -= 1 customer.movies_checked_out_count += 1 - movie.available_inventory -= 1 - if !rental.save + customer.save + if !rental.movie.save render json: { "errors": { "movie": rental.movie.errors.messages } }, status: :bad_request else render json: rental.as_json(only: [:id]), status: :ok diff --git a/app/models/customer.rb b/app/models/customer.rb index eb21cef34..27c57a78c 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -2,7 +2,7 @@ class Customer < ApplicationRecord validates :name, presence: true has_many :rentals - after_initialize do |customer| + after_create do |customer| customer.movies_checked_out_count = 0 customer.save end diff --git a/app/models/movie.rb b/app/models/movie.rb index 9360a9fc5..b266b8305 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -3,7 +3,7 @@ class Movie < ApplicationRecord validates :inventory, presence: true has_many :rentals - after_initialize do |movie| + after_create do |movie| movie.available_inventory = movie.inventory movie.save end