From 3e2f01010953fa588c8d6df378ab00b005da9589 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 11:26:11 -0800 Subject: [PATCH 01/76] create rail project --- .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 +++++ .../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 57 files changed, 934 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/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..e54d447e8 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-2.4.1 \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..1d10e5eb5 --- /dev/null +++ b/Gemfile @@ -0,0 +1,54 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.4.1' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.1' +# 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..e810c083c --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,169 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.2.1) + actionpack (= 5.2.1) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.1) + actionpack (= 5.2.1) + actionview (= 5.2.1) + activejob (= 5.2.1) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.2.1) + actionview (= 5.2.1) + activesupport (= 5.2.1) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.1) + activesupport (= 5.2.1) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.1) + activesupport (= 5.2.1) + globalid (>= 0.3.6) + activemodel (5.2.1) + activesupport (= 5.2.1) + activerecord (5.2.1) + activemodel (= 5.2.1) + activesupport (= 5.2.1) + arel (>= 9.0) + activestorage (5.2.1) + actionpack (= 5.2.1) + activerecord (= 5.2.1) + marcel (~> 0.3.1) + activesupport (5.2.1) + 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.3.2) + msgpack (~> 1.0) + builder (3.2.3) + byebug (10.0.2) + coderay (1.1.2) + concurrent-ruby (1.1.1) + crass (1.0.4) + erubi (1.7.1) + ffi (1.9.25) + globalid (0.4.1) + activesupport (>= 4.2.0) + i18n (1.1.1) + 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.1) + mimemagic (0.3.2) + mini_mime (1.0.1) + mini_portile2 (2.3.0) + minitest (5.11.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.3.5) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.2.4) + nio4r (2.3.1) + nokogiri (1.8.5) + mini_portile2 (~> 2.3.0) + pg (1.1.3) + pry (0.12.0) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + puma (3.12.0) + rack (2.0.5) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.1) + actioncable (= 5.2.1) + actionmailer (= 5.2.1) + actionpack (= 5.2.1) + actionview (= 5.2.1) + activejob (= 5.2.1) + activemodel (= 5.2.1) + activerecord (= 5.2.1) + activestorage (= 5.2.1) + activesupport (= 5.2.1) + bundler (>= 1.3.0) + railties (= 5.2.1) + 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.1) + actionpack (= 5.2.1) + activesupport (= 5.2.1) + method_source + rake (>= 0.8.7) + thor (>= 0.19.0, < 2.0) + rake (12.3.1) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + 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.0) + 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.1) + spring + spring-watcher-listen (~> 2.0.0) + tzinfo-data + +RUBY VERSION + ruby 2.4.1p111 + +BUNDLED WITH + 1.17.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..16ee3a937 --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +vRwAif5rc2kdxGQikhxFn138KtUsj7baSXbhjV/Yn9umSyXmZc+qxJ4xoSeusysffnZUdlpwzH2zoy1eDpAIKGsFNG84VHsConGAKuVvwbnGtsPyQ0l+DAka/3f/PGeS0zaPdmiQc4BxClZKAdfMNrSVrFY/AZ7RsZ17JoAei4leIexVnxrqUJUpUCm3W64vwWzGu2CSu1cGyH8qWuVofVDvL84BLraFZkxAdSsEXRiwfDlSsgkGIPaWVtZPGg/UfIlsY1uQQsdTGdBssmh4g8LwznyB15Gn91dfVcdqIwHnZQMif6HF/dbRci0qJmeNC5uo3GeFfdG0cJjjagUPHgjGxl1GiptEP/cOKOEO3HiNhDFOpbjubIgbocmCbISS0a+wpUr13/xRD87Az+PQ/nqX6Wk3tmd7034F--zPiRAacuinztHT3N--It0HKGrSZ4tqdXxQnsEsqg== \ 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/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 b7d859931a843354913ae46176d5c36f4209ad37 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 12:42:30 -0800 Subject: [PATCH 02/76] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 53ab809c5..b8e0c179b 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ Request body: |---------------|----------|------------ | `customer_id` | integer | ID of the customer checking in this film | `movie_id` | integer | ID of the movie to be checked in - +[//]: <> ( ## Optional Enhancements These really are **optional** - if you've gotten here and you have time left, that means you're moving speedy fast! @@ -302,7 +302,7 @@ Fields to return: - `checkout_date` - `due_date` - +) ## Reference - [Postman on Environments](https://www.getpostman.com/docs/environments) From e279db60eae7500f5a6b20c2e3329e26bba9768e Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 12:43:31 -0800 Subject: [PATCH 03/76] Update README.md --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b8e0c179b..0f824beca 100644 --- a/README.md +++ b/README.md @@ -209,8 +209,8 @@ Request body: |---------------|----------|------------ | `customer_id` | integer | ID of the customer checking in this film | `movie_id` | integer | ID of the movie to be checked in -[//]: <> ( -## Optional Enhancements + + ## Reference - [Postman on Environments](https://www.getpostman.com/docs/environments) From d99a93f72b0d85048ae3cbe4e4655715c031e47a Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 12:45:16 -0800 Subject: [PATCH 04/76] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0f824beca..80f85d2a9 100644 --- a/README.md +++ b/README.md @@ -301,6 +301,7 @@ Fields to return: - `title` - `checkout_date` - `due_date` ---> + ## Reference - [Postman on Environments](https://www.getpostman.com/docs/environments) From 0c6d553041243750060e4652c6e51fbd8f0285d6 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 12:59:59 -0800 Subject: [PATCH 05/76] created controllers --- app/controllers/customers_controller.rb | 2 ++ app/controllers/movies_controller.rb | 2 ++ app/controllers/rentals_controller.rb | 2 ++ test/controllers/customers_controller_test.rb | 7 +++++++ test/controllers/movies_controller_test.rb | 7 +++++++ test/controllers/rentals_controller_test.rb | 7 +++++++ 6 files changed, 27 insertions(+) create mode 100644 app/controllers/customers_controller.rb create mode 100644 app/controllers/movies_controller.rb create mode 100644 app/controllers/rentals_controller.rb create mode 100644 test/controllers/customers_controller_test.rb create mode 100644 test/controllers/movies_controller_test.rb create mode 100644 test/controllers/rentals_controller_test.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb new file mode 100644 index 000000000..ca3b6e024 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,2 @@ +class CustomersController < ApplicationController +end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb new file mode 100644 index 000000000..6c4c51614 --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,2 @@ +class MoviesController < ApplicationController +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/customers_controller_test.rb b/test/controllers/customers_controller_test.rb new file mode 100644 index 000000000..5e123f6cd --- /dev/null +++ b/test/controllers/customers_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe CustomersController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb new file mode 100644 index 000000000..67fabbcfb --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MoviesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +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 e8c9490b343464e0c52b04c3031b6df6a4eed7db Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 13:04:42 -0800 Subject: [PATCH 06/76] added models for Customer, Rental, and Movie --- app/models/customer.rb | 2 + app/models/movie.rb | 2 + app/models/rental.rb | 2 + db/migrate/20181105210400_create_customers.rb | 17 +++++++ db/migrate/20181105210410_create_rentals.rb | 11 ++++ db/migrate/20181105210416_create_movies.rb | 14 +++++ db/schema.rb | 51 +++++++++++++++++++ test/fixtures/customers.yml | 23 +++++++++ test/fixtures/movies.yml | 17 +++++++ test/fixtures/rentals.yml | 11 ++++ test/models/customer_test.rb | 9 ++++ test/models/movie_test.rb | 9 ++++ test/models/rental_test.rb | 9 ++++ 13 files changed, 177 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/20181105210400_create_customers.rb create mode 100644 db/migrate/20181105210410_create_rentals.rb create mode 100644 db/migrate/20181105210416_create_movies.rb create mode 100644 db/schema.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/20181105210400_create_customers.rb b/db/migrate/20181105210400_create_customers.rb new file mode 100644 index 000000000..6cfc1dbf9 --- /dev/null +++ b/db/migrate/20181105210400_create_customers.rb @@ -0,0 +1,17 @@ +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 :string + t.string :phone + t.integer :movies_checked_out_count + + t.timestamps + end + end +end diff --git a/db/migrate/20181105210410_create_rentals.rb b/db/migrate/20181105210410_create_rentals.rb new file mode 100644 index 000000000..4fd51d958 --- /dev/null +++ b/db/migrate/20181105210410_create_rentals.rb @@ -0,0 +1,11 @@ +class CreateRentals < ActiveRecord::Migration[5.2] + def change + create_table :rentals do |t| + t.datetime :check_out_date + t.datetime :due_date + t.string :status + + t.timestamps + end + end +end diff --git a/db/migrate/20181105210416_create_movies.rb b/db/migrate/20181105210416_create_movies.rb new file mode 100644 index 000000000..199cbadc0 --- /dev/null +++ b/db/migrate/20181105210416_create_movies.rb @@ -0,0 +1,14 @@ +class CreateMovies < ActiveRecord::Migration[5.2] + def change + create_table :movies do |t| + t.string :title + t.string :overview + t.date :release_date + t.integer :inventory + t.integer :customer_id + t.integer :movie_id + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..cdd404eef --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,51 @@ +# 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: 2018_11_05_210416) 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 "string" + t.string "phone" + t.integer "movies_checked_out_count" + 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 "overview" + t.date "release_date" + t.integer "inventory" + t.integer "customer_id" + t.integer "movie_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "rentals", force: :cascade do |t| + t.datetime "check_out_date" + t.datetime "due_date" + t.string "status" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml new file mode 100644 index 000000000..f9125fcbd --- /dev/null +++ b/test/fixtures/customers.yml @@ -0,0 +1,23 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + registered_at: 2018-11-05 13:04:00 + address: MyString + city: MyString + state: MyString + postal_code: MyString + string: MyString + phone: MyString + movies_checked_out_count: 1 + +two: + name: MyString + registered_at: 2018-11-05 13:04:00 + address: MyString + city: MyString + state: MyString + postal_code: MyString + string: MyString + phone: MyString + movies_checked_out_count: 1 diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml new file mode 100644 index 000000000..504e72c62 --- /dev/null +++ b/test/fixtures/movies.yml @@ -0,0 +1,17 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + title: MyString + overview: MyString + release_date: 2018-11-05 + inventory: 1 + customer_id: 1 + movie_id: 1 + +two: + title: MyString + overview: MyString + release_date: 2018-11-05 + inventory: 1 + customer_id: 1 + movie_id: 1 diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml new file mode 100644 index 000000000..485c66819 --- /dev/null +++ b/test/fixtures/rentals.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + check_out_date: 2018-11-05 13:04:10 + due_date: 2018-11-05 13:04:10 + status: MyString + +two: + check_out_date: 2018-11-05 13:04:10 + due_date: 2018-11-05 13:04:10 + status: MyString 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 093b1822984af1a0cadf8312f5699ebe0be1004c Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 13:12:57 -0800 Subject: [PATCH 07/76] added relationships to models --- app/models/customer.rb | 1 + app/models/movie.rb | 1 + app/models/rental.rb | 2 ++ 3 files changed, 4 insertions(+) diff --git a/app/models/customer.rb b/app/models/customer.rb index 0b5277335..d2533dbf9 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,2 +1,3 @@ class Customer < ApplicationRecord + has_many :rentals end diff --git a/app/models/movie.rb b/app/models/movie.rb index dc614df15..b8b339cbc 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,2 +1,3 @@ class Movie < ApplicationRecord + has_many :rentals 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 From ca569f2ebc7620b210f37417c6dbcf8e446a1189 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 13:22:04 -0800 Subject: [PATCH 08/76] moved foregin key from movie to rental --- db/migrate/20181105211430_add_reference.rb | 6 ++++++ ...105211947_delete_customer_id_movie_id_from_movie.rb | 6 ++++++ db/schema.rb | 10 +++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20181105211430_add_reference.rb create mode 100644 db/migrate/20181105211947_delete_customer_id_movie_id_from_movie.rb diff --git a/db/migrate/20181105211430_add_reference.rb b/db/migrate/20181105211430_add_reference.rb new file mode 100644 index 000000000..9c2c87890 --- /dev/null +++ b/db/migrate/20181105211430_add_reference.rb @@ -0,0 +1,6 @@ +class AddReference < ActiveRecord::Migration[5.2] + def change + add_reference :rentals, :customer, foreign_key: true + add_reference :rentals, :movie, foreign_key: true + end +end diff --git a/db/migrate/20181105211947_delete_customer_id_movie_id_from_movie.rb b/db/migrate/20181105211947_delete_customer_id_movie_id_from_movie.rb new file mode 100644 index 000000000..d34db8268 --- /dev/null +++ b/db/migrate/20181105211947_delete_customer_id_movie_id_from_movie.rb @@ -0,0 +1,6 @@ +class DeleteCustomerIdMovieIdFromMovie < ActiveRecord::Migration[5.2] + def change + remove_column :movies, :movie_id + remove_column :movies, :customer_id + end +end diff --git a/db/schema.rb b/db/schema.rb index cdd404eef..26cfe0529 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: 2018_11_05_210416) do +ActiveRecord::Schema.define(version: 2018_11_05_211947) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -34,8 +34,6 @@ t.string "overview" t.date "release_date" t.integer "inventory" - t.integer "customer_id" - t.integer "movie_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end @@ -46,6 +44,12 @@ t.string "status" 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 7d1e929f02383acc88eaf24101f3eb940febc537 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 13:36:30 -0800 Subject: [PATCH 09/76] added markdown file for pseudo-coded routes --- pseudo-code-routes.md | 82 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 pseudo-code-routes.md diff --git a/pseudo-code-routes.md b/pseudo-code-routes.md new file mode 100644 index 000000000..421d0cbbd --- /dev/null +++ b/pseudo-code-routes.md @@ -0,0 +1,82 @@ + + +GET /customers +List all customers + +Fields to return: +id +name +registered_at +postal_code +phone +movies_checked_out_count +This will be 0 unless you've completed optional requirements + +---------------------------- +GET /movies +List all movies + +Fields to return: + +id +title +release_date + +------------------------------ + +GET /movies/:id +Look a movie up by id + +URI parameters: + +id: Movie identifier +Fields to return: + +title +overview +release_date +inventory (total) +available_inventory (not currently checked-out to a customer) +This will be the same as inventory unless you've completed the optional endpoints. + +---------------------- + +POST /movies +Create a new movie in the video store inventory. + +Upon success, this request should return the id of the movie created. + +Request body: + +Field Datatype Description +title string Title of the movie +overview string Descriptive summary of the movie +release_date string YYYY-MM-DD Date the movie was released +inventory integer Quantity available in the video store + +--------------------------- + +POST /rentals/check-out +Check out one of the movie's inventory to the customer. The rental's check-out date should be set to today, and the due date should be set to a week from today. + +Note: Some of the fields from wave 2 should now have interesting values. Good thing you wrote tests for them, right... right? + +Request body: + +Field Datatype Description +customer_id integer ID of the customer checking out this film +movie_id integer ID of the movie to be checked out + +--------------------------- + +POST /rentals/check-in +Check in one of a customer's rentals + +Request body: + +Field Datatype Description +customer_id integer ID of the customer checking in this film +movie_id integer ID of the movie to be checked in From 23263592eb36ebf9f754d90b92bd6a611440e7ed Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 13:42:49 -0800 Subject: [PATCH 10/76] added pseudo code routes for movies, check-in, check-out --- config/routes.rb | 6 ++++++ pseudo-code-routes.md | 3 +++ 2 files changed, 9 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 787824f88..c0d984266 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,9 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + + # post "/movies", to: "movies#create", as: "create_movie" + # post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" + # post "/rentals/check-in, to: "rentals#check_in", as: "check_in_movie" + + end diff --git a/pseudo-code-routes.md b/pseudo-code-routes.md index 421d0cbbd..10ceed37d 100644 --- a/pseudo-code-routes.md +++ b/pseudo-code-routes.md @@ -43,6 +43,7 @@ available_inventory (not currently checked-out to a customer) This will be the same as inventory unless you've completed the optional endpoints. ---------------------- +post "/movies", to: "movies#create", as: "create_movie" POST /movies Create a new movie in the video store inventory. @@ -58,6 +59,7 @@ release_date string YYYY-MM-DD Date the movie was released inventory integer Quantity available in the video store --------------------------- +post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" POST /rentals/check-out Check out one of the movie's inventory to the customer. The rental's check-out date should be set to today, and the due date should be set to a week from today. @@ -71,6 +73,7 @@ customer_id integer ID of the customer checking out this film movie_id integer ID of the movie to be checked out --------------------------- +post "/rentals/check-in, to: "rentals#check_in", as: "check_in_movie" POST /rentals/check-in Check in one of a customer's rentals From c70d3f2e6a00ac6a7aac530fddbb04076492a222 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 13:46:00 -0800 Subject: [PATCH 11/76] complete the pseudo code routes --- pseudo-code-routes.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pseudo-code-routes.md b/pseudo-code-routes.md index 10ceed37d..ed06d2f07 100644 --- a/pseudo-code-routes.md +++ b/pseudo-code-routes.md @@ -3,6 +3,9 @@ The endpoints your API will need The HTTP verbs each endpoint will use Any data that must be provided to the endpoint in order for it to do its work --> +get "/customers", to: "customers#index", as: "customers" + + GET /customers List all customers @@ -16,6 +19,8 @@ movies_checked_out_count This will be 0 unless you've completed optional requirements ---------------------------- +get "/movies", to: "movies#index", as: "movies" + GET /movies List all movies @@ -26,6 +31,7 @@ title release_date ------------------------------ +get "/movies/:id", to: "movies#show", as: "movie" GET /movies/:id Look a movie up by id From fec0a7ac8ff9f5a6301e694e48e81a94ee634597 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 13:49:23 -0800 Subject: [PATCH 12/76] created routes --- config/routes.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index c0d984266..a45571264 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,13 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - # post "/movies", to: "movies#create", as: "create_movie" - # post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" - # post "/rentals/check-in, to: "rentals#check_in", as: "check_in_movie" + get "/movies", to: "movies#index", as: "movies" + post "/movies", to: "movies#create", as: "create_movie" + get "/movies/:id", to: "movies#show", as: "movie" + post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" + post "/rentals/check-in, to: "rentals#check_in", as: "check_in_movie" + + get "/customers", to: "customers#index", as: "customers" end From b340e8a3f0ec7f72bf2fd82e77140000e8e657fb Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 13:49:45 -0800 Subject: [PATCH 13/76] created routes --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index a45571264..d08015cc2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,7 +6,7 @@ get "/movies/:id", to: "movies#show", as: "movie" post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" - post "/rentals/check-in, to: "rentals#check_in", as: "check_in_movie" + post "/rentals/check-in", to: "rentals#check_in", as: "check_in_movie" get "/customers", to: "customers#index", as: "customers" From 69281296d3720aded6fdeac2a63500ef224ebafb Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 13:57:40 -0800 Subject: [PATCH 14/76] added failed zomg route and method --- app/controllers/movies_controller.rb | 4 ++++ config/routes.rb | 2 ++ 2 files changed, 6 insertions(+) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 6c4c51614..44033cd51 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,2 +1,6 @@ class MoviesController < ApplicationController + + def zomg + render json: { ok: true, message: 'it works!'}, status: :ok + end end diff --git a/config/routes.rb b/config/routes.rb index d08015cc2..6c97da498 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,4 +10,6 @@ get "/customers", to: "customers#index", as: "customers" + get "/zomg", to: "movies#zomg", as: "zomg" + end From d7e263f486966b3054a60cc526ba790234decdbe Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 14:01:28 -0800 Subject: [PATCH 15/76] fixed the zomg action in controller --- app/controllers/movies_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 44033cd51..d4aa260b8 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,6 +1,6 @@ class MoviesController < ApplicationController def zomg - render json: { ok: true, message: 'it works!'}, status: :ok + render json:{ ok: true, message: 'it works!'}, status: :ok end end From 62b177d6c96f447fa1c9095061ff5e0930a0ab8b Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 14:34:55 -0800 Subject: [PATCH 16/76] remove string field fm customer, added fixtures for test --- app/models/customer.rb | 3 ++ app/models/movie.rb | 2 ++ .../20181105223258_remove_string_field.rb | 5 ++++ db/schema.rb | 3 +- test/fixtures/customers.yml | 30 +++++++++---------- test/fixtures/movies.yml | 19 +++++------- test/fixtures/rentals.yml | 12 +++++--- 7 files changed, 41 insertions(+), 33 deletions(-) create mode 100644 db/migrate/20181105223258_remove_string_field.rb diff --git a/app/models/customer.rb b/app/models/customer.rb index d2533dbf9..ccdfef420 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,3 +1,6 @@ class Customer < ApplicationRecord has_many :rentals + + validates :name, presence: true + end diff --git a/app/models/movie.rb b/app/models/movie.rb index b8b339cbc..00280a8e1 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,3 +1,5 @@ class Movie < ApplicationRecord has_many :rentals + + validates :title, presence: true end diff --git a/db/migrate/20181105223258_remove_string_field.rb b/db/migrate/20181105223258_remove_string_field.rb new file mode 100644 index 000000000..5ad069e2d --- /dev/null +++ b/db/migrate/20181105223258_remove_string_field.rb @@ -0,0 +1,5 @@ +class RemoveStringField < ActiveRecord::Migration[5.2] + def change + remove_column :customers, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 26cfe0529..4e4c4f7da 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: 2018_11_05_211947) do +ActiveRecord::Schema.define(version: 2018_11_05_223258) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -22,7 +22,6 @@ t.string "city" t.string "state" t.string "postal_code" - t.string "string" t.string "phone" t.integer "movies_checked_out_count" t.datetime "created_at", null: false diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index f9125fcbd..f37183324 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -1,23 +1,21 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString +mike: + name: Mike registered_at: 2018-11-05 13:04:00 - address: MyString - city: MyString - state: MyString - postal_code: MyString - string: MyString - phone: MyString + address: 100 10th Ave + city: Seattle + state: WA + postal_code: 98003 + phone: 206-222-1999 movies_checked_out_count: 1 -two: - name: MyString +lily: + name: Lily registered_at: 2018-11-05 13:04:00 - address: MyString - city: MyString - state: MyString - postal_code: MyString - string: MyString - phone: MyString + address: 8 5th Ave + city: Issaquah + state: WA + postal_code: 98010 + phone: 206-333-1888 movies_checked_out_count: 1 diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index 504e72c62..87dee0716 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -1,17 +1,14 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - title: MyString - overview: MyString - release_date: 2018-11-05 +taken: + title: Taken + overview: action + release_date: 2018-10-05 inventory: 1 - customer_id: 1 - movie_id: 1 -two: - title: MyString - overview: MyString + +ring: + title: The Ring + overview: thrill release_date: 2018-11-05 inventory: 1 - customer_id: 1 - movie_id: 1 diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index 485c66819..a9916e173 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -1,11 +1,15 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - check_out_date: 2018-11-05 13:04:10 - due_date: 2018-11-05 13:04:10 + check_out_date: 2018-11-03 13:04:10 + due_date: 2018-11-10 13:04:10 status: MyString + customer: lily + movie: taken two: - check_out_date: 2018-11-05 13:04:10 - due_date: 2018-11-05 13:04:10 + check_out_date: 2018-10-20 13:04:10 + due_date: 2018-10-27 13:04:10 status: MyString + customer: mike + movie: ring From 351aaa0fb611368fc1fb94ccbc130fc7d256f411 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 14:53:09 -0800 Subject: [PATCH 17/76] added validations to rentals and customers --- app/models/customer.rb | 2 ++ app/models/rental.rb | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/app/models/customer.rb b/app/models/customer.rb index ccdfef420..848305651 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -3,4 +3,6 @@ class Customer < ApplicationRecord validates :name, presence: true + validates :movies_checked_out_count, presence: true, numericality: { greater_than_or_equal_to: 0 } + end diff --git a/app/models/rental.rb b/app/models/rental.rb index e001ff37c..7ff6d0ff7 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,4 +1,12 @@ class Rental < ApplicationRecord + STATUSES = ["checked out", "returned"] + belongs_to :customer belongs_to :movie + + validates :check_out_date, presence: true + validates :due_date, presence: true + validates :status, presence: true + validates :status, presence: true, inclusion: { in: STATUSES } + end From 53af761d8ccde2687396791451f0d097f413b803 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 15:02:42 -0800 Subject: [PATCH 18/76] added relationship tests and fixed line in test_helper.rb --- test/fixtures/rentals.yml | 4 ++-- test/models/rental_test.rb | 15 ++++++++++++--- test/test_helper.rb | 3 ++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index a9916e173..89f31190b 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -3,13 +3,13 @@ one: check_out_date: 2018-11-03 13:04:10 due_date: 2018-11-10 13:04:10 - status: MyString + status: "checked out" customer: lily movie: taken two: check_out_date: 2018-10-20 13:04:10 due_date: 2018-10-27 13:04:10 - status: MyString + status: "checked out" customer: mike movie: ring diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6ea53d94f..2a708a649 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,9 +1,18 @@ require "test_helper" describe Rental do - let(:rental) { Rental.new } + describe "relations" do + it "belongs to a customer" do + rental = rentals(:one) + rental.must_respond_to :customer + rental.customer.must_be_kind_of Customer + end - it "must be valid" do - value(rental).must_be :valid? + it "belongs to a movie" do + rental = rentals(:one) + rental.must_respond_to :movie + rental.movie.must_be_kind_of Movie + end end + end diff --git a/test/test_helper.rb b/test/test_helper.rb index 2b5172a7d..fb7dd505e 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, From 7c65d13470a2039c0305d1512d79214b2a55b7b4 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 15:16:31 -0800 Subject: [PATCH 19/76] added more tests for rental model --- app/models/rental.rb | 1 - test/models/rental_test.rb | 49 +++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index 7ff6d0ff7..8f3bbd3e7 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -6,7 +6,6 @@ class Rental < ApplicationRecord validates :check_out_date, presence: true validates :due_date, presence: true - validates :status, presence: true validates :status, presence: true, inclusion: { in: STATUSES } end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 2a708a649..0a232779b 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,7 +1,7 @@ require "test_helper" describe Rental do - describe "relations" do + describe "relationships" do it "belongs to a customer" do rental = rentals(:one) rental.must_respond_to :customer @@ -15,4 +15,51 @@ end end + describe "validations" do + + it "must have a checkout_date" do + rental = rentals(:one) + + rental.check_out_date = nil + result = rental.save + result.must_equal false + + rental.check_out_date = "2018-12-03 13:04:10" + result = rental.save + result.must_equal true + end + + it "must have a due_date" do + rental = rentals(:one) + + rental.due_date = nil + result = rental.save + result.must_equal false + + rental.due_date = "2018-12-10 13:04:10" + result = rental.save + result.must_equal true + end + + it "must have a status" do + rental = rentals(:one) + rental.status = nil + + result = rental.save + + result.must_equal false + end + + it "must have a valid status" do + rental = rentals(:one) + + rental.status = "cheese" + result = rental.save + result.must_equal false + + rental.status = "checked out" + result = rental.save + result.must_equal true + end + end end From e9d4a1f6253b8a777d3ed48a23560ededb2305dd Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 15:23:51 -0800 Subject: [PATCH 20/76] added customer model tests --- test/fixtures/customers.yml | 2 +- test/fixtures/movies.yml | 6 ++++ test/fixtures/rentals.yml | 7 +++++ test/models/customer_test.rb | 58 ++++++++++++++++++++++++++++++++++-- 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index f37183324..767512dd0 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -8,7 +8,7 @@ mike: state: WA postal_code: 98003 phone: 206-222-1999 - movies_checked_out_count: 1 + movies_checked_out_count: 2 lily: name: Lily diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index 87dee0716..e29d8d1a2 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -12,3 +12,9 @@ ring: overview: thrill release_date: 2018-11-05 inventory: 1 + +titanic: + title: Titanic + overview: masterpiece + release_date: 1997-11-05 + inventory: 5 diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index 89f31190b..f7bcefa16 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -13,3 +13,10 @@ two: status: "checked out" customer: mike movie: ring + +three: + check_out_date: 2018-10-20 13:04:10 + due_date: 2018-10-27 13:04:10 + status: "checked out" + customer: mike + movie: titanic diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 5ebc5c850..b2e3481ef 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,9 +1,61 @@ require "test_helper" describe Customer do - let(:customer) { Customer.new } - it "must be valid" do - value(customer).must_be :valid? + describe "relationships" do + + it "has many rentals" do + customer = customers(:mike) + + customer.must_respond_to :rentals + + customer.rentals.each do |rental| + rental.customer.must_be_kind_of Customer + end + end + + end + + describe "validations" do + it "must have a name" do + customer = customers(:mike) + + customer.name = nil + result = customer.save + result.must_equal false + + customer.name = "Jane" + result = customer.save + result.must_equal true + end + + it "must have movies checked out count" do + customer = customers(:mike) + + customer.movies_checked_out_count = nil + result = customer.save + result.must_equal false + + customer.movies_checked_out_count = 1 + result = customer.save + result.must_equal true + end + + it "must have 0 or more movies checked out" do + customer = customers(:mike) + + customer.movies_checked_out_count = -1 + result = customer.save + result.must_equal false + + customer.movies_checked_out_count = 0 + result = customer.save + result.must_equal true + + customer.movies_checked_out_count = 1 + result = customer.save + result.must_equal true + end end + end From 78fcf909805896fa021810ee2fe7bcb4e84a0007 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 15:56:21 -0800 Subject: [PATCH 21/76] set up default values --- db/migrate/20181105225342_set_default_value.rb | 8 ++++++++ db/schema.rb | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20181105225342_set_default_value.rb diff --git a/db/migrate/20181105225342_set_default_value.rb b/db/migrate/20181105225342_set_default_value.rb new file mode 100644 index 000000000..4786201ac --- /dev/null +++ b/db/migrate/20181105225342_set_default_value.rb @@ -0,0 +1,8 @@ +class SetDefaultValue < ActiveRecord::Migration[5.2] + def change + change_column :customers, :movies_checked_out_count, :integer, :default => 0 + change_column :movies, :inventory, :integer, :default => 0 + change_column :rentals, :status, :string, :default => "checked out" + + end +end diff --git a/db/schema.rb b/db/schema.rb index 4e4c4f7da..cd6e2d6ad 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: 2018_11_05_223258) do +ActiveRecord::Schema.define(version: 2018_11_05_225342) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -23,7 +23,7 @@ t.string "state" t.string "postal_code" t.string "phone" - t.integer "movies_checked_out_count" + t.integer "movies_checked_out_count", default: 0 t.datetime "created_at", null: false t.datetime "updated_at", null: false end @@ -32,7 +32,7 @@ t.string "title" t.string "overview" t.date "release_date" - t.integer "inventory" + t.integer "inventory", default: 0 t.datetime "created_at", null: false t.datetime "updated_at", null: false end @@ -40,7 +40,7 @@ create_table "rentals", force: :cascade do |t| t.datetime "check_out_date" t.datetime "due_date" - t.string "status" + t.string "status", default: "checked out" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "customer_id" From 3d7c7c2ac6654da02845917b1beca0572f213834 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 16:08:25 -0800 Subject: [PATCH 22/76] updated the movie model test --- app/models/movie.rb | 1 + test/models/movie_test.rb | 44 +++++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index 00280a8e1..87eb43bd3 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -2,4 +2,5 @@ class Movie < ApplicationRecord has_many :rentals validates :title, presence: true + validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 34d1d30a5..4b7cbff40 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,9 +1,45 @@ require "test_helper" describe Movie do - let(:movie) { Movie.new } + describe "validations" do + it "must have a title" do + movie = movies(:taken) - it "must be valid" do - value(movie).must_be :valid? - end + movie.title = nil + result = movie.save + result.must_equal false + + movie.title = "Jane" + result = movie.save + result.must_equal true + end + + it "must have inventory" do + movie = movies(:taken) + + movie.inventory = nil + result = movie.save + result.must_equal false + + movie.inventory = 1 + result = movie.save + result.must_equal true + end + + it "must have 0 or more inventory" do + movie = movies(:taken) + + movie.inventory = -1 + result = movie.save + result.must_equal false + + movie.inventory = 0 + result = movie.save + result.must_equal true + + movie.inventory = 1 + result = movie.save + result.must_equal true + end + end end From 7ad8bb19b0af5871615937af6a78efbb89168927 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 16:21:04 -0800 Subject: [PATCH 23/76] added customers API call and index method and tests for controller --- app/controllers/customers_controller.rb | 5 ++ test/controllers/customers_controller_test.rb | 53 +++++++++++++++++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index ca3b6e024..b52aa8036 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,2 +1,7 @@ class CustomersController < ApplicationController + def index + customers = Customer.all.order(:name) + + render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count] ), status: :ok + end end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 5e123f6cd..232846324 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -1,7 +1,54 @@ require "test_helper" describe CustomersController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "index" do + it "is a real working route and returns JSON" do + # Act + get customers_path + + # Assert + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :success + end + + it "returns an Array" do + # Act + get customers_path + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body).must_be_kind_of Array + end + + it "returns all of the customers" do + # Act + get customers_path + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body.length).must_equal Customer.count + end + + it "returns customers with exactly the required fields" do + keys = %w(id name registered_at postal_code phone movies_checked_out_count) + + # Act + get customers_path + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert that each + body.each do |customer| + expect(customer.keys).must_equal keys + expect(customer.keys.length).must_equal keys.length + end + end + + end + end From 08210b0009f0faf7e037241aefc85a36a3ab3aa3 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 16:59:29 -0800 Subject: [PATCH 24/76] added test for movie index action --- app/controllers/movies_controller.rb | 12 ++++- test/controllers/customers_controller_test.rb | 1 + test/controllers/movies_controller_test.rb | 50 +++++++++++++++++-- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d4aa260b8..1aca95a2d 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,6 +1,16 @@ class MoviesController < ApplicationController def zomg - render json:{ ok: true, message: 'it works!'}, status: :ok + render json:{ ok: true, message: 'it works!'}, status: :ok end + + def index + + # will not have a view to use instance vaiable @pets, so new just use pets + movies = Movie.all + + render json: movies.as_json( only: [:id, :title, :release_date]), status: :ok + end + + end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 5e123f6cd..f3aa1021c 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -4,4 +4,5 @@ # it "must be a real test" do # flunk "Need real tests" # end + end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 67fabbcfb..c82885e9b 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,7 +1,51 @@ require "test_helper" describe MoviesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + it "is a real working route and returns JSON" do + # Act + get movies_path + + # Assert + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :success + end + + it "returns an Array" do + # Act + get movies_path + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body).must_be_kind_of Array +end + +it "returns all of the movies" do + # Act + get movies_path + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body.length).must_equal Movie.count +end + +it "returns moviess with exactly the required fields" do + keys = %w(id title release_date) + + # Act + get movies_path + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert that each + body.each do |movie| + expect(movie.keys).must_equal keys + expect(movie.keys.length).must_equal keys.length + end + end end From c672b430493185fac1246674ae577c217d5b6cc8 Mon Sep 17 00:00:00 2001 From: Jane Date: Mon, 5 Nov 2018 17:04:44 -0800 Subject: [PATCH 25/76] added movie create and tests --- app/controllers/movies_controller.rb | 18 +++++++- test/controllers/movies_controller_test.rb | 50 +++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d4aa260b8..1f4a65599 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,6 +1,22 @@ class MoviesController < ApplicationController def zomg - render json:{ ok: true, message: 'it works!'}, status: :ok + render json:{ ok: true, message: 'it works!'}, status: :ok + end + + def create + movie = Movie.new(movie_params) + + if movie.save + render json: { ok: true, movie: movie.as_json( except: [:created_at, :updated_at] )}, status: :ok + else + render json: { ok: false, errors: movie.errors.messages}, status: :bad_request + end + end + + private + + def movie_params + 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 67fabbcfb..67680115b 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,7 +1,55 @@ require "test_helper" - +require 'pry' describe MoviesController do # it "must be a real test" do # flunk "Need real tests" # end + + describe "create" do + let(:movie_data) { + { + title: "Jack", + overview: "American comedy-drama film starring Robin Williams and directed by Francis Ford Coppola.", + release_date: "1996-08-09", + inventory: 1 + } + } + + it "returns json" do + post create_movie_path, params: { movie: movie_data } + expect(response.header['Content-Type']).must_include 'json' + end + + it "creates a movie with valid data and returns it's ID" do + expect { + post create_movie_path, params: { movie: movie_data } + }.must_change "Movie.count", 1 + + body = JSON.parse(response.body) + expect(body).must_be_kind_of Hash + expect(body["movie"]).must_include "id" + + movie = Movie.find(body["movie"]["id"].to_i) + + expect(movie.title).must_equal movie_data[:title] + must_respond_with :success + + end + + it "fails to create a movie and returns an error with invalid data" do + movie_data["title"] = nil + + expect { + post create_movie_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 f319b0f9053efda10ba0e9aa1422ecb6bf48929b Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 5 Nov 2018 23:29:40 -0800 Subject: [PATCH 26/76] added test for movie show action --- app/controllers/movies_controller.rb | 15 ++++++++++++++- test/controllers/movies_controller_test.rb | 14 +++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d18244065..2edbbe39a 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -7,6 +7,19 @@ def index render json: movies.as_json( only: [:id, :title, :release_date]), status: :ok end + def show + movie = Movie.find_by(id: params[:id]) + + if movie.nil? + render json: {ok: false, message: 'not found'}, status: :not_found + else + render json: { + ok: true, + pet: movie.as_json(except: [:created_at, :updated_at]) + }, status: :ok + end + end + def zomg render json:{ ok: true, message: 'it works!'}, status: :ok end @@ -22,7 +35,7 @@ def create end private - + def movie_params params.require(:movie).permit(:title, :overview, :release_date, :inventory) end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 177154658..12c462b0f 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -47,7 +47,7 @@ end end - + describe "index" do it "is a real working route and returns JSON" do # Act @@ -96,4 +96,16 @@ end end end + + it "can get a movie" do + get movie_path(movies(:taken).id) + must_respond_with :success + end + + it "responds with a 404 message if no movie is found" do + id = -1 + get movie_path(id) + must_respond_with :not_found + end + end From ed80269f1d6b02b0093e0a6099d6866e141d963d Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 09:12:29 -0800 Subject: [PATCH 27/76] made create pass smoke test --- app/controllers/movies_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d18244065..cd061098d 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -15,16 +15,16 @@ def create movie = Movie.new(movie_params) if movie.save - render json: { ok: true, movie: movie.as_json( except: [:created_at, :updated_at] )}, status: :ok + render json: { id: movie.id }, status: :ok else render json: { ok: false, errors: movie.errors.messages}, status: :bad_request end end private - + def movie_params - params.require(:movie).permit(:title, :overview, :release_date, :inventory) + params.permit(:title, :overview, :release_date, :inventory) end end From d765aef3f65dec63ebc46dae935daccf9bb2badb Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Tue, 6 Nov 2018 10:46:44 -0800 Subject: [PATCH 28/76] updated the show test --- app/controllers/movies_controller.rb | 2 +- test/controllers/movies_controller_test.rb | 31 +++++++++++++++++----- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 2edbbe39a..3fe78092f 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -15,7 +15,7 @@ def show else render json: { ok: true, - pet: movie.as_json(except: [:created_at, :updated_at]) + movie: movie.as_json(except: [:created_at, :updated_at]) }, status: :ok end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 12c462b0f..0a85d22ba 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -81,7 +81,7 @@ end it "returns moviess with exactly the required fields" do - keys = %w(id title release_date) + fields = %w(id release_date title) # Act get movies_path @@ -91,21 +91,40 @@ # Assert that each body.each do |movie| - expect(movie.keys).must_equal keys - expect(movie.keys.length).must_equal keys.length + expect(movie.keys.sort).must_equal fields + expect(movie.keys.length).must_equal fields.length end end end +describe "show" do + it "is a real working route and returns JSON" do + # Act + get movie_path(movies(:taken).id) + + # Assert + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :success + end + + it "can get a movie" do get movie_path(movies(:taken).id) must_respond_with :success - end + end - it "responds with a 404 message if no movie is found" do + it "responds with a 404 message if no movie is found" do id = -1 get movie_path(id) must_respond_with :not_found - end + end + it "reurns movie with the require fields" do + get movie_path(movies(:taken).id) + body = JSON.parse(response.body) + + fields = %w(id inventory overview release_date title) + expect(body["movie"].keys.sort).must_equal fields + end + end end From 9c6febea2721dc25f6ce1bc637efd52716d91111 Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 11:01:42 -0800 Subject: [PATCH 29/76] fixed controller to pass smoke tests and updated controller tests --- app/controllers/movies_controller.rb | 5 +---- test/controllers/movies_controller_test.rb | 14 +++++++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index b2efee870..c58801f5a 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -13,10 +13,7 @@ def show if movie.nil? render json: {ok: false, message: 'not found'}, status: :not_found else - render json: { - ok: true, - movie: movie.as_json(except: [:created_at, :updated_at]) - }, status: :ok + render json: movie.as_json(except: [:created_at, :updated_at]), status: :ok end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 0a85d22ba..eebe8fbca 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,4 +1,5 @@ require "test_helper" +require 'pry' describe MoviesController do describe "create" do @@ -18,18 +19,21 @@ it "creates a movie with valid data and returns it's ID" do expect { - post create_movie_path, params: { movie: movie_data } + post create_movie_path, params: movie_data }.must_change "Movie.count", 1 body = JSON.parse(response.body) expect(body).must_be_kind_of Hash - expect(body["movie"]).must_include "id" - movie = Movie.find(body["movie"]["id"].to_i) + expect(body).must_include "id" + + movie = Movie.find(body["id"]) expect(movie.title).must_equal movie_data[:title] - must_respond_with :success + expect(movie.overview).must_equal movie_data[:overview] + expect(movie.inventory).must_equal movie_data[:inventory] + must_respond_with :success end it "fails to create a movie and returns an error with invalid data" do @@ -124,7 +128,7 @@ body = JSON.parse(response.body) fields = %w(id inventory overview release_date title) - expect(body["movie"].keys.sort).must_equal fields + expect(body.keys.sort).must_equal fields end end end From 508fcfc7cda00bbbd9e08ca4cc88ecc73e3f930f Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 12:56:00 -0800 Subject: [PATCH 30/76] added check_in method to rentals controller --- app/controllers/rentals_controller.rb | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 58c72b791..5706fa94e 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,2 +1,43 @@ class RentalsController < ApplicationController + def check_in + movie = Movie.find_by(id: params[:movie_id]) + customer = Customer.find_by(id: params[:customer_id]) + current_rental = nil + + customer.rentals.each do |rental| + if rental.movie == movie && rental.customer == customer && rental.status == "checked out" + current_rental = rental + break + end + end + + if movie.nil? + nil_response(movie, "movie") + elsif customer.nil? + nil_response(customer, "customer") + elsif current_rental.nil? + nil_response(current_rental, "rental agreement") + else + render json: {ok: true, message: "Movie successfully returned"}, status: :ok + current_rental.update(status: "returned") + checked_out_count = customer.movies_checked_out_count - 1 + customer.update(movies_checked_out_count: checked_out_count) + updated_inventory = movie.inventory + 1 + movie.update(inventory: updated_inventory) + end + + end + + private + + def check_in_params + params.permit(:customer_id, :movie_id) + end + + def nil_response(object, name) + if object.nil? + render json: {ok: false, message: "The #{name} for this rental was not found"}, status: :not_found + end + end + end From da10c2da852165c5cc3f663f9a5a6da3d65b1e23 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Tue, 6 Nov 2018 13:18:33 -0800 Subject: [PATCH 31/76] added the rantal checkout method --- app/controllers/rentals_controller.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 58c72b791..7cf30a8c2 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,2 +1,21 @@ class RentalsController < ApplicationController + + def check_out + + rental = Rental.new + + rental.customer = Customer.find_by(id: params[:customer_id]) + rental.movie = Movie.find_by(id: params[:movie_id]) + rental.check_out_date = Date.today + + rental.due_date = rental.check_out_date + 7 + rental.customer.movies_checked_out_count += 1 + rental.movie.inventory -= 1 + + if rental.save + render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok + else + render json: { ok: false, errors: rental.errors.messages}, status: :bad_request + end + end end From 15face8ee640b833cad5d395c30d0afd1162b9b5 Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 13:25:13 -0800 Subject: [PATCH 32/76] resolved conflict --- app/controllers/rentals_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index f2375e21f..6f525e8be 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -19,6 +19,6 @@ def check_out end end - + end From 65f19e2d0c2d43748905f45a4ba2b8498d9b1e65 Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 13:27:00 -0800 Subject: [PATCH 33/76] conflict --- app/controllers/rentals_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 6f525e8be..591600f9f 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -20,5 +20,4 @@ def check_out end - end From c9e21332ac404edeeb850a7905cef26889554fbe Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 13:28:00 -0800 Subject: [PATCH 34/76] readded Jane's check_in method --- app/controllers/rentals_controller.rb | 40 +++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 591600f9f..795ea43b1 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -19,5 +19,45 @@ def check_out end end + def check_in + movie = Movie.find_by(id: params[:movie_id]) + customer = Customer.find_by(id: params[:customer_id]) + current_rental = nil + customer.rentals.each do |rental| + if rental.movie == movie && rental.customer == customer && rental.status == "checked out" + current_rental = rental + break + end + end + + if movie.nil? + nil_response(movie, "movie") + elsif customer.nil? + nil_response(customer, "customer") + elsif current_rental.nil? + nil_response(current_rental, "rental agreement") + else + render json: {ok: true, message: "Movie successfully returned"}, status: :ok + current_rental.update(status: "returned") + checked_out_count = customer.movies_checked_out_count - 1 + customer.update(movies_checked_out_count: checked_out_count) + updated_inventory = movie.inventory + 1 + movie.update(inventory: updated_inventory) + end + + end + + private + + def check_in_params + params.permit(:customer_id, :movie_id) + end + + def nil_response(object, name) + if object.nil? + render json: {ok: false, message: "The #{name} for this rental was not found"}, status: :not_found + end + end + end From cd3eb06ee96fbb8ba1cd3909544d2fd2c0f2e242 Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 13:52:04 -0800 Subject: [PATCH 35/76] added available inventory column and updated seeds --- ...1106213346_rename_inventory_column_to_pass_smoke_tests.rb | 5 +++++ db/schema.rb | 3 ++- db/seeds.rb | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20181106213346_rename_inventory_column_to_pass_smoke_tests.rb diff --git a/db/migrate/20181106213346_rename_inventory_column_to_pass_smoke_tests.rb b/db/migrate/20181106213346_rename_inventory_column_to_pass_smoke_tests.rb new file mode 100644 index 000000000..a2cac8f0c --- /dev/null +++ b/db/migrate/20181106213346_rename_inventory_column_to_pass_smoke_tests.rb @@ -0,0 +1,5 @@ +class RenameInventoryColumnToPassSmokeTests < 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 cd6e2d6ad..b9a1c195c 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: 2018_11_05_225342) do +ActiveRecord::Schema.define(version: 2018_11_06_213346) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -35,6 +35,7 @@ t.integer "inventory", default: 0 t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "available_inventory" end create_table "rentals", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index 5322340ba..9fd3eb2b4 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -3,5 +3,7 @@ end JSON.parse(File.read('db/seeds/movies.json')).each do |movie| - Movie.create!(movie) + movie = Movie.new(movie) + movie.available_inventory = movie.inventory + movie.save end From 935aa2ea4e8e76b200e33308b7674e94417afe11 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Tue, 6 Nov 2018 13:56:57 -0800 Subject: [PATCH 36/76] udpated the available inventory column for movie --- app/controllers/movies_controller.rb | 1 + app/models/movie.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index c58801f5a..7f3804e31 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -23,6 +23,7 @@ def zomg def create movie = Movie.new(movie_params) + movie.available_inventory = movie.inventory if movie.save render json: { id: movie.id }, status: :ok diff --git a/app/models/movie.rb b/app/models/movie.rb index 87eb43bd3..c78f9b304 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -3,4 +3,5 @@ class Movie < ApplicationRecord validates :title, presence: true validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } + validates :available_inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } end From 0a25d686f32b266feb9615543fffffbed3679583 Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 13:58:55 -0800 Subject: [PATCH 37/76] updated tests and methods to use available_inventory --- app/controllers/rentals_controller.rb | 8 +++--- test/controllers/movies_controller_test.rb | 6 +++-- test/fixtures/movies.yml | 3 +++ test/models/movie_test.rb | 31 +++++++++++++++++++++- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 795ea43b1..10821db72 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -10,7 +10,7 @@ def check_out rental.due_date = rental.check_out_date + 7 rental.customer.movies_checked_out_count += 1 - rental.movie.inventory -= 1 + rental.movie.available_inventory -= 1 if rental.save render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok @@ -42,8 +42,8 @@ def check_in current_rental.update(status: "returned") checked_out_count = customer.movies_checked_out_count - 1 customer.update(movies_checked_out_count: checked_out_count) - updated_inventory = movie.inventory + 1 - movie.update(inventory: updated_inventory) + updated_available_inventory = movie.available_inventory + 1 + movie.update(available_inventory: updated_available_inventory) end end @@ -59,5 +59,5 @@ def nil_response(object, name) render json: {ok: false, message: "The #{name} for this rental was not found"}, status: :not_found end end - + end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index eebe8fbca..a4e62482a 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -8,7 +8,8 @@ title: "Jack", overview: "American comedy-drama film starring Robin Williams and directed by Francis Ford Coppola.", release_date: "1996-08-09", - inventory: 1 + inventory: 1, + available_inventory: 1 } } @@ -32,6 +33,7 @@ expect(movie.title).must_equal movie_data[:title] expect(movie.overview).must_equal movie_data[:overview] expect(movie.inventory).must_equal movie_data[:inventory] + expect(movie.available_inventory).must_equal movie_data[:available_inventory] must_respond_with :success end @@ -127,7 +129,7 @@ get movie_path(movies(:taken).id) body = JSON.parse(response.body) - fields = %w(id inventory overview release_date title) + fields = %w(available_inventory id inventory overview release_date title) expect(body.keys.sort).must_equal fields end end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index e29d8d1a2..e109eba3f 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -5,6 +5,7 @@ taken: overview: action release_date: 2018-10-05 inventory: 1 + available_inventory: 1 ring: @@ -12,9 +13,11 @@ ring: overview: thrill release_date: 2018-11-05 inventory: 1 + available_inventory: 1 titanic: title: Titanic overview: masterpiece release_date: 1997-11-05 inventory: 5 + available_inventory: 1 diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 4b7cbff40..65b4a8beb 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -41,5 +41,34 @@ result = movie.save result.must_equal true end - end + + it "must have an available inventory" do + movie = movies(:taken) + + movie.available_inventory = nil + result = movie.save + result.must_equal false + + movie.available_inventory = 1 + result = movie.save + result.must_equal true + end + + it "must have 0 or more inventory" do + movie = movies(:taken) + + movie.available_inventory = -1 + result = movie.save + result.must_equal false + + movie.available_inventory = 0 + result = movie.save + result.must_equal true + + movie.available_inventory = 1 + result = movie.save + result.must_equal true + end + + end end From 12aaeb2c0e7df96113c78252a777fda27bd2d1c8 Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 15:13:50 -0800 Subject: [PATCH 38/76] added optional sort and pagination fields to customers --- Gemfile | 2 ++ Gemfile.lock | 2 ++ app/controllers/customers_controller.rb | 25 +++++++++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 1d10e5eb5..25531ebfe 100644 --- a/Gemfile +++ b/Gemfile @@ -52,3 +52,5 @@ group :test do gem 'minitest-rails' gem 'minitest-reporters' end + +gem 'will_paginate', '~> 3.1.0' diff --git a/Gemfile.lock b/Gemfile.lock index e810c083c..d7f50b823 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -144,6 +144,7 @@ GEM websocket-driver (0.7.0) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.3) + will_paginate (3.1.6) PLATFORMS ruby @@ -161,6 +162,7 @@ DEPENDENCIES spring spring-watcher-listen (~> 2.0.0) tzinfo-data + will_paginate (~> 3.1.0) RUBY VERSION ruby 2.4.1p111 diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index b52aa8036..ef77517c4 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,7 +1,28 @@ class CustomersController < ApplicationController + + VALID_FIELDS = ["name", "registered_at", "postal_code" ] + def index - customers = Customer.all.order(:name) + if cust_params["sort"] && cust_params["p"] && cust_params["n"] #paginate and sort + customers = Customer.paginate(:page => cust_params["p"], :per_page => cust_params["n"]).order(cust_params["sort"]) if VALID_FIELDS.include? cust_params["sort"] + elsif cust_params["p"] && cust_params["n"] # paginate only + customers = Customer.paginate(:page => cust_params["p"], :per_page => cust_params["n"]) + elsif cust_params["sort"] # sort only + customers = Customer.all.order(cust_params["sort"]) if VALID_FIELDS.include? cust_params["sort"] + else # neither + customers = Customer.all + end + + if customers + render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count] ), status: :ok + else + render json: {ok: false, message: 'not found'}, status: :not_found + end + end + + private - render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count] ), status: :ok + def cust_params + params.permit(:sort, :n, :p) end end From 80d693841f46838313e251d9b5e52c5b3f6dad5d Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Tue, 6 Nov 2018 15:35:28 -0800 Subject: [PATCH 39/76] udpated checkout action --- app/controllers/rentals_controller.rb | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 10821db72..add565767 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,18 +1,30 @@ class RentalsController < ApplicationController + def check_out - rental = Rental.new + customer = Customer.find_by(id: params[:customer_id]) + if customer.nil? + render json: {ok: false, message: "The #{name} for this customer was not found"}, status: :not_found + end - rental.customer = Customer.find_by(id: params[:customer_id]) - rental.movie = Movie.find_by(id: params[:movie_id]) - rental.check_out_date = Date.today + movie = Movie.find_by(id: params[:movie_id]) + if customer.nil? + render json: {ok: false, message: "The #{name} for this movie was not found"}, status: :not_found + end + rental = Rental.new + rental.customer = customer + rental.movie = movie + rental.check_out_date = Date.today rental.due_date = rental.check_out_date + 7 - rental.customer.movies_checked_out_count += 1 - rental.movie.available_inventory -= 1 if rental.save + updated_movie = rental.customer.movies_checked_out_count += 1 + updated_inventory = rental.movie.available_inventory - 1 + rental.movie.update(available_inventory: updated_inventory) + rental.customer.update(movies_checked_out_count: updated_movie) + render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok else render json: { ok: false, errors: rental.errors.messages}, status: :bad_request @@ -60,4 +72,5 @@ def nil_response(object, name) end end + end From 94691c0bf3368b29d012ec69015968ed5f6fb520 Mon Sep 17 00:00:00 2001 From: Jane Date: Tue, 6 Nov 2018 16:12:10 -0800 Subject: [PATCH 40/76] added rental seed data --- db/seeds.rb | 21 ++++++++++++++++++--- db/seeds/rentals.json | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 db/seeds/rentals.json diff --git a/db/seeds.rb b/db/seeds.rb index 9fd3eb2b4..62ebe830c 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -3,7 +3,22 @@ end JSON.parse(File.read('db/seeds/movies.json')).each do |movie| - movie = Movie.new(movie) - movie.available_inventory = movie.inventory - movie.save + new_movie = Movie.new(movie) + new_movie.available_inventory = new_movie.inventory + new_movie.save +end + +JSON.parse(File.read('db/seeds/rentals.json')).each do |rental| + new_rental = Rental.new(rental) + customer = Customer.all.sample + movie = Movie.all.sample + new_rental.customer = customer + new_rental.movie = movie + + update_checked_out_count = customer.movies_checked_out_count + 1 + customer.update(movies_checked_out_count: update_checked_out_count) + update_available_inventory = movie.available_inventory - 1 + movie.update(available_inventory: update_available_inventory) + + new_rental.save end diff --git a/db/seeds/rentals.json b/db/seeds/rentals.json new file mode 100644 index 000000000..6abde63a4 --- /dev/null +++ b/db/seeds/rentals.json @@ -0,0 +1,38 @@ +[ +{ +"check_out_date": "Tue, 28 Apr 2015 07:54:14 -0700", +"due_date": "Wed, 29 Apr 2015 07:54:14 -0700", +"customer_id": 0, +"movie_id": 0 +}, +{ +"check_out_date": "Tue, 28 Apr 2015 07:54:14 -0700", +"due_date": "Wed, 29 Apr 2015 07:54:14 -0700", +"customer_id": 0, +"movie_id": 0 +}, +{ +"check_out_date": "Tue, 28 Apr 2015 07:54:14 -0700", +"due_date": "Wed, 29 Apr 2015 07:54:14 -0700", +"customer_id": 0, +"movie_id": 0 +}, +{ +"check_out_date": "Tue, 28 Apr 2015 07:54:14 -0700", +"due_date": "Wed, 29 Apr 2015 07:54:14 -0700", +"customer_id": 0, +"movie_id": 0 +}, +{ +"check_out_date": "Tue, 28 Apr 2015 07:54:14 -0700", +"due_date": "Thu, 06 Dec 2018 15:54:48 -0800", +"customer_id": 0, +"movie_id": 0 +}, +{ +"check_out_date": "Tue, 06 Nov 2018 07:54:14 -0700", +"due_date": "Thu, 06 Dec 2018 15:54:48 -0800", +"customer_id": 0, +"movie_id": 0 +} +] From b2374e36d40d0bc3ef79c337d1ad841b66ea1ae1 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Wed, 7 Nov 2018 08:40:42 -0800 Subject: [PATCH 41/76] added sort and paginate to movie controller --- app/controllers/movies_controller.rb | 33 ++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 7f3804e31..54f1c8314 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,10 +1,17 @@ class MoviesController < ApplicationController def index - # will not have a view to use instance vaiable @pets, so new just use pets - movies = Movie.all + if sort? + movies = paginate_check.order(movie_params["sort"]) + else + movies = paginate_check + end - render json: movies.as_json( only: [:id, :title, :release_date]), status: :ok + if movies + render json: movies.as_json( only: [:id, :title, :release_date]), status: :ok + else + render json: {ok: false, message: 'not found'}, status: :not_found + end end def show @@ -34,8 +41,26 @@ def create private + def paginate_check + if movie_params["p"] && movie_params["n"] + return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) + else + return Movie.all + end + end + + def sort? + valid_fields = ["title" ,"release_date"] + if valid_fields.include? (movie_params["sort"]) + return true + else + return false + end + end + def movie_params - params.permit(:title, :overview, :release_date, :inventory) + params.permit(:title, :overview, :release_date, :inventory, :sort, :n, :p) end + end From f3843549c7cac28ebb282ca5e431a04db0c24ee5 Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 09:27:44 -0800 Subject: [PATCH 42/76] almost completed overdue method. Pulling in Jesse's changes to implement in method --- app/controllers/rentals_controller.rb | 16 +++++++++++++++- config/routes.rb | 3 ++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index add565767..e32249416 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,6 +1,6 @@ +require "pry" class RentalsController < ApplicationController - def check_out customer = Customer.find_by(id: params[:customer_id]) @@ -60,6 +60,20 @@ def check_in end + def overdue + #In Progress + # today = Date.today + # overdue_rentals = Rental.where("due_date < ?", today).order("due_date") #due_date + # overdue_rentals = Rental.where("due_date < ?", today).order("checkout_date") #checkout_date + # overdue_rentals = Rental.joins(:movie).where("due_date < ?", today).order("movies.title") #title + # overdue_rentals = Rental.joins(:customer).where("due_date < ?", today).order("customers.name") #name + # + # render :json => overdue_rentals, + # :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, + # :except => [:created_at, :updated_at] #works + + end + private def check_in_params diff --git a/config/routes.rb b/config/routes.rb index 6c97da498..097babaf1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,7 +7,8 @@ post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" post "/rentals/check-in", to: "rentals#check_in", as: "check_in_movie" - + get "/rentals/overdue", to: "rentals#overdue", as: "overdue" + get "/customers", to: "customers#index", as: "customers" get "/zomg", to: "movies#zomg", as: "zomg" From a58808133ff758bc2180bed0193c60f3fab92103 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Wed, 7 Nov 2018 09:37:08 -0800 Subject: [PATCH 43/76] move check sort method to model --- app/controllers/customers_controller.rb | 24 ++++++++++++++---------- app/controllers/movies_controller.rb | 11 +---------- app/models/customer.rb | 9 +++++++++ app/models/movie.rb | 10 ++++++++++ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index ef77517c4..2a0f3f86d 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,18 +1,14 @@ class CustomersController < ApplicationController - VALID_FIELDS = ["name", "registered_at", "postal_code" ] - def index - if cust_params["sort"] && cust_params["p"] && cust_params["n"] #paginate and sort - customers = Customer.paginate(:page => cust_params["p"], :per_page => cust_params["n"]).order(cust_params["sort"]) if VALID_FIELDS.include? cust_params["sort"] - elsif cust_params["p"] && cust_params["n"] # paginate only - customers = Customer.paginate(:page => cust_params["p"], :per_page => cust_params["n"]) - elsif cust_params["sort"] # sort only - customers = Customer.all.order(cust_params["sort"]) if VALID_FIELDS.include? cust_params["sort"] - else # neither - customers = Customer.all + + if Customer.sort?(cust_params["sort"]) + customers = paginate_check.order(cust_params["sort"]) + else + customers = paginate_check end + if customers render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count] ), status: :ok else @@ -22,6 +18,14 @@ def index private + def paginate_check + if cust_params["p"] && cust_params["n"] + return Customer.paginate(:page => cust_params["p"], :per_page => cust_params["n"]) + else + return Customer.all + end + end + def cust_params params.permit(:sort, :n, :p) end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 54f1c8314..f456c273d 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,7 +1,7 @@ class MoviesController < ApplicationController def index - if sort? + if Movie.sort?(movie_params["sort"]) movies = paginate_check.order(movie_params["sort"]) else movies = paginate_check @@ -49,15 +49,6 @@ def paginate_check end end - def sort? - valid_fields = ["title" ,"release_date"] - if valid_fields.include? (movie_params["sort"]) - return true - else - return false - end - end - def movie_params params.permit(:title, :overview, :release_date, :inventory, :sort, :n, :p) end diff --git a/app/models/customer.rb b/app/models/customer.rb index 848305651..977408b9c 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -5,4 +5,13 @@ class Customer < ApplicationRecord validates :movies_checked_out_count, presence: true, numericality: { greater_than_or_equal_to: 0 } + def self.sort?(input) + valid_fields = ["name", "registered_at", "postal_code" ] + if valid_fields.include? (input) + return true + else + return false + end + end + end diff --git a/app/models/movie.rb b/app/models/movie.rb index c78f9b304..316ccbc70 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -4,4 +4,14 @@ class Movie < ApplicationRecord validates :title, presence: true validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :available_inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } + + def self.sort?(input) + valid_fields = ["title" ,"release_date"] + if valid_fields.include? (input) + return true + else + return false + end + end + end From f088dc7acd034a3fbef5679c18ba1aecbda3486a Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 10:27:42 -0800 Subject: [PATCH 44/76] added more rental seed data --- app/controllers/rentals_controller.rb | 44 +++++++++++++++++---------- db/seeds.rb | 11 ++++--- db/seeds/rentals.json | 14 +++++++++ 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index e32249416..888b219dc 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -2,16 +2,8 @@ class RentalsController < ApplicationController def check_out - customer = Customer.find_by(id: params[:customer_id]) - if customer.nil? - render json: {ok: false, message: "The #{name} for this customer was not found"}, status: :not_found - end - movie = Movie.find_by(id: params[:movie_id]) - if customer.nil? - render json: {ok: false, message: "The #{name} for this movie was not found"}, status: :not_found - end rental = Rental.new rental.customer = customer @@ -27,11 +19,13 @@ def check_out render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok else + nil_response(customer, "customer") + nil_response(movie, "movie") render json: { ok: false, errors: rental.errors.messages}, status: :bad_request end end - def check_in + def check_in(movie_id, customer_id) movie = Movie.find_by(id: params[:movie_id]) customer = Customer.find_by(id: params[:customer_id]) current_rental = nil @@ -43,11 +37,9 @@ def check_in end end - if movie.nil? + if movie.nil? || customer.nil? || current_rental.nil? nil_response(movie, "movie") - elsif customer.nil? nil_response(customer, "customer") - elsif current_rental.nil? nil_response(current_rental, "rental agreement") else render json: {ok: true, message: "Movie successfully returned"}, status: :ok @@ -62,15 +54,17 @@ def check_in def overdue #In Progress - # today = Date.today + today = Date.today + + overdue_rentals = Rental.where("status = 'checked out'") + overdue_rentals = overdue_rentals.where("due_date < ?", today) + # overdue_rentals = Rental.where("due_date < ?", today).order("due_date") #due_date # overdue_rentals = Rental.where("due_date < ?", today).order("checkout_date") #checkout_date # overdue_rentals = Rental.joins(:movie).where("due_date < ?", today).order("movies.title") #title # overdue_rentals = Rental.joins(:customer).where("due_date < ?", today).order("customers.name") #name # - # render :json => overdue_rentals, - # :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, - # :except => [:created_at, :updated_at] #works + render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at] #works end @@ -83,6 +77,24 @@ def check_in_params def nil_response(object, name) if object.nil? render json: {ok: false, message: "The #{name} for this rental was not found"}, status: :not_found + return + end + end + + def paginate_check + if movie_params["p"] && movie_params["n"] + return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) + else + return Movie.all + end + end + + def sort? + valid_fields = ["title" ,"release_date"] + if valid_fields.include? (movie_params["sort"]) + return true + else + return false end end diff --git a/db/seeds.rb b/db/seeds.rb index 62ebe830c..e75caddef 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -15,10 +15,11 @@ new_rental.customer = customer new_rental.movie = movie - update_checked_out_count = customer.movies_checked_out_count + 1 - customer.update(movies_checked_out_count: update_checked_out_count) - update_available_inventory = movie.available_inventory - 1 - movie.update(available_inventory: update_available_inventory) - + if new_rental.status != "returned" + update_checked_out_count = customer.movies_checked_out_count + 1 + customer.update(movies_checked_out_count: update_checked_out_count) + update_available_inventory = movie.available_inventory - 1 + movie.update(available_inventory: update_available_inventory) + end new_rental.save end diff --git a/db/seeds/rentals.json b/db/seeds/rentals.json index 6abde63a4..1459abd7e 100644 --- a/db/seeds/rentals.json +++ b/db/seeds/rentals.json @@ -34,5 +34,19 @@ "due_date": "Thu, 06 Dec 2018 15:54:48 -0800", "customer_id": 0, "movie_id": 0 +}, +{ +"check_out_date": "Tue, 28 Apr 2015 07:54:14 -0700", +"due_date": "Wed, 29 Apr 2015 07:54:14 -0700", +"customer_id": 0, +"movie_id": 0, +"status": "returned" +}, +{ +"check_out_date": "Tue, 06 Nov 2018 07:54:14 -0700", +"due_date": "Thu, 06 Dec 2018 15:54:48 -0800", +"customer_id": 0, +"movie_id": 0, +"status": "returned" } ] From e9692a833a1e0aa7fca62dbc7533071323e141ac Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Wed, 7 Nov 2018 10:29:26 -0800 Subject: [PATCH 45/76] added controller action for listing customers of a movie --- app/controllers/movies_controller.rb | 34 +++++++++++++++++++++++----- app/models/movie.rb | 1 + config/routes.rb | 4 +++- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index f456c273d..4917e1a1d 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,4 +1,5 @@ class MoviesController < ApplicationController + before_action :find_movie, only: [:show, :current, :history] def index if Movie.sort?(movie_params["sort"]) @@ -15,13 +16,13 @@ def index end def show - movie = Movie.find_by(id: params[:id]) - - if movie.nil? - render json: {ok: false, message: 'not found'}, status: :not_found - else + # movie = Movie.find_by(id: params[:id]) + # + # if movie.nil? + # render json: {ok: false, message: 'not found'}, status: :not_found + # else render json: movie.as_json(except: [:created_at, :updated_at]), status: :ok - end + # end end def zomg @@ -39,8 +40,29 @@ def create end end + + def current + + current_customers = movie.customers + + + end + + def history + + + + end + private + def find_movie + movie = Movie.find(id: params[:id]) + if movie.nil? + render json: {ok: false, message: 'not found'}, status: :not_found + end + end + def paginate_check if movie_params["p"] && movie_params["n"] return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) diff --git a/app/models/movie.rb b/app/models/movie.rb index 316ccbc70..32b13b4c1 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,5 +1,6 @@ class Movie < ApplicationRecord has_many :rentals + has_many :customers, through: :rentals validates :title, presence: true validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } diff --git a/config/routes.rb b/config/routes.rb index 097babaf1..c618e524f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,11 +4,13 @@ get "/movies", to: "movies#index", as: "movies" post "/movies", to: "movies#create", as: "create_movie" get "/movies/:id", to: "movies#show", as: "movie" + get "/movies/:id/current", to: "movies#current", as: "current_customers" + get "/movies/:id/history", to: "movies#history", as: "history_customers" post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" post "/rentals/check-in", to: "rentals#check_in", as: "check_in_movie" get "/rentals/overdue", to: "rentals#overdue", as: "overdue" - + get "/customers", to: "customers#index", as: "customers" get "/zomg", to: "movies#zomg", as: "zomg" From 0453f4f40de332c0d71635b6d42f10e3390d31a6 Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 11:05:32 -0800 Subject: [PATCH 46/76] moved some check-in and check-out logic to the Rental model --- app/controllers/rentals_controller.rb | 43 ++++----------------------- app/models/rental.rb | 15 ++++++++++ 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 888b219dc..95cbc8fc4 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,15 +1,8 @@ -require "pry" class RentalsController < ApplicationController def check_out - customer = Customer.find_by(id: params[:customer_id]) - movie = Movie.find_by(id: params[:movie_id]) - rental = Rental.new - rental.customer = customer - rental.movie = movie - rental.check_out_date = Date.today - rental.due_date = rental.check_out_date + 7 + rental = Rental.check_out(params[:customer_id], params[:movie_id]) if rental.save updated_movie = rental.customer.movies_checked_out_count += 1 @@ -19,35 +12,18 @@ def check_out render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok else - nil_response(customer, "customer") - nil_response(movie, "movie") render json: { ok: false, errors: rental.errors.messages}, status: :bad_request end end - def check_in(movie_id, customer_id) - movie = Movie.find_by(id: params[:movie_id]) - customer = Customer.find_by(id: params[:customer_id]) - current_rental = nil + def check_in + current_rental = Rental.find_by(movie_id: params[:movie_id], customer_id: params[:customer_id], status: "checked out") - customer.rentals.each do |rental| - if rental.movie == movie && rental.customer == customer && rental.status == "checked out" - current_rental = rental - break - end - end - - if movie.nil? || customer.nil? || current_rental.nil? - nil_response(movie, "movie") - nil_response(customer, "customer") - nil_response(current_rental, "rental agreement") + if current_rental.nil? + render json: {ok: false, message: "Your rental was not found"}, status: :not_found else + current_rental.check_in render json: {ok: true, message: "Movie successfully returned"}, status: :ok - current_rental.update(status: "returned") - checked_out_count = customer.movies_checked_out_count - 1 - customer.update(movies_checked_out_count: checked_out_count) - updated_available_inventory = movie.available_inventory + 1 - movie.update(available_inventory: updated_available_inventory) end end @@ -74,13 +50,6 @@ def check_in_params params.permit(:customer_id, :movie_id) end - def nil_response(object, name) - if object.nil? - render json: {ok: false, message: "The #{name} for this rental was not found"}, status: :not_found - return - end - end - def paginate_check if movie_params["p"] && movie_params["n"] return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) diff --git a/app/models/rental.rb b/app/models/rental.rb index 8f3bbd3e7..6ae45a67b 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -8,4 +8,19 @@ class Rental < ApplicationRecord validates :due_date, presence: true validates :status, presence: true, inclusion: { in: STATUSES } + def check_in + checked_out_count = self.customer.movies_checked_out_count - 1 + self.customer.update(movies_checked_out_count: checked_out_count) + updated_available_inventory = self.movie.available_inventory + 1 + self.movie.update(available_inventory: updated_available_inventory) + self.update(status: "returned") + end + + def self.check_out(customer_id, movie_id) + rental = Rental.new(customer_id: customer_id, movie_id: movie_id) + rental.check_out_date = Date.today + rental.due_date = rental.check_out_date + 7 + return rental + end + end From ead5adfc3e8c50a0968fbdf6704f72132da9dc82 Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 11:20:25 -0800 Subject: [PATCH 47/76] added check_in check_out methods to Customer and Movie model to seperate concerns --- app/controllers/rentals_controller.rb | 8 ++------ app/models/customer.rb | 9 +++++++++ app/models/movie.rb | 10 ++++++++++ app/models/rental.rb | 14 ++++++-------- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 95cbc8fc4..44b81810b 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,14 +1,11 @@ class RentalsController < ApplicationController def check_out - rental = Rental.check_out(params[:customer_id], params[:movie_id]) if rental.save - updated_movie = rental.customer.movies_checked_out_count += 1 - updated_inventory = rental.movie.available_inventory - 1 - rental.movie.update(available_inventory: updated_inventory) - rental.customer.update(movies_checked_out_count: updated_movie) + rental.movie.check_out + rental.customer.check_out render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok else @@ -25,7 +22,6 @@ def check_in current_rental.check_in render json: {ok: true, message: "Movie successfully returned"}, status: :ok end - end def overdue diff --git a/app/models/customer.rb b/app/models/customer.rb index 848305651..2593b368b 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -5,4 +5,13 @@ class Customer < ApplicationRecord validates :movies_checked_out_count, presence: true, numericality: { greater_than_or_equal_to: 0 } + def check_out + checked_out_count = self.movies_checked_out_count + 1 + self.update(movies_checked_out_count: checked_out_count) + end + + def check_in + checked_out_count = self.movies_checked_out_count - 1 + self.update(movies_checked_out_count: checked_out_count) + end end diff --git a/app/models/movie.rb b/app/models/movie.rb index c78f9b304..f8155590b 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -4,4 +4,14 @@ class Movie < ApplicationRecord validates :title, presence: true validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :available_inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } + + def check_in + updated_available_inventory = self.available_inventory + 1 + self.update(available_inventory: updated_available_inventory) + end + + def check_out + updated_available_inventory = self.available_inventory - 1 + self.update(available_inventory: updated_available_inventory) + end end diff --git a/app/models/rental.rb b/app/models/rental.rb index 6ae45a67b..e812feae6 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -8,14 +8,6 @@ class Rental < ApplicationRecord validates :due_date, presence: true validates :status, presence: true, inclusion: { in: STATUSES } - def check_in - checked_out_count = self.customer.movies_checked_out_count - 1 - self.customer.update(movies_checked_out_count: checked_out_count) - updated_available_inventory = self.movie.available_inventory + 1 - self.movie.update(available_inventory: updated_available_inventory) - self.update(status: "returned") - end - def self.check_out(customer_id, movie_id) rental = Rental.new(customer_id: customer_id, movie_id: movie_id) rental.check_out_date = Date.today @@ -23,4 +15,10 @@ def self.check_out(customer_id, movie_id) return rental end + def check_in + self.customer.check_in + self.movie.check_in + self.update(status: "returned") + end + end From 7fcbe897ecb78aff0434d996789e4ea7f3c37e1c Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 15:11:12 -0800 Subject: [PATCH 48/76] finished overdue method with error messages for invalid params --- app/controllers/rentals_controller.rb | 56 +++++++++++++++++---------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 44b81810b..60dfec431 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,7 +1,9 @@ +require "pry" + class RentalsController < ApplicationController def check_out - rental = Rental.check_out(params[:customer_id], params[:movie_id]) + rental = Rental.check_out(rental_params[:customer_id], rental_params[:movie_id]) if rental.save rental.movie.check_out @@ -14,7 +16,7 @@ def check_out end def check_in - current_rental = Rental.find_by(movie_id: params[:movie_id], customer_id: params[:customer_id], status: "checked out") + current_rental = Rental.find_by(movie_id: rental_params[:movie_id], customer_id: rental_params[:customer_id], status: "checked out") if current_rental.nil? render json: {ok: false, message: "Your rental was not found"}, status: :not_found @@ -25,38 +27,52 @@ def check_in end def overdue - #In Progress - today = Date.today + overdue_rentals = paginate_check(Rental.where("status = 'checked out' AND due_date < ?", Date.today)) + + if overdue_rentals.class == String + render json: {ok: false, message: "#{overdue_rentals} Please use valid parameters."}, status: :not_found + else - overdue_rentals = Rental.where("status = 'checked out'") - overdue_rentals = overdue_rentals.where("due_date < ?", today) + if sort? + overdue_rentals = overdue_rentals.joins(:movie).order("movies.title") if rental_params["sort"] == "title" + overdue_rentals = overdue_rentals.joins(:customer).order("customers.name") if rental_params["sort"] == "name" + overdue_rentals = overdue_rentals.order(rental_params["sort"]) if rental_params["sort"] == "due_date" || rental_params["sort"] == "checkout_date" + end - # overdue_rentals = Rental.where("due_date < ?", today).order("due_date") #due_date - # overdue_rentals = Rental.where("due_date < ?", today).order("checkout_date") #checkout_date - # overdue_rentals = Rental.joins(:movie).where("due_date < ?", today).order("movies.title") #title - # overdue_rentals = Rental.joins(:customer).where("due_date < ?", today).order("customers.name") #name - # - render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at] #works + if rental_params["sort"] != nil && !(sort?) + render json: {ok: false, message: "Unable to sort with '#{rental_params["sort"]}'. Please use a valid parameter (title ,name, checkout_date, or due_date)"}, status: :not_found + elsif overdue_rentals + if overdue_rentals.length == 0 + render json: {ok: true, message: "There are no overdue rentals!"}, status: :ok + else + render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at], status: :ok + end + end + end end private - def check_in_params - params.permit(:customer_id, :movie_id) + def rental_params + params.permit(:customer_id, :movie_id, :sort, :n, :p) end - def paginate_check - if movie_params["p"] && movie_params["n"] - return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) + def paginate_check(overdue_rentals) + if rental_params["p"].nil? && rental_params["n"].nil? + return overdue_rentals + elsif rental_params["p"].nil? || rental_params["n"].nil? + return "Both p and n must be present and a number to paginate." + elsif (rental_params["p"] !~ /\D/) && (rental_params["n"] !~ /\D/) + return overdue_rentals.paginate(:page => rental_params["p"], :per_page => rental_params["n"]) else - return Movie.all + return "Both p and n must be present and a number to paginate." end end def sort? - valid_fields = ["title" ,"release_date"] - if valid_fields.include? (movie_params["sort"]) + valid_fields = ["title", "name", "checkout_date", "due_date"] + if valid_fields.include? (rental_params["sort"]) return true else return false From 11e15e11309c587b512d2d193a5e9d2f669003d3 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Wed, 7 Nov 2018 15:39:27 -0800 Subject: [PATCH 49/76] current_check_out_customers --- app/controllers/movies_controller.rb | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 4917e1a1d..a55bc09c0 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,3 +1,4 @@ +require "pry" class MoviesController < ApplicationController before_action :find_movie, only: [:show, :current, :history] @@ -21,7 +22,7 @@ def show # if movie.nil? # render json: {ok: false, message: 'not found'}, status: :not_found # else - render json: movie.as_json(except: [:created_at, :updated_at]), status: :ok + render json: @movie.as_json(except: [:created_at, :updated_at]), status: :ok # end end @@ -42,9 +43,19 @@ def create def current +# List customers that have currently checked out a copy of the film - current_customers = movie.customers + current_rentals = @movie.rentals.where("status = 'checked out'") + # binding.pry + current_customers = [] + current_rentals.each do |rental| + + current_customers << rental.customer + end + + render :json => current_customers, :include => {current_rentals => {:only => :check_out_date}},:except => [:created_at, :updated_at] #works + # render :json => current_customers, :except => [:created_at, :updated_at] #works end @@ -57,8 +68,8 @@ def history private def find_movie - movie = Movie.find(id: params[:id]) - if movie.nil? + @movie = Movie.find(params[:id].to_i) + if @movie.nil? render json: {ok: false, message: 'not found'}, status: :not_found end end From 6c3e3f500c2f49e649d4360eca0debda28347a71 Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 20:07:21 -0800 Subject: [PATCH 50/76] added helper methods to clean up code --- app/controllers/rentals_controller.rb | 42 ++++++++++----------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 60dfec431..a89d1f205 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -28,28 +28,15 @@ def check_in def overdue overdue_rentals = paginate_check(Rental.where("status = 'checked out' AND due_date < ?", Date.today)) - + overdue_rentals = sort_check(overdue_rentals) if overdue_rentals.class != String + #if overdue_rentals is a String, that string is an error message if overdue_rentals.class == String - render json: {ok: false, message: "#{overdue_rentals} Please use valid parameters."}, status: :not_found + render json: {ok: false, message: overdue_rentals }, status: :not_found + elsif overdue_rentals.length == 0 + render json: {ok: true, message: "There are no overdue rentals!"}, status: :ok else - - if sort? - overdue_rentals = overdue_rentals.joins(:movie).order("movies.title") if rental_params["sort"] == "title" - overdue_rentals = overdue_rentals.joins(:customer).order("customers.name") if rental_params["sort"] == "name" - overdue_rentals = overdue_rentals.order(rental_params["sort"]) if rental_params["sort"] == "due_date" || rental_params["sort"] == "checkout_date" - end - - if rental_params["sort"] != nil && !(sort?) - render json: {ok: false, message: "Unable to sort with '#{rental_params["sort"]}'. Please use a valid parameter (title ,name, checkout_date, or due_date)"}, status: :not_found - elsif overdue_rentals - if overdue_rentals.length == 0 - render json: {ok: true, message: "There are no overdue rentals!"}, status: :ok - else - render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at], status: :ok - end - end + render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at], status: :ok end - end private @@ -62,22 +49,25 @@ def paginate_check(overdue_rentals) if rental_params["p"].nil? && rental_params["n"].nil? return overdue_rentals elsif rental_params["p"].nil? || rental_params["n"].nil? - return "Both p and n must be present and a number to paginate." + return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." elsif (rental_params["p"] !~ /\D/) && (rental_params["n"] !~ /\D/) return overdue_rentals.paginate(:page => rental_params["p"], :per_page => rental_params["n"]) else - return "Both p and n must be present and a number to paginate." + return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." end end - def sort? + def sort_check(overdue_rentals) valid_fields = ["title", "name", "checkout_date", "due_date"] - if valid_fields.include? (rental_params["sort"]) - return true + if rental_params["sort"].nil? + return overdue_rentals + elsif valid_fields.include? (rental_params["sort"]) + return overdue_rentals.joins(:movie).order("movies.title") if rental_params["sort"] == "title" + return overdue_rentals.joins(:customer).order("customers.name") if rental_params["sort"] == "name" + return overdue_rentals.order(rental_params["sort"]) else - return false + return "Unable to sort with '#{rental_params["sort"]}'. Please resubmit with a valid sort parameter (title ,name, checkout_date, or due_date)" end end - end From aedb8ab1090c972175989aa1424695b211090ec1 Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 20:19:18 -0800 Subject: [PATCH 51/76] moved helper methods to Rental model --- app/controllers/rentals_controller.rb | 31 ++------------------------- app/models/rental.rb | 25 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index a89d1f205..9772b9f96 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,5 +1,3 @@ -require "pry" - class RentalsController < ApplicationController def check_out @@ -27,9 +25,9 @@ def check_in end def overdue - overdue_rentals = paginate_check(Rental.where("status = 'checked out' AND due_date < ?", Date.today)) - overdue_rentals = sort_check(overdue_rentals) if overdue_rentals.class != String + overdue_rentals = Rental.paginate_check(Rental.where("status = 'checked out' AND due_date < ?", Date.today), rental_params["p"], rental_params["n"]) #if overdue_rentals is a String, that string is an error message + overdue_rentals = Rental.sort_check(overdue_rentals, rental_params["sort"]) if overdue_rentals.class != String if overdue_rentals.class == String render json: {ok: false, message: overdue_rentals }, status: :not_found elsif overdue_rentals.length == 0 @@ -45,29 +43,4 @@ def rental_params params.permit(:customer_id, :movie_id, :sort, :n, :p) end - def paginate_check(overdue_rentals) - if rental_params["p"].nil? && rental_params["n"].nil? - return overdue_rentals - elsif rental_params["p"].nil? || rental_params["n"].nil? - return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." - elsif (rental_params["p"] !~ /\D/) && (rental_params["n"] !~ /\D/) - return overdue_rentals.paginate(:page => rental_params["p"], :per_page => rental_params["n"]) - else - return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." - end - end - - def sort_check(overdue_rentals) - valid_fields = ["title", "name", "checkout_date", "due_date"] - if rental_params["sort"].nil? - return overdue_rentals - elsif valid_fields.include? (rental_params["sort"]) - return overdue_rentals.joins(:movie).order("movies.title") if rental_params["sort"] == "title" - return overdue_rentals.joins(:customer).order("customers.name") if rental_params["sort"] == "name" - return overdue_rentals.order(rental_params["sort"]) - else - return "Unable to sort with '#{rental_params["sort"]}'. Please resubmit with a valid sort parameter (title ,name, checkout_date, or due_date)" - end - end - end diff --git a/app/models/rental.rb b/app/models/rental.rb index e812feae6..80afdc493 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -21,4 +21,29 @@ def check_in self.update(status: "returned") end + def self.paginate_check(overdue_rentals, params_p, params_n) + if params_p.nil? && params_n.nil? + return overdue_rentals + elsif params_p.nil? || params_n.nil? + return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + elsif (params_p !~ /\D/) && (params_n !~ /\D/) + return overdue_rentals.paginate(:page => params_p, :per_page => params_n) + else + return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + end + end + + def self.sort_check(overdue_rentals, params_sort) + valid_fields = ["title", "name", "checkout_date", "due_date"] + if params_sort.nil? + return overdue_rentals + elsif valid_fields.include? (params_sort) + return overdue_rentals.joins(:movie).order("movies.title") if params_sort == "title" + return overdue_rentals.joins(:customer).order("customers.name") if params_sort == "name" + return overdue_rentals.order(params_sort) + else + return "Unable to sort with '#{params_sort}'. Please resubmit with a valid sort parameter (title ,name, checkout_date, or due_date)" + end + end + end From 7696d6b0122e4c60ed1cff078f1ebd1dc308330e Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 20:22:02 -0800 Subject: [PATCH 52/76] moved a comment down one line --- app/controllers/rentals_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 9772b9f96..6a661b2ad 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -26,9 +26,10 @@ def check_in def overdue overdue_rentals = Rental.paginate_check(Rental.where("status = 'checked out' AND due_date < ?", Date.today), rental_params["p"], rental_params["n"]) - #if overdue_rentals is a String, that string is an error message + overdue_rentals = Rental.sort_check(overdue_rentals, rental_params["sort"]) if overdue_rentals.class != String - if overdue_rentals.class == String + + if overdue_rentals.class == String #if overdue_rentals is a String, that string is an error message render json: {ok: false, message: overdue_rentals }, status: :not_found elsif overdue_rentals.length == 0 render json: {ok: true, message: "There are no overdue rentals!"}, status: :ok From 83abe540223706da3f78331a5667895ebf633cc8 Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 20:24:32 -0800 Subject: [PATCH 53/76] deleted an empty line --- app/controllers/customers_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 2a0f3f86d..1fed4745d 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -8,7 +8,6 @@ def index customers = paginate_check end - if customers render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count] ), status: :ok else From 36aeb19316996d48305f93ea564d80681b62dfbf Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 21:57:06 -0800 Subject: [PATCH 54/76] added current method to customers to list the movies a customer currently has checked out --- app/controllers/customers_controller.rb | 21 ++++++++++++++++++++- app/models/customer.rb | 4 ++-- app/models/rental.rb | 5 +++-- config/routes.rb | 3 ++- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 1fed4745d..78251190c 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -15,6 +15,25 @@ def index end end + # GET /customers/:id/current + # List the movies a customer currently has checked out (using customer id as params) + def current + customer = Customer.find_by(id: cust_params["id"]) + if customer.nil? + render json: { ok: false, message: "Unable to find customer with ID: #{cust_params["id"]}."}, status: :not_found + else + movies_checked_out = [] + customer.rentals.each do |rental| + movies_checked_out << rental if rental.status == "checked out" + end + if movies_checked_out == [] + render json: { ok: false, message: "#{customer.name} has 0 movies checked out."}, status: :ok + else + render :json => movies_checked_out, :include => {:movie => {:only => :title}}, :only => [:checkout_date, :due_date], status: :ok + end + end + end + private def paginate_check @@ -26,6 +45,6 @@ def paginate_check end def cust_params - params.permit(:sort, :n, :p) + params.permit(:sort, :n, :p, :id) end end diff --git a/app/models/customer.rb b/app/models/customer.rb index 417b61d42..5c5d1dce0 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,8 +1,8 @@ class Customer < ApplicationRecord has_many :rentals - + has_many :movies, through: :rentals + validates :name, presence: true - validates :movies_checked_out_count, presence: true, numericality: { greater_than_or_equal_to: 0 } def self.sort?(input) diff --git a/app/models/rental.rb b/app/models/rental.rb index 80afdc493..4f1ff2be8 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -10,8 +10,9 @@ class Rental < ApplicationRecord def self.check_out(customer_id, movie_id) rental = Rental.new(customer_id: customer_id, movie_id: movie_id) - rental.check_out_date = Date.today - rental.due_date = rental.check_out_date + 7 + today = Date.today + rental.check_out_date = today + rental.due_date = today + 7 return rental end diff --git a/config/routes.rb b/config/routes.rb index 097babaf1..97dd07c0a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,8 +8,9 @@ post "/rentals/check-out", to: "rentals#check_out", as: "check_out_movie" post "/rentals/check-in", to: "rentals#check_in", as: "check_in_movie" get "/rentals/overdue", to: "rentals#overdue", as: "overdue" - + get "/customers", to: "customers#index", as: "customers" + get "/customers/:id/current", to: "customers#current", as: "current_customers" get "/zomg", to: "movies#zomg", as: "zomg" From 2942214201fb3b45aae89c1ed0496d38fc7e3c07 Mon Sep 17 00:00:00 2001 From: Jane Date: Wed, 7 Nov 2018 22:14:11 -0800 Subject: [PATCH 55/76] completed current method that lists the movies a customer has checked out in the past --- app/controllers/customers_controller.rb | 23 +++++++++++++++++++++-- config/routes.rb | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 78251190c..055553c07 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -27,9 +27,28 @@ def current movies_checked_out << rental if rental.status == "checked out" end if movies_checked_out == [] - render json: { ok: false, message: "#{customer.name} has 0 movies checked out."}, status: :ok + render json: { ok: true, message: "#{customer.name} has 0 movies checked out."}, status: :ok else - render :json => movies_checked_out, :include => {:movie => {:only => :title}}, :only => [:checkout_date, :due_date], status: :ok + render :json => movies_checked_out, :include => {:movie => {:only => :title}}, :only => [:check_out_date, :due_date], status: :ok + end + end + end + + # GET /customers/:id/history + # List the movies a customer has checked out in the past + def history + customer = Customer.find_by(id: cust_params["id"]) + if customer.nil? + render json: { ok: false, message: "Unable to find customer with ID: #{cust_params["id"]}."}, status: :not_found + else + movies_checked_out_past = [] + customer.rentals.each do |rental| + movies_checked_out_past << rental if rental.status == "returned" + end + if movies_checked_out_past == [] + render json: { ok: true, message: "#{customer.name} has 0 past rentals."}, status: :ok + else + render :json => movies_checked_out_past, :include => {:movie => {:only => :title}}, :only => [:check_out_date, :due_date], status: :ok end end end diff --git a/config/routes.rb b/config/routes.rb index 97dd07c0a..c095fe909 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,7 @@ get "/customers", to: "customers#index", as: "customers" get "/customers/:id/current", to: "customers#current", as: "current_customers" + get "/customers/:id/history", to: "customers#history", as: "past_customers" get "/zomg", to: "movies#zomg", as: "zomg" From e1c2758513122fb5d7bd47321e6209b5e7d67997 Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 09:10:52 -0800 Subject: [PATCH 56/76] added find_customer method to Customers controller --- app/controllers/customers_controller.rb | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 055553c07..1de503d19 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,7 +1,7 @@ class CustomersController < ApplicationController +before_action :find_customer, only: [:history, :current] def index - if Customer.sort?(cust_params["sort"]) customers = paginate_check.order(cust_params["sort"]) else @@ -18,10 +18,7 @@ def index # GET /customers/:id/current # List the movies a customer currently has checked out (using customer id as params) def current - customer = Customer.find_by(id: cust_params["id"]) - if customer.nil? - render json: { ok: false, message: "Unable to find customer with ID: #{cust_params["id"]}."}, status: :not_found - else + if @customer movies_checked_out = [] customer.rentals.each do |rental| movies_checked_out << rental if rental.status == "checked out" @@ -37,10 +34,7 @@ def current # GET /customers/:id/history # List the movies a customer has checked out in the past def history - customer = Customer.find_by(id: cust_params["id"]) - if customer.nil? - render json: { ok: false, message: "Unable to find customer with ID: #{cust_params["id"]}."}, status: :not_found - else + if @customer movies_checked_out_past = [] customer.rentals.each do |rental| movies_checked_out_past << rental if rental.status == "returned" @@ -54,6 +48,13 @@ def history end private + def find_customer + @customer = customer.find_by(id: cust_params["id"]) + + if @customer.nil? + render json: { ok: false, message: "Unable to find customer with ID: #{cust_params["id"]}."}, status: :not_found + end + end def paginate_check if cust_params["p"] && cust_params["n"] From a556e1c3f9fd12882a0027e1d7c85bf5f56e2aae Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Thu, 8 Nov 2018 09:14:36 -0800 Subject: [PATCH 57/76] udpated the current customer method --- app/controllers/movies_controller.rb | 26 ++++++++++++++++---------- app/controllers/rentals_controller.rb | 2 +- app/models/movie.rb | 10 ---------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index a55bc09c0..699d6bf12 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -19,11 +19,11 @@ def index def show # movie = Movie.find_by(id: params[:id]) # - # if movie.nil? - # render json: {ok: false, message: 'not found'}, status: :not_found - # else + if movie.nil? + render json: {ok: false, message: 'not found'}, status: :not_found + else render json: @movie.as_json(except: [:created_at, :updated_at]), status: :ok - # end + end end def zomg @@ -49,12 +49,17 @@ def current # binding.pry current_customers = [] - current_rentals.each do |rental| - current_customers << rental.customer + current_rentals.each do |rental| + current_customer = { + "customer_name" => rental.customer.name, + "check_out_date" => rental.check_out_date, + "due_date" => rental.due_date + } + current_customers << current_customer end - render :json => current_customers, :include => {current_rentals => {:only => :check_out_date}},:except => [:created_at, :updated_at] #works + render current_customers.as_json, status: :OK # render :json => current_customers, :except => [:created_at, :updated_at] #works end @@ -69,13 +74,14 @@ def history def find_movie @movie = Movie.find(params[:id].to_i) - if @movie.nil? - render json: {ok: false, message: 'not found'}, status: :not_found - end + # if @movie.nil? + # render json: {ok: false, message: 'not found'}, status: :not_found + # end end def paginate_check if movie_params["p"] && movie_params["n"] + return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) else return Movie.all diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 60dfec431..6bc03ed14 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,4 +1,4 @@ -require "pry" + class RentalsController < ApplicationController diff --git a/app/models/movie.rb b/app/models/movie.rb index a0c3795a8..32b13b4c1 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -15,14 +15,4 @@ def self.sort?(input) end end - def check_in - updated_available_inventory = self.available_inventory + 1 - self.update(available_inventory: updated_available_inventory) - end - - def check_out - updated_available_inventory = self.available_inventory - 1 - self.update(available_inventory: updated_available_inventory) - end - end From 4efd4beba165ccbcc1f51daf12d1ce613bad3c28 Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 09:16:35 -0800 Subject: [PATCH 58/76] fixed find_customer method --- app/controllers/customers_controller.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 1de503d19..f310e6c50 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -20,11 +20,11 @@ def index def current if @customer movies_checked_out = [] - customer.rentals.each do |rental| + @customer.rentals.each do |rental| movies_checked_out << rental if rental.status == "checked out" end if movies_checked_out == [] - render json: { ok: true, message: "#{customer.name} has 0 movies checked out."}, status: :ok + render json: { ok: true, message: "#{@customer.name} has 0 movies checked out."}, status: :ok else render :json => movies_checked_out, :include => {:movie => {:only => :title}}, :only => [:check_out_date, :due_date], status: :ok end @@ -36,11 +36,11 @@ def current def history if @customer movies_checked_out_past = [] - customer.rentals.each do |rental| + @customer.rentals.each do |rental| movies_checked_out_past << rental if rental.status == "returned" end if movies_checked_out_past == [] - render json: { ok: true, message: "#{customer.name} has 0 past rentals."}, status: :ok + render json: { ok: true, message: "#{@customer.name} has 0 past rentals."}, status: :ok else render :json => movies_checked_out_past, :include => {:movie => {:only => :title}}, :only => [:check_out_date, :due_date], status: :ok end @@ -49,7 +49,7 @@ def history private def find_customer - @customer = customer.find_by(id: cust_params["id"]) + @customer = Customer.find_by(id: cust_params["id"]) if @customer.nil? render json: { ok: false, message: "Unable to find customer with ID: #{cust_params["id"]}."}, status: :not_found From 05f42b33c3c6c25ef6f0e2c9b28b4e082cb2c1be Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Thu, 8 Nov 2018 09:24:31 -0800 Subject: [PATCH 59/76] udpated current customer action in movie --- app/controllers/rentals_controller.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 8263bd42d..6a661b2ad 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,8 +1,3 @@ -<<<<<<< HEAD - - -======= ->>>>>>> e1c2758513122fb5d7bd47321e6209b5e7d67997 class RentalsController < ApplicationController def check_out From 20e18b18298f42098a38b001151eefa815567e2d Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 09:50:22 -0800 Subject: [PATCH 60/76] rewrote current and history (customers) with new logic --- app/controllers/customers_controller.rb | 20 +++++++------------- config/routes.rb | 4 ++-- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index f310e6c50..c98326cfd 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,5 +1,5 @@ class CustomersController < ApplicationController -before_action :find_customer, only: [:history, :current] + before_action :find_customer, only: [:history, :current] def index if Customer.sort?(cust_params["sort"]) @@ -19,14 +19,11 @@ def index # List the movies a customer currently has checked out (using customer id as params) def current if @customer - movies_checked_out = [] - @customer.rentals.each do |rental| - movies_checked_out << rental if rental.status == "checked out" - end - if movies_checked_out == [] + current_rentals = @customer.rentals.where("status = 'checked out'").map { |rental| { title: rental.movie.title, check_out_date: rental.check_out_date, due_date: rental.due_date } } + if current_rentals == [] render json: { ok: true, message: "#{@customer.name} has 0 movies checked out."}, status: :ok else - render :json => movies_checked_out, :include => {:movie => {:only => :title}}, :only => [:check_out_date, :due_date], status: :ok + render json: { current_rentals: current_rentals }, status: :ok end end end @@ -35,14 +32,11 @@ def current # List the movies a customer has checked out in the past def history if @customer - movies_checked_out_past = [] - @customer.rentals.each do |rental| - movies_checked_out_past << rental if rental.status == "returned" - end - if movies_checked_out_past == [] + past_rentals = @customer.rentals.where("status = 'returned'").map { |rental| { title: rental.movie.title, check_out_date: rental.check_out_date, due_date: rental.due_date } } + if past_rentals == [] render json: { ok: true, message: "#{@customer.name} has 0 past rentals."}, status: :ok else - render :json => movies_checked_out_past, :include => {:movie => {:only => :title}}, :only => [:check_out_date, :due_date], status: :ok + render json: { past_rentals: past_rentals }, status: :ok end end end diff --git a/config/routes.rb b/config/routes.rb index 27e082b47..42bd3ee4c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,8 +12,8 @@ get "/rentals/overdue", to: "rentals#overdue", as: "overdue" get "/customers", to: "customers#index", as: "customers" - get "/customers/:id/current", to: "customers#current", as: "current_customers" - get "/customers/:id/history", to: "customers#history", as: "past_customers" + get "/customers/:id/current", to: "customers#current", as: "current_movies" + get "/customers/:id/history", to: "customers#history", as: "past_movies" get "/zomg", to: "movies#zomg", as: "zomg" From c2c0a0124f1c1e99137fbe2f80d03f51435b4266 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Thu, 8 Nov 2018 09:51:51 -0800 Subject: [PATCH 61/76] updated the current customer action in movie --- app/controllers/movies_controller.rb | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 699d6bf12..18ef43f2c 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -43,25 +43,21 @@ def create def current -# List customers that have currently checked out a copy of the film - current_rentals = @movie.rentals.where("status = 'checked out'") + if @movie + @current_rentals = @movie.rentals.where("status = 'checked out'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } - # binding.pry - current_customers = [] + if @current_rentals == nil || @current_rentals = [] - current_rentals.each do |rental| - current_customer = { - "customer_name" => rental.customer.name, - "check_out_date" => rental.check_out_date, - "due_date" => rental.due_date - } - current_customers << current_customer - end + render json: {ok: false, message: 'no current rental for this movie'}, status: :not_found + else + render json: { current_rentals: @current_rentals } + end - render current_customers.as_json, status: :OK - # render :json => current_customers, :except => [:created_at, :updated_at] #works + else + render json: {ok: false, message: 'movie not found'}, status: :not_found + end end def history @@ -92,5 +88,4 @@ def movie_params params.permit(:title, :overview, :release_date, :inventory, :sort, :n, :p) end - end From e99f27dc5a63173b08fca0703a57fd5573ced9db Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Thu, 8 Nov 2018 12:02:32 -0800 Subject: [PATCH 62/76] changed the current and history action for movie --- app/controllers/movies_controller.rb | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 18ef43f2c..0b1d627d1 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -47,11 +47,11 @@ def current if @movie @current_rentals = @movie.rentals.where("status = 'checked out'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } - if @current_rentals == nil || @current_rentals = [] + if @current_rentals != nil && @current_rentals != [] + render json: { current_rentals: @current_rentals } - render json: {ok: false, message: 'no current rental for this movie'}, status: :not_found else - render json: { current_rentals: @current_rentals } + render json: {ok: false, message: 'no current rental for this movie'}, status: :not_found end else @@ -61,7 +61,20 @@ def current end def history + if @movie + @current_rentals = @movie.rentals.where("status = 'returned'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } + if @current_rentals != nil && @current_rentals != [] + render json: { current_rentals: @current_rentals } + + else + render json: {ok: false, message: 'no returned rental for this movie'}, status: :not_found + end + + else + render json: {ok: false, message: 'movie not found'}, status: :not_found + + end end @@ -69,7 +82,7 @@ def history private def find_movie - @movie = Movie.find(params[:id].to_i) + @movie = Movie.find(params["id"]) # if @movie.nil? # render json: {ok: false, message: 'not found'}, status: :not_found # end From 25fe8e9bdf3b15d2af032338dc46515172caadcd Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 13:31:53 -0800 Subject: [PATCH 63/76] moved helper methods to Customer model for index, current, and history --- app/controllers/customers_controller.rb | 32 +++++++++++++++---------- app/models/customer.rb | 30 ++++++++++++++++++++++- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index c98326cfd..6580185a4 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -2,16 +2,14 @@ class CustomersController < ApplicationController before_action :find_customer, only: [:history, :current] def index - if Customer.sort?(cust_params["sort"]) - customers = paginate_check.order(cust_params["sort"]) - else - customers = paginate_check - end + customers = Customer.all + customers = Customer.paginate_check(customers, cust_params["p"], cust_params["n"]) + customers = Customer.sort_check(customers, cust_params["sort"], ["name", "registered_at", "postal_code"]) if customers != String - if customers - render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count] ), status: :ok + if customers.class == String #return the error + render json: {ok: false, message: customers }, status: :not_found else - render json: {ok: false, message: 'not found'}, status: :not_found + render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count] ), status: :ok end end @@ -19,8 +17,13 @@ def index # List the movies a customer currently has checked out (using customer id as params) def current if @customer - current_rentals = @customer.rentals.where("status = 'checked out'").map { |rental| { title: rental.movie.title, check_out_date: rental.check_out_date, due_date: rental.due_date } } - if current_rentals == [] + current_rentals = @customer.find_rentals('checked out') + current_rentals = Customer.paginate_check(current_rentals, cust_params["p"], cust_params["n"]) + current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals != String + + if current_rentals.class == String #return the error + render json: {ok: false, message: overdue_rentals }, status: :not_found + elsif current_rentals == [] render json: { ok: true, message: "#{@customer.name} has 0 movies checked out."}, status: :ok else render json: { current_rentals: current_rentals }, status: :ok @@ -32,8 +35,13 @@ def current # List the movies a customer has checked out in the past def history if @customer - past_rentals = @customer.rentals.where("status = 'returned'").map { |rental| { title: rental.movie.title, check_out_date: rental.check_out_date, due_date: rental.due_date } } - if past_rentals == [] + current_rentals = @customer.find_rentals('returned') + current_rentals = Customer.paginate_check(current_rentals, cust_params["p"], cust_params["n"]) + current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals != String + + if current_rentals.class == String #return the error + render json: {ok: false, message: overdue_rentals }, status: :not_found + elsif past_rentals == [] render json: { ok: true, message: "#{@customer.name} has 0 past rentals."}, status: :ok else render json: { past_rentals: past_rentals }, status: :ok diff --git a/app/models/customer.rb b/app/models/customer.rb index 5c5d1dce0..1c3b60f2f 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,7 +1,7 @@ class Customer < ApplicationRecord has_many :rentals has_many :movies, through: :rentals - + validates :name, presence: true validates :movies_checked_out_count, presence: true, numericality: { greater_than_or_equal_to: 0 } @@ -24,4 +24,32 @@ def check_in self.update(movies_checked_out_count: checked_out_count) end + def find_rentals(status) + current_rentals = self.rentals.where("status = '#{status}'").map { |rental| { title: rental.movie.title, check_out_date: rental.check_out_date, due_date: rental.due_date } } + return current_rentals + end + + def self.paginate_check(customer_rentals, params_p, params_n) + if params_p.nil? && params_n.nil? + return customer_rentals + elsif params_p.nil? || params_n.nil? + return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + elsif (params_p !~ /\D/) && (params_n !~ /\D/) + return customer_rentals.paginate(:page => params_p, :per_page => params_n) + else + return "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + end + end + + def self.sort_check(customer_rentals, params_sort, valid_fields) + if params_sort.nil? + return customer_rentals + elsif valid_fields.include? (params_sort) + return customer_rentals.joins(:movie).order("movies.title") if params_sort == "title" + return customer_rentals.order(params_sort) + else + return "Unable to sort with '#{params_sort}'. Please resubmit with a valid sort parameter (#{valid_fields})" + end + end + end From b03bd8c0e6d34ff6d207f9d14e283b8bd05e35a8 Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 13:41:48 -0800 Subject: [PATCH 64/76] readded missing methods --- app/controllers/customers_controller.rb | 8 -------- app/controllers/movies_controller.rb | 2 +- app/models/customer.rb | 9 --------- app/models/movie.rb | 10 ++++++++++ 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 6580185a4..b86324bcc 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -58,14 +58,6 @@ def find_customer end end - def paginate_check - if cust_params["p"] && cust_params["n"] - return Customer.paginate(:page => cust_params["p"], :per_page => cust_params["n"]) - else - return Customer.all - end - end - def cust_params params.permit(:sort, :n, :p, :id) end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 0b1d627d1..cf406aaee 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -19,7 +19,7 @@ def index def show # movie = Movie.find_by(id: params[:id]) # - if movie.nil? + if @movie.nil? render json: {ok: false, message: 'not found'}, status: :not_found else render json: @movie.as_json(except: [:created_at, :updated_at]), status: :ok diff --git a/app/models/customer.rb b/app/models/customer.rb index 1c3b60f2f..8b8799474 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -5,15 +5,6 @@ class Customer < ApplicationRecord validates :name, presence: true validates :movies_checked_out_count, presence: true, numericality: { greater_than_or_equal_to: 0 } - def self.sort?(input) - valid_fields = ["name", "registered_at", "postal_code" ] - if valid_fields.include? (input) - return true - else - return false - end - end - def check_out checked_out_count = self.movies_checked_out_count + 1 self.update(movies_checked_out_count: checked_out_count) diff --git a/app/models/movie.rb b/app/models/movie.rb index 32b13b4c1..b7549febe 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -15,4 +15,14 @@ def self.sort?(input) end end + def check_out + available_inventory_count = self.available_inventory - 1 + self.update(available_inventory: available_inventory_count) + end + + def check_in + checked_in_count = self.available_inventory + 1 + self.update(available_inventory: checked_in_count) + end + end From cf8ea9840a379b2e0416e7c8dddf5a21efb9ffb2 Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 13:54:39 -0800 Subject: [PATCH 65/76] added .class to methods to fix errors --- app/controllers/customers_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index b86324bcc..f07ae0658 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -4,7 +4,7 @@ class CustomersController < ApplicationController def index customers = Customer.all customers = Customer.paginate_check(customers, cust_params["p"], cust_params["n"]) - customers = Customer.sort_check(customers, cust_params["sort"], ["name", "registered_at", "postal_code"]) if customers != String + customers = Customer.sort_check(customers, cust_params["sort"], ["name", "registered_at", "postal_code"]) if customers.class != String if customers.class == String #return the error render json: {ok: false, message: customers }, status: :not_found @@ -19,7 +19,7 @@ def current if @customer current_rentals = @customer.find_rentals('checked out') current_rentals = Customer.paginate_check(current_rentals, cust_params["p"], cust_params["n"]) - current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals != String + current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals.class != String if current_rentals.class == String #return the error render json: {ok: false, message: overdue_rentals }, status: :not_found @@ -37,7 +37,7 @@ def history if @customer current_rentals = @customer.find_rentals('returned') current_rentals = Customer.paginate_check(current_rentals, cust_params["p"], cust_params["n"]) - current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals != String + current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals.class != String if current_rentals.class == String #return the error render json: {ok: false, message: overdue_rentals }, status: :not_found From 67a1c6714102e4ff81623be3d69164d70e2ec13b Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 20:47:17 -0800 Subject: [PATCH 66/76] added Rental model tests --- app/controllers/customers_controller.rb | 4 +- app/models/rental.rb | 2 +- test/fixtures/rentals.yml | 7 + test/models/rental_test.rb | 179 ++++++++++++++++++++++-- 4 files changed, 177 insertions(+), 15 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index f07ae0658..a9c03991e 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -19,7 +19,7 @@ def current if @customer current_rentals = @customer.find_rentals('checked out') current_rentals = Customer.paginate_check(current_rentals, cust_params["p"], cust_params["n"]) - current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals.class != String + current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "check_out_date", "due_date"]) if current_rentals.class != String if current_rentals.class == String #return the error render json: {ok: false, message: overdue_rentals }, status: :not_found @@ -37,7 +37,7 @@ def history if @customer current_rentals = @customer.find_rentals('returned') current_rentals = Customer.paginate_check(current_rentals, cust_params["p"], cust_params["n"]) - current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "checkout_date", "due_date"]) if current_rentals.class != String + current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "check_out_date", "due_date"]) if current_rentals.class != String if current_rentals.class == String #return the error render json: {ok: false, message: overdue_rentals }, status: :not_found diff --git a/app/models/rental.rb b/app/models/rental.rb index 4f1ff2be8..8d288c953 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -35,7 +35,7 @@ def self.paginate_check(overdue_rentals, params_p, params_n) end def self.sort_check(overdue_rentals, params_sort) - valid_fields = ["title", "name", "checkout_date", "due_date"] + valid_fields = ["title", "name", "check_out_date", "due_date"] if params_sort.nil? return overdue_rentals elsif valid_fields.include? (params_sort) diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index f7bcefa16..cf95b0273 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -20,3 +20,10 @@ three: status: "checked out" customer: mike movie: titanic + +four: + check_out_date: 2018-10-20 13:04:10 + due_date: 2018-10-27 13:04:10 + status: "returned" + customer: lily + movie: taken diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 0a232779b..f5c464377 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,17 +1,19 @@ require "test_helper" - +require "pry" describe Rental do describe "relationships" do it "belongs to a customer" do rental = rentals(:one) - rental.must_respond_to :customer - rental.customer.must_be_kind_of Customer + + expect(rental).must_respond_to :customer + expect(rental.customer).must_be_kind_of Customer end it "belongs to a movie" do rental = rentals(:one) - rental.must_respond_to :movie - rental.movie.must_be_kind_of Movie + + expect(rental).must_respond_to :movie + expect(rental.movie).must_be_kind_of Movie end end @@ -22,11 +24,12 @@ rental.check_out_date = nil result = rental.save - result.must_equal false + expect(result).must_equal false rental.check_out_date = "2018-12-03 13:04:10" result = rental.save - result.must_equal true + expect(result).must_equal true + end it "must have a due_date" do @@ -34,11 +37,11 @@ rental.due_date = nil result = rental.save - result.must_equal false + expect(result).must_equal false rental.due_date = "2018-12-10 13:04:10" result = rental.save - result.must_equal true + expect(result).must_equal true end it "must have a status" do @@ -47,7 +50,7 @@ result = rental.save - result.must_equal false + expect(result).must_equal false end it "must have a valid status" do @@ -55,11 +58,163 @@ rental.status = "cheese" result = rental.save - result.must_equal false + expect(result).must_equal false rental.status = "checked out" result = rental.save - result.must_equal true + expect(result).must_equal true + end + end + + describe "check_out" do + let(:movie) { movies(:taken) } + let(:customer) { customers(:mike) } + let(:today) { Date.today } + + it "makes a new rental with a customer and a movie" do + rental = Rental.check_out(customer.id, movie.id) + + expect(rental).must_be_kind_of Rental + expect(rental.movie).must_be_kind_of Movie + expect(rental.customer).must_be_kind_of Customer + end + + it "doesn't assign a customer or movie with invalid params " do + rental = Rental.check_out("hello", "test") + + expect(rental).must_be_kind_of Rental + expect(rental.movie).must_be_nil + expect(rental.customer).must_be_nil + end + + it "gives it a check_out_date of today" do + rental = Rental.check_out(customer.id, movie.id) + + expect(rental.check_out_date).must_equal today + end + + it "gives it a due_date of a week from today" do + rental = Rental.check_out(customer.id, movie.id) + + expect(rental.due_date).must_equal today + 7 + end + + end + + describe "check_in" do + let(:rental) { rentals(:one) } + + it "updates the rental's status to returned" do + expect(rental.status).must_equal "checked out" + rental.check_in + expect(rental.status).must_equal "returned" + end + + it "decrements the rental's customer's movies_checked_out_count by 1" do + count = rental.customer.movies_checked_out_count + rental.check_in + expect(rental.customer.movies_checked_out_count).must_equal count - 1 + end + + it "increments the rental's movie's available_inventory by 1" do + inventory = rental.movie.available_inventory + rental.check_in + expect(rental.movie.available_inventory).must_equal inventory + 1 + end + + end + + describe "paginate_check" do + it "returns rentals if n and p params are absent/nil" do + rentals = Rental.paginate_check(Rental.all, nil, nil) + + rentals.each do |rental| + expect(rental).must_be_kind_of Rental + end + + expect(rentals).must_be_kind_of ActiveRecord::Relation + end + + it "returns a string if n or p params are absent/nil" do + rentals = Rental.paginate_check(Rental.all, 1, nil) + + expect(rentals).must_be_kind_of String + expect(rentals).must_equal "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + end + + it "paginates rentals if n and p params are numeric and positive" do + n_params = 3 + p_params = 1 + rentals = Rental.paginate_check(Rental.all, p_params, n_params) + + expect(rentals).must_be_kind_of ActiveRecord::Relation + expect(rentals.length).must_equal n_params + end + + it "returns a string if n or p params are not numeric or positive" do + rentals = Rental.paginate_check(Rental.all, "hello", "nil") + expect(rentals).must_be_kind_of String + expect(rentals).must_equal "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + + rentals = Rental.paginate_check(Rental.all, "-1", 2) + expect(rentals).must_be_kind_of String + expect(rentals).must_equal "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + end + end + + describe "sort_check" do + it "returns rentals if the params are nil" do + rentals = Rental.sort_check(Rental.all, nil) + + expect(rentals).must_be_kind_of ActiveRecord::Relation + rentals.each do |rental| + expect(rental).must_be_kind_of Rental + end + end + + it "returns rentals sorted by movie title if params are 'title'" do + sorted_rentals = Rental.all.joins(:movie).order("movies.title") + rentals = Rental.sort_check(Rental.all, "title") + + rentals.each.with_index do |rental, index| + expect(rental).must_be_kind_of Rental + expect(rental.movie.title).must_equal sorted_rentals[index].movie.title + end + end + + it "returns rentals sorted by customer if params are 'name'" do + sorted_rentals = Rental.all.joins(:customer).order("customers.name") + rentals = Rental.sort_check(Rental.all, "name") + + rentals.each.with_index do |rental, index| + expect(rental).must_be_kind_of Rental + expect(rental.customer.name).must_equal sorted_rentals[index].customer.name + end + end + + it "returns rentals sorted by 'check_out_date' or 'due_date'" do + sorted_rentals = Rental.all.order("check_out_date") + rentals = Rental.sort_check(Rental.all, "check_out_date") + + rentals.each.with_index do |rental, index| + expect(rental).must_be_kind_of Rental + expect(rental.check_out_date).must_equal sorted_rentals[index].check_out_date + end + + sorted_rentals = Rental.all.order("due_date") + rentals = Rental.sort_check(Rental.all, "due_date") + + rentals.each.with_index do |rental, index| + expect(rental).must_be_kind_of Rental + expect(rental.due_date).must_equal sorted_rentals[index].due_date + end + end + + it "returns a string if the params are invalid" do + toast = "toast" + rentals = Rental.sort_check(Rental.all, "toast") + expect(rentals).must_be_kind_of String + expect(rentals).must_equal "Unable to sort with '#{toast}'. Please resubmit with a valid sort parameter (title ,name, checkout_date, or due_date)" end end end From 233792e902abfce2812448bc0c993e3cd6461434 Mon Sep 17 00:00:00 2001 From: Jane Date: Thu, 8 Nov 2018 21:05:36 -0800 Subject: [PATCH 67/76] set up tests for Rentals controller --- test/controllers/rentals_controller_test.rb | 76 ++++++++++++++++++++- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index f0227216c..2dda17ea5 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,7 +1,77 @@ require "test_helper" describe RentalsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "check_out" do + it "renders json" do + + end + + it "returns a rental with exactly the required fields" do + # render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok + end + + it "updates movie available_inventory" do + + end + + it "updates customer movies_checked_out_count" do + + end + + it "returns an error message with invalid params" do + #render json: { ok: false, errors: rental.errors.messages}, status: :bad_request + end + end + + describe "check_in" do + + it "finds the rental based off of the movie_id and customer_id params and 'checked out' status" do + # current_rental = Rental.find_by(movie_id: rental_params[:movie_id], customer_id: rental_params[:customer_id], status: "checked out") + end + + it "returns an error with invalid params/a rental doesn't exist" do + # if current_rental.nil? + # render json: {ok: false, message: "Your rental was not found"}, status: :not_found + end + + it "succeeds with valid rental" do + # current_rental.check_in + # render json: {ok: true, message: "Movie successfully returned"}, status: :ok + end + it "updates the rental's status and customer and movie inventories" do + # self.customer.check_in + # self.movie.check_in + # self.update(status: "returned") + end + end + + describe "overdue" do + it "renders json" do + end + + it "returns an error message if there are invalid sort params" do + # render json: {ok: false, message: overdue_rentals }, status: :not_found + end + + it "returns an error message if there are invalid p or n params" do + + end + + it "returns a message if there are no overdue rentals" do + # elsif overdue_rentals.length == 0 + # render json: {ok: true, message: "There are no overdue rentals!"}, status: :ok + end + + it "returns overdue rentals with valid sort params" do + + end + + it "returns overdue rentals with valid p or n params" do + + end + + it "returns overdue rentals with no sort params or p and n params provided" do + # render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at], status: :ok + end + end end From d3d9fa9a5590a64bcb0b91bc662ec8ff429f3905 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Fri, 9 Nov 2018 04:41:26 -0800 Subject: [PATCH 68/76] updated current and history action for movie --- app/controllers/movies_controller.rb | 23 +++++++++++------------ app/models/movie.rb | 12 +++++++++++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 0b1d627d1..99446d6b2 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,4 +1,4 @@ -require "pry" + class MoviesController < ApplicationController before_action :find_movie, only: [:show, :current, :history] @@ -17,8 +17,7 @@ def index end def show - # movie = Movie.find_by(id: params[:id]) - # + if movie.nil? render json: {ok: false, message: 'not found'}, status: :not_found else @@ -45,10 +44,11 @@ def create def current if @movie - @current_rentals = @movie.rentals.where("status = 'checked out'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } - if @current_rentals != nil && @current_rentals != [] - render json: { current_rentals: @current_rentals } + current_rentals = Movie.checked_out_rentals(@movie) + + if current_rentals != nil && current_rentals != [] + render json: { current_rentals: current_rentals } else render json: {ok: false, message: 'no current rental for this movie'}, status: :not_found @@ -62,10 +62,11 @@ def current def history if @movie - @current_rentals = @movie.rentals.where("status = 'returned'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } - if @current_rentals != nil && @current_rentals != [] - render json: { current_rentals: @current_rentals } + current_rentals = Movie.returned_rentals(@movie) + + if current_rentals != nil && current_rentals != [] + render json: { current_rentals: current_rentals } else render json: {ok: false, message: 'no returned rental for this movie'}, status: :not_found @@ -83,9 +84,7 @@ def history def find_movie @movie = Movie.find(params["id"]) - # if @movie.nil? - # render json: {ok: false, message: 'not found'}, status: :not_found - # end + end def paginate_check diff --git a/app/models/movie.rb b/app/models/movie.rb index 32b13b4c1..6d90f190f 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -2,7 +2,7 @@ class Movie < ApplicationRecord has_many :rentals has_many :customers, through: :rentals - validates :title, presence: true + validates :title, presence: true, uniqueness: true validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :available_inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } @@ -15,4 +15,14 @@ def self.sort?(input) end end + def self.checked_out_rentals(movie) + + return movie.rentals.where("status = 'checked out'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } + + end + + def self.returned_rentals(movie) + return movie.rentals.where("status = 'returned'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } + end + end From a49c79e62c978e955a36a1a1242ea5a895408230 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Fri, 9 Nov 2018 05:16:48 -0800 Subject: [PATCH 69/76] dry movie controller actions --- app/controllers/movies_controller.rb | 15 +++------------ app/models/movie.rb | 11 ++++++++++- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index e1ef74dd7..dbf010640 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -4,9 +4,9 @@ class MoviesController < ApplicationController def index if Movie.sort?(movie_params["sort"]) - movies = paginate_check.order(movie_params["sort"]) + movies = Movie.paginate_check(movie_params["p"], movie_params["n"]).order(movie_params["sort"]) else - movies = paginate_check + movies = Movie.paginate_check(movie_params["p"], movie_params["n"]) end if movies @@ -17,8 +17,7 @@ def index end def show - # movie = Movie.find_by(id: params[:id]) - # + if @movie.nil? render json: {ok: false, message: 'not found'}, status: :not_found else @@ -88,14 +87,6 @@ def find_movie end - def paginate_check - if movie_params["p"] && movie_params["n"] - - return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) - else - return Movie.all - end - end def movie_params params.permit(:title, :overview, :release_date, :inventory, :sort, :n, :p) diff --git a/app/models/movie.rb b/app/models/movie.rb index d89d1756f..3aff04495 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -15,6 +15,15 @@ def self.sort?(input) end end + def self.paginate_check(param_p, param_n) + if param_p && param_n + + return Movie.paginate(:page => param_p, :per_page => param_n) + else + return Movie.all + end + end + def self.checked_out_rentals(movie) return movie.rentals.where("status = 'checked out'").map { |rental| { customer_id: rental.customer.id, customer_name: rental.customer.name, postal_code: rental.customer.postal_code, check_out_date: rental.check_out_date, due_date: rental.due_date } } @@ -34,5 +43,5 @@ def check_out def check_in checked_in_count = self.available_inventory + 1 self.update(available_inventory: checked_in_count) - + end end From 8f4249253c669279fefb624b01ff879c2c66098a Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Fri, 9 Nov 2018 08:23:16 -0800 Subject: [PATCH 70/76] added movie controller test & model test --- app/controllers/movies_controller.rb | 24 ++-- app/models/movie.rb | 28 ++--- test/controllers/movies_controller_test.rb | 99 +++++++++++++++ test/fixtures/customers.yml | 14 ++- test/fixtures/rentals.yml | 14 +++ test/models/movie_test.rb | 133 ++++++++++++++++++++- 6 files changed, 283 insertions(+), 29 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index dbf010640..5f2b8d26d 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -4,9 +4,9 @@ class MoviesController < ApplicationController def index if Movie.sort?(movie_params["sort"]) - movies = Movie.paginate_check(movie_params["p"], movie_params["n"]).order(movie_params["sort"]) + movies = paginate_check.order(movie_params["sort"]) else - movies = Movie.paginate_check(movie_params["p"], movie_params["n"]) + movies = paginate_check end if movies @@ -48,7 +48,7 @@ def current current_rentals = Movie.checked_out_rentals(@movie) if current_rentals != nil && current_rentals != [] - render json: { current_rentals: current_rentals } + render json: current_rentals else render json: {ok: false, message: 'no current rental for this movie'}, status: :not_found @@ -63,10 +63,10 @@ def current def history if @movie - current_rentals = Movie.returned_rentals(@movie) + history_rentals = Movie.returned_rentals(@movie) - if current_rentals != nil && current_rentals != [] - render json: { current_rentals: current_rentals } + if history_rentals != nil && history_rentals != [] + render json: history_rentals else render json: {ok: false, message: 'no returned rental for this movie'}, status: :not_found @@ -83,13 +83,21 @@ def history private def find_movie - @movie = Movie.find(params["id"]) + @movie = Movie.find_by(id: movie_params["id"]) end + def paginate_check + if movie_params["p"] && movie_params["n"] + + return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) + else + return Movie.all + end + end def movie_params - params.permit(:title, :overview, :release_date, :inventory, :sort, :n, :p) + params.permit(:title, :overview, :release_date, :inventory, :sort, :n, :p, :id) end end diff --git a/app/models/movie.rb b/app/models/movie.rb index 3aff04495..125364fd2 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,6 +1,6 @@ class Movie < ApplicationRecord has_many :rentals - has_many :customers, through: :rentals + # has_many :customers, through: :rentals validates :title, presence: true, uniqueness: true validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0 } @@ -15,14 +15,6 @@ def self.sort?(input) end end - def self.paginate_check(param_p, param_n) - if param_p && param_n - - return Movie.paginate(:page => param_p, :per_page => param_n) - else - return Movie.all - end - end def self.checked_out_rentals(movie) @@ -35,13 +27,13 @@ def self.returned_rentals(movie) end - def check_out - available_inventory_count = self.available_inventory - 1 - self.update(available_inventory: available_inventory_count) - end - - def check_in - checked_in_count = self.available_inventory + 1 - self.update(available_inventory: checked_in_count) - end + # def check_out + # available_inventory_count = self.available_inventory - 1 + # self.update(available_inventory: available_inventory_count) + # end + # + # def check_in + # checked_in_count = self.available_inventory + 1 + # self.update(available_inventory: checked_in_count) + # end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index a4e62482a..2dd310485 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -133,4 +133,103 @@ expect(body.keys.sort).must_equal fields end end + + describe "current" do + it "is a real working route and returns JSON" do + # Act + get current_customers_path(movies(:taken).id) + + # Assert + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :success + end + + it "returns an Array " do + # Act + get current_customers_path(movies(:taken).id) + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body).must_be_kind_of Array + end + + it "returns all of the current customers of that movie" do + # Act + get current_customers_path(movies(:taken).id) + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body.length).must_equal 1 + end + + it "returns customers with exactly the required fields" do + fields = %w(check_out_date customer_id customer_name due_date postal_code) + + # Act + get current_customers_path(movies(:taken).id) + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert that each + body.each do |customer| + expect(customer.keys.sort).must_equal fields + expect(customer.keys.length).must_equal fields.length + end + end + end + + describe "history" do + it "is a real working route and returns JSON" do + # Act + get history_customers_path(movies(:taken).id) + + # Assert + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :success + end + + it "returns an Array" do + # Act + get history_customers_path(movies(:taken).id) + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body).must_be_kind_of Array + end + + it "returns all of the current customers of that movie" do + # Act + get history_customers_path(movies(:taken).id) + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert + expect(body.length).must_equal 2 + end + + it "returns customers with exactly the required fields" do + fields = %w(check_out_date customer_id customer_name due_date postal_code) + + # Act + get history_customers_path(movies(:taken).id) + + # Convert the JSON response into a Hash + body = JSON.parse(response.body) + + # Assert that each + body.each do |customer| + expect(customer.keys.sort).must_equal fields + expect(customer.keys.length).must_equal fields.length + end + end + end + end diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index 767512dd0..7903dab58 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -2,7 +2,7 @@ mike: name: Mike - registered_at: 2018-11-05 13:04:00 + registered_at: 2018-10-01 13:04:00 address: 100 10th Ave city: Seattle state: WA @@ -12,7 +12,17 @@ mike: lily: name: Lily - registered_at: 2018-11-05 13:04:00 + registered_at: 2018-10-01 13:04:00 + address: 8 5th Ave + city: Issaquah + state: WA + postal_code: 98010 + phone: 206-333-1888 + movies_checked_out_count: 1 + +mary: + name: Mary + registered_at: 2018-10-01 13:04:00 address: 8 5th Ave city: Issaquah state: WA diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index f7bcefa16..560dbf68b 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -20,3 +20,17 @@ three: status: "checked out" customer: mike movie: titanic + +four: + check_out_date: 2018-10-03 13:04:10 + due_date: 2018-10-10 13:04:10 + status: "returned" + customer: mike + movie: taken + +five: + check_out_date: 2018-10-12 13:04:10 + due_date: 2018-10-19 13:04:10 + status: "returned" + customer: mary + movie: taken diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 65b4a8beb..575f709da 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -14,6 +14,25 @@ result.must_equal true end + it "must have a unique title" do + movie = movies(:taken) + movie2 = Movie.new + + movie2.title = "Taken" + movie2.inventory = 10 + movie2.available_inventory = 10 + + result = movie2.save + result.must_equal false + + movie2.title = "Jane" + + result = movie2.save + result.must_equal true + end + + + it "must have inventory" do movie = movies(:taken) @@ -42,6 +61,15 @@ result.must_equal true end + it "inventory must be numerical" do + movie = movies(:taken) + + movie.inventory = "t" + result = movie.save + result.must_equal false + + end + it "must have an available inventory" do movie = movies(:taken) @@ -54,7 +82,7 @@ result.must_equal true end - it "must have 0 or more inventory" do + it "must have 0 or more available inventory" do movie = movies(:taken) movie.available_inventory = -1 @@ -70,5 +98,108 @@ result.must_equal true end + it " available inventory must be numerical" do + movie = movies(:taken) + + movie.available_inventory = "t" + result = movie.save + result.must_equal false + + end + + + end + + describe "relationships" do + + it "has many rentals" do + movie = movies(:taken) + + movie.must_respond_to :rentals + + movie.rentals.each do |rental| + rental.movie.must_be_kind_of Movie + end + end end + + describe "self.sort?" do + it "return true if parameter is valid " do + expect(Movie.sort?("title")).must_equal true + expect(Movie.sort?("release_date")).must_equal true + end + + it "return false if parameter is not valid" do + expect(Movie.sort?("")).must_equal false + end + + it "return false if no parameter" do + expect(Movie.sort?("test")).must_equal false + end + end + + describe "self.checked_out_rentals" do + before do + @movie = movies(:taken) + @rental1 = rentals(:one) + @rental2 = rentals(:four) + + customers = Movie.checked_out_rentals(@movie) + @customer_names = [] + + customers.each do |cust| + @customer_names << cust[:customer_name] + end + + + end + it "return an array " do + + expect(Movie.checked_out_rentals(@movie)).must_be_kind_of Array + + end + + it "return the customer if the rental status is checked out" do + expect(Movie.checked_out_rentals(@movie).first[:customer_name]).must_equal "Lily" + expect(@customer_names.include? "Lily").must_equal true + end + + it "do not return the customer if the rental status is returned" do + + expect(@customer_names.include? "Mike").must_equal false + end + end + + describe "self.returned_rentals" do + before do + @movie = movies(:taken) + @rental1 = rentals(:one) + @rental2 = rentals(:four) + + customers = Movie.returned_rentals(@movie) + @customer_names = [] + + customers.each do |cust| + @customer_names << cust[:customer_name] + end + + + end + it "return an array " do + + expect(Movie.returned_rentals(@movie)).must_be_kind_of Array + + end + + it "return the customer if the rental status is renturned" do + expect(Movie.returned_rentals(@movie).first[:customer_name]).must_equal "Mike" + expect(@customer_names.include? "Mike").must_equal true + end + + it "do not return the customer if the rental status is checked out" do + + expect(@customer_names.include? "Lily").must_equal false + end + end + end From affcccebb68987963fa71ebfa4ec66213d142fc5 Mon Sep 17 00:00:00 2001 From: Jane Date: Fri, 9 Nov 2018 11:09:54 -0800 Subject: [PATCH 71/76] adding rental tests --- app/controllers/rentals_controller.rb | 2 +- app/models/rental.rb | 2 +- test/controllers/rentals_controller_test.rb | 68 ++++++++++++++++++--- test/models/rental_test.rb | 4 +- 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 6a661b2ad..326410bac 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -7,7 +7,7 @@ def check_out rental.movie.check_out rental.customer.check_out - render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok + render json: { id: rental.id , check_out_date: rental.check_out_date, due_date:rental.due_date}, status: :ok else render json: { ok: false, errors: rental.errors.messages}, status: :bad_request end diff --git a/app/models/rental.rb b/app/models/rental.rb index 8d288c953..ff7876eea 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -43,7 +43,7 @@ def self.sort_check(overdue_rentals, params_sort) return overdue_rentals.joins(:customer).order("customers.name") if params_sort == "name" return overdue_rentals.order(params_sort) else - return "Unable to sort with '#{params_sort}'. Please resubmit with a valid sort parameter (title ,name, checkout_date, or due_date)" + return "Unable to sort with '#{params_sort}'. Please resubmit with a valid sort parameter (title ,name, check_out_date, or due_date)" end end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 2dda17ea5..6abc65d0c 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,25 +1,75 @@ require "test_helper" - +require "pry" describe RentalsController do describe "check_out" do + let(:movie) { movies(:ring) } + let(:customer) { customers(:lily) } + let(:check_out_data) { + { + customer_id: customer.id, + movie_id: movie.id + } + } + it "renders json" do + post check_out_movie_path, params: check_out_data + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :success end it "returns a rental with exactly the required fields" do - # render json: { id: rental.id , checkout_date: rental.check_out_date, due_date:rental.due_date}, status: :ok + expect { + post check_out_movie_path, params: check_out_data + }.must_change('Rental.count', 1) + + body = JSON.parse(response.body) + + expect(Rental.last.id).must_equal body["id"] + expect(Rental.last.check_out_date).must_equal body["check_out_date"].in_time_zone + expect(Rental.last.due_date).must_equal body["due_date"].in_time_zone + + expect(Rental.last.customer).must_equal customer + expect(Rental.last.movie).must_equal movie end - it "updates movie available_inventory" do + it "updates movie available_inventory (-1)" do + available_inventory = movie.available_inventory + id = movie.id + post check_out_movie_path, params: check_out_data + + updated_movie = Movie.find_by(id: id) + expect(updated_movie.available_inventory).must_equal available_inventory - 1 end - it "updates customer movies_checked_out_count" do + it "updates customer movies_checked_out_count (+1)" do + movies_checked_out_count = customer.movies_checked_out_count + id = customer.id + post check_out_movie_path, params: check_out_data + + updated_customer = Customer.find_by(id: id) + expect(updated_customer.movies_checked_out_count).must_equal movies_checked_out_count + 1 end it "returns an error message with invalid params" do - #render json: { ok: false, errors: rental.errors.messages}, status: :bad_request + bad_check_out_data = { + customer_id: "hello", + movie_id: "goodbye" + } + + expect { + post check_out_movie_path, params: bad_check_out_data + }.wont_change('Rental.count') + + body = JSON.parse(response.body) + + expect(body).must_include "errors" + expect(body["errors"]).must_include "customer" + expect(body["errors"]).must_include "movie" + must_respond_with :bad_request end end @@ -66,11 +116,15 @@ end - it "returns overdue rentals with valid p or n params" do + it "returns overdue rentals with valid p and n params" do + + end + + it "returns overdue rentals with valid p and n params and valid sort params" do end - it "returns overdue rentals with no sort params or p and n params provided" do + it "returns overdue rentals with no params" do # render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at], status: :ok end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index f5c464377..f1d4f421c 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -19,7 +19,7 @@ describe "validations" do - it "must have a checkout_date" do + it "must have a check_out_date" do rental = rentals(:one) rental.check_out_date = nil @@ -214,7 +214,7 @@ toast = "toast" rentals = Rental.sort_check(Rental.all, "toast") expect(rentals).must_be_kind_of String - expect(rentals).must_equal "Unable to sort with '#{toast}'. Please resubmit with a valid sort parameter (title ,name, checkout_date, or due_date)" + expect(rentals).must_equal "Unable to sort with '#{toast}'. Please resubmit with a valid sort parameter (title ,name, check_out_date, or due_date)" end end end From aac2316a5277dc6724a97a594a150342ca8d9f06 Mon Sep 17 00:00:00 2001 From: Jane Date: Fri, 9 Nov 2018 13:30:18 -0800 Subject: [PATCH 72/76] completed rental controller tests --- test/controllers/rentals_controller_test.rb | 163 ++++++++++++++++++-- test/fixtures/movies.yml | 2 +- 2 files changed, 148 insertions(+), 17 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 6abc65d0c..91bf3527a 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -74,58 +74,189 @@ end describe "check_in" do - - it "finds the rental based off of the movie_id and customer_id params and 'checked out' status" do - # current_rental = Rental.find_by(movie_id: rental_params[:movie_id], customer_id: rental_params[:customer_id], status: "checked out") - end + let(:movie) { movies(:ring) } + let(:customer) { customers(:lily) } + let(:data) { + { + customer_id: customer.id, + movie_id: movie.id + } + } it "returns an error with invalid params/a rental doesn't exist" do - # if current_rental.nil? - # render json: {ok: false, message: "Your rental was not found"}, status: :not_found + bad_data = { + customer_id: "hello", + movie_id: "goodbye" + } + post check_in_movie_path, params: bad_data + + body = JSON.parse(response.body) + + expect(body["message"]).must_equal "Your rental was not found" + must_respond_with :not_found end it "succeeds with valid rental" do - # current_rental.check_in - # render json: {ok: true, message: "Movie successfully returned"}, status: :ok + post check_out_movie_path, params: data + post check_in_movie_path, params: data + + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + expect(body["message"]).must_equal "Movie successfully returned" + must_respond_with :success end + it "updates the rental's status and customer and movie inventories" do - # self.customer.check_in - # self.movie.check_in - # self.update(status: "returned") + post check_out_movie_path, params: data + checked_out_rental = Rental.last + id = checked_out_rental.id + movies_checked_out_count = checked_out_rental.customer.movies_checked_out_count + available_inventory = checked_out_rental.movie.available_inventory + + post check_in_movie_path, params: data + + checked_in_rental = Rental.find_by(id: id) + + expect(checked_in_rental.status).must_equal "returned" + expect(checked_in_rental.customer.movies_checked_out_count).must_equal movies_checked_out_count - 1 + expect(checked_in_rental.movie.available_inventory).must_equal available_inventory + 1 end end describe "overdue" do + # get "/rentals/overdue", to: "rentals#overdue", as: "overdue" + # let(:check_out_data) { + # { + # sort: "toast" + # } + # } + it "renders json" do + get overdue_path + + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :success end it "returns an error message if there are invalid sort params" do - # render json: {ok: false, message: overdue_rentals }, status: :not_found + bad_data = { + sort: "hello" + } + get overdue_path, params: bad_data + must_respond_with :not_found + + bad_data = { + sort: "hello", + p: 1, + n: 1 + } + get overdue_path, params: bad_data + must_respond_with :not_found end it "returns an error message if there are invalid p or n params" do - + bad_data = { + n: "hello", + p: "toast" + } + get overdue_path, params: bad_data + must_respond_with :not_found end it "returns a message if there are no overdue rentals" do - # elsif overdue_rentals.length == 0 - # render json: {ok: true, message: "There are no overdue rentals!"}, status: :ok + Rental.all.each do |rental| + rental.destroy if rental.due_date < Date.today + end + + get overdue_path + must_respond_with :ok + + body = JSON.parse(response.body) + expect(body["message"]).must_equal "There are no overdue rentals!" end it "returns overdue rentals with valid sort params" do + fields = %w(id check_out_date due_date status customer_id movie_id movie customer) + data = { + sort: "name" + } + get overdue_path, params: data + get overdue_path + body = JSON.parse(response.body) + + body.each do |rental| + expect(rental["status"]).must_equal "checked out" + rental.keys.must_equal fields + expect(rental["movie"]).must_include "title" + expect(rental["customer"]).must_include "name" + expect(rental["customer"]).must_include "postal_code" + expect(Date.parse(rental["due_date"])).must_be :<, Date.today + end end it "returns overdue rentals with valid p and n params" do + fields = %w(id check_out_date due_date status customer_id movie_id movie customer) + data = { + n: "1", + p: "1" + } + + get overdue_path, params: data + body = JSON.parse(response.body) + body.each do |rental| + expect(rental["status"]).must_equal "checked out" + rental.keys.must_equal fields + expect(rental["movie"]).must_include "title" + expect(rental["customer"]).must_include "name" + expect(rental["customer"]).must_include "postal_code" + expect(Date.parse(rental["due_date"])).must_be :<, Date.today + end + + expect(body.length).must_equal data[:n].to_i end it "returns overdue rentals with valid p and n params and valid sort params" do + fields = %w(id check_out_date due_date status customer_id movie_id movie customer) + data = { + n: "1", + p: "1", + sort: "name" + } + + get overdue_path, params: data + + body = JSON.parse(response.body) + body.each do |rental| + expect(rental["status"]).must_equal "checked out" + rental.keys.must_equal fields + expect(rental["movie"]).must_include "title" + expect(rental["customer"]).must_include "name" + expect(rental["customer"]).must_include "postal_code" + expect(Date.parse(rental["due_date"])).must_be :<, Date.today + end + + expect(body.length).must_equal data[:n].to_i end it "returns overdue rentals with no params" do - # render :json => overdue_rentals, :include => {:movie => {:only => :title}, :customer => {:only => [:name, :postal_code]}}, :except => [:created_at, :updated_at], status: :ok + fields = %w(id check_out_date due_date status customer_id movie_id movie customer) + + get overdue_path + + body = JSON.parse(response.body) + body.each do |rental| + expect(rental["status"]).must_equal "checked out" + rental.keys.must_equal fields + expect(rental["movie"]).must_include "title" + expect(rental["customer"]).must_include "name" + expect(rental["customer"]).must_include "postal_code" + expect(Date.parse(rental["due_date"])).must_be :<, Date.today + end end end + end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index e109eba3f..a4eaa8393 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -20,4 +20,4 @@ titanic: overview: masterpiece release_date: 1997-11-05 inventory: 5 - available_inventory: 1 + available_inventory: 5 From c08cd2afbca73fe9f4cab9e36d40e42dbd48349e Mon Sep 17 00:00:00 2001 From: Jane Date: Fri, 9 Nov 2018 13:31:13 -0800 Subject: [PATCH 73/76] deleted a couple unused lines --- test/controllers/rentals_controller_test.rb | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 91bf3527a..760ca510e 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "pry" describe RentalsController do describe "check_out" do let(:movie) { movies(:ring) } @@ -124,13 +123,6 @@ end describe "overdue" do - # get "/rentals/overdue", to: "rentals#overdue", as: "overdue" - # let(:check_out_data) { - # { - # sort: "toast" - # } - # } - it "renders json" do get overdue_path @@ -258,5 +250,5 @@ end end end - + end From acdcc041d239b94fa7969bd00d0ccd6486a5620a Mon Sep 17 00:00:00 2001 From: Jane Date: Fri, 9 Nov 2018 14:58:57 -0800 Subject: [PATCH 74/76] completed customer controller tests --- app/controllers/customers_controller.rb | 13 +- app/models/customer.rb | 2 +- test/controllers/customers_controller_test.rb | 71 ++++++++++ test/models/customer_test.rb | 133 +++++++++++++++++- 4 files changed, 210 insertions(+), 9 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index a9c03991e..110df4d26 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -22,10 +22,11 @@ def current current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "check_out_date", "due_date"]) if current_rentals.class != String if current_rentals.class == String #return the error - render json: {ok: false, message: overdue_rentals }, status: :not_found + render json: {ok: false, message: current_rentals }, status: :not_found elsif current_rentals == [] render json: { ok: true, message: "#{@customer.name} has 0 movies checked out."}, status: :ok else + current_rentals.map { |rental| { title: rental.movie.title, check_out_date: rental.check_out_date, due_date: rental.due_date } } render json: { current_rentals: current_rentals }, status: :ok end end @@ -35,12 +36,12 @@ def current # List the movies a customer has checked out in the past def history if @customer - current_rentals = @customer.find_rentals('returned') - current_rentals = Customer.paginate_check(current_rentals, cust_params["p"], cust_params["n"]) - current_rentals = Customer.sort_check(current_rentals, cust_params["sort"], ["title", "check_out_date", "due_date"]) if current_rentals.class != String + past_rentals = @customer.find_rentals('returned') + past_rentals = Customer.paginate_check(past_rentals, cust_params["p"], cust_params["n"]) + past_rentals = Customer.sort_check(past_rentals, cust_params["sort"], ["title", "check_out_date", "due_date"]) if past_rentals.class != String - if current_rentals.class == String #return the error - render json: {ok: false, message: overdue_rentals }, status: :not_found + if past_rentals.class == String #return the error + render json: {ok: false, message: past_rentals }, status: :not_found elsif past_rentals == [] render json: { ok: true, message: "#{@customer.name} has 0 past rentals."}, status: :ok else diff --git a/app/models/customer.rb b/app/models/customer.rb index 8b8799474..3bb784152 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -16,7 +16,7 @@ def check_in end def find_rentals(status) - current_rentals = self.rentals.where("status = '#{status}'").map { |rental| { title: rental.movie.title, check_out_date: rental.check_out_date, due_date: rental.due_date } } + current_rentals = self.rentals.where("status = '#{status}'") return current_rentals end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 232846324..149aebf64 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -48,7 +48,78 @@ expect(customer.keys.length).must_equal keys.length end end + end + + describe "current" do + it "returns current rentals with valid params" do + data = { + sort: "title" + } + customer = customers(:mike) + get current_movies_path(customer.id), params: data + + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + expect(body).must_be_kind_of Hash + end + + it "returns current rentals with no params" do + customer = customers(:mike) + get current_movies_path(customer.id) + + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + expect(body).must_be_kind_of Hash + end + + it "returns an error mesage with invalid params" do + data = { + sort: "toast" + } + customer = customers(:mike) + get current_movies_path(customer.id), params: data + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + expect(body).must_be_kind_of Hash + expect(body["message"]).must_equal "Unable to sort with 'toast'. Please resubmit with a valid sort parameter (#{["title", "check_out_date", "due_date"]})" + end + end + + describe "history" do + it "returns past rentals with valid params" do + data = { + sort: "title" + } + customer = customers(:mike) + get past_movies_path(customer.id), params: data + + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + expect(body).must_be_kind_of Hash + end + + it "returns past rentals with no params" do + customer = customers(:mike) + get past_movies_path(customer.id) + + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + expect(body).must_be_kind_of Hash + end + + it "returns an error mesage with invalid params" do + data = { + sort: "toast" + } + customer = customers(:mike) + get past_movies_path(customer.id), params: data + + body = JSON.parse(response.body) + expect(response.header['Content-Type']).must_include 'json' + expect(body).must_be_kind_of Hash + expect(body["message"]).must_equal "Unable to sort with 'toast'. Please resubmit with a valid sort parameter (#{["title", "check_out_date", "due_date"]})" + end end end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index b2e3481ef..a0f5c8efb 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,9 +1,8 @@ require "test_helper" - +require "pry" describe Customer do describe "relationships" do - it "has many rentals" do customer = customers(:mike) @@ -11,6 +10,7 @@ customer.rentals.each do |rental| rental.customer.must_be_kind_of Customer + rental.must_be_kind_of Rental end end @@ -58,4 +58,133 @@ end end + describe "check_out" do + it "updates the customer's movies_checked_out_count (+1)" do + customer = customers(:mike) + movies_checked_out_count = customer.movies_checked_out_count + + customer.check_out + expect(customer.movies_checked_out_count).must_equal movies_checked_out_count + 1 + end + end + + describe "check_in" do + it "updates the customer's movies_checked_out_count (-1)" do + customer = customers(:mike) + movies_checked_out_count = customer.movies_checked_out_count + + customer.check_in + expect(customer.movies_checked_out_count).must_equal movies_checked_out_count - 1 + end + end + + describe "find_rentals" do + + it "returns rentals with supplied status" do + customer = customers(:mike) + checked_out_rentals = customer.find_rentals("checked out") + + checked_out_rentals.each do |rental| + expect(rental).must_include :title + expect(rental).must_include :check_out_date + expect(rental).must_include :due_date + end + end + + end + + describe "paginate_check" do + it "returns rentals if n and p params are absent/nil" do + customer = customers(:mike) + current_rentals = Customer.paginate_check(customer.rentals, nil, nil) + + current_rentals.each do |rental| + expect(rental).must_be_kind_of Rental + end + + expect(rentals).must_be_kind_of Array + end + + it "returns a string if n OR p params are absent/nil" do + customer = customers(:mike) + current_rentals = Customer.paginate_check(customer.rentals, 1, nil) + + expect(current_rentals).must_be_kind_of String + expect(current_rentals).must_equal "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + end + + it "paginates rentals if n and p params are numeric and positive" do + n_params = 3 + p_params = 1 + customer = customers(:mike) + current_rentals = Customer.paginate_check(customer.rentals, p_params, n_params) + + expect(current_rentals.length).must_equal n_params + end + # + it "returns a string if n or p params are not numeric or positive" do + customer = customers(:mike) + current_rentals = Customer.paginate_check(customer.rentals, "hello", "nil") + expect(current_rentals).must_be_kind_of String + expect(current_rentals).must_equal "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + + current_rentals = Customer.paginate_check(customer.rentals, "-1", 2) + expect(current_rentals).must_be_kind_of String + expect(current_rentals).must_equal "Both 'p' and 'n' must be present and a number to paginate. Please resubmit with valid parameters." + end + end + + describe "sort_check" do + it "returns rentals if the params are nil" do + customer = customers(:mike) + customer_rentals = Customer.sort_check(customer.rentals, nil, ["title", "check_out_date", "due_date"]) + + customer_rentals.each do |rental| + expect(rental).must_be_kind_of Rental + end + + end + + it "returns rentals sorted by movie title if params are 'title'" do + customer = customers(:mike) + sorted_rentals = customer.rentals.joins(:movie).order("movies.title") + rentals = Customer.sort_check(customer.rentals, "title", ["title", "check_out_date", "due_date"]) + + rentals.each.with_index do |rental, index| + expect(rental).must_be_kind_of Rental + expect(rental.movie.title).must_equal sorted_rentals[index].movie.title + end + end + + it "returns rentals sorted by 'check_out_date' or 'due_date'" do + customer = customers(:mike) + sorted_rentals = customer.rentals.order("check_out_date") + rentals = Customer.sort_check(customer.rentals, "check_out_date", ["title", "check_out_date", "due_date"]) + + + rentals.each.with_index do |rental, index| + expect(rental).must_be_kind_of Rental + expect(rental.check_out_date).must_equal sorted_rentals[index].check_out_date + end + + sorted_rentals = customer.rentals.order("due_date") + rentals = Customer.sort_check(customer.rentals, "due_date", ["title", "check_out_date", "due_date"]) + + + rentals.each.with_index do |rental, index| + expect(rental).must_be_kind_of Rental + expect(rental.due_date).must_equal sorted_rentals[index].due_date + end + end + + it "returns a string if the params are invalid" do + customer = customers(:mike) + + toast = "toast" + rentals = Customer.sort_check(customer.rentals, "toast", ["title", "check_out_date", "due_date"]) + expect(rentals).must_be_kind_of String + expect(rentals).must_equal "Unable to sort with '#{toast}'. Please resubmit with a valid sort parameter (#{["title", "check_out_date", "due_date"]})" + end + end + end From 82dc121427e2dd5d75786dce3677dc515eea4023 Mon Sep 17 00:00:00 2001 From: Jane Date: Fri, 9 Nov 2018 15:01:25 -0800 Subject: [PATCH 75/76] fixed test --- test/models/customer_test.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index a0f5c8efb..c304473c8 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -85,9 +85,8 @@ checked_out_rentals = customer.find_rentals("checked out") checked_out_rentals.each do |rental| - expect(rental).must_include :title - expect(rental).must_include :check_out_date - expect(rental).must_include :due_date + expect(rental.status).must_equal "checked out" + expect(rental.customer).must_equal customer end end From ffb565fe0cfc57a06fe1221308e965b88c126474 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Fri, 9 Nov 2018 15:28:35 -0800 Subject: [PATCH 76/76] fixed the test --- app/controllers/movies_controller.rb | 21 ++++++++++--- app/controllers/rentals_controller.rb | 4 +-- app/models/movie.rb | 6 ++-- test/controllers/movies_controller_test.rb | 28 +++++++++++++++++ test/fixtures/movies.yml | 7 +++++ test/models/movie_test.rb | 36 ++++++++++++++++++++++ 6 files changed, 94 insertions(+), 8 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 5f2b8d26d..c1243466d 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -4,9 +4,19 @@ class MoviesController < ApplicationController def index if Movie.sort?(movie_params["sort"]) - movies = paginate_check.order(movie_params["sort"]) + if paginate_check.class != String + movies = paginate_check.order(movie_params["sort"]) + else + render json: {ok: false, message: paginate_check}, status: :not_found + return + end else - movies = paginate_check + if paginate_check.class != String + movies = paginate_check + else + render json: {ok: false, message: paginate_check}, status: :not_found + return + end end if movies @@ -88,11 +98,14 @@ def find_movie end def paginate_check - if movie_params["p"] && movie_params["n"] + # (movie_params["p"] !~ /\D/) && (movie_params["n"] !~ /\D/) + if (movie_params["p"] !~ /\D/) && (movie_params["n"] !~ /\D/) return Movie.paginate(:page => movie_params["p"], :per_page => movie_params["n"]) - else + elsif movie_params["p"] == nil && movie_params["p"] == nil return Movie.all + else + return "both P and n must be postive numbers " end end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 326410bac..7265b00b4 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -2,8 +2,8 @@ class RentalsController < ApplicationController def check_out rental = Rental.check_out(rental_params[:customer_id], rental_params[:movie_id]) - - if rental.save + movie = Movie.find_by(id:rental_params[:movie_id]) + if rental.save && movie.available_inventory > 0 rental.movie.check_out rental.customer.check_out diff --git a/app/models/movie.rb b/app/models/movie.rb index 82766edc5..1f4293885 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -28,8 +28,10 @@ def self.returned_rentals(movie) end def check_out - available_inventory_count = self.available_inventory - 1 - self.update(available_inventory: available_inventory_count) + if self.available_inventory > 0 + available_inventory_count = self.available_inventory - 1 + self.update(available_inventory: available_inventory_count) + end end def check_in diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 2dd310485..6d7657b41 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -101,6 +101,34 @@ expect(movie.keys.length).must_equal fields.length end end + + it "paginates movies if n and p params are numeric and positive" do + + params = {"sort"=>"title", "p"=>"1", "n"=>"3"} + + get movies_path, params: params + body = JSON.parse(response.body) + expect(body.length).must_equal 3 + end + + it "sort movies if sort param is title or release_date" do + + params = {"sort"=>"title", "p"=>"1", "n"=>"3"} + + get movies_path, params: params + body = JSON.parse(response.body) + expect(body.last["title"]).must_equal "Thorn" + end + + + it "returns a string if n or p params are not numeric or positive" do + params = {"sort"=>"title", "p"=>"test", "n"=>"test"} + get movies_path, params: params + body = JSON.parse(response.body) + + expect(body["message"]).must_equal "both P and n must be postive numbers " + + end end describe "show" do diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index a4eaa8393..2d9abdd92 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -21,3 +21,10 @@ titanic: release_date: 1997-11-05 inventory: 5 available_inventory: 5 + +thorn: + title: Thorn + overview: masterpiece + release_date: 1997-11-05 + inventory: 5 + available_inventory: 5 diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 575f709da..6f6b8ceaf 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -202,4 +202,40 @@ end end + describe "check_out" do + before do + @movie = movies(:thorn) + end + it "reduce the inventory by one " do + stock_before = @movie.available_inventory + @movie.check_out + stock_after = @movie.available_inventory + expect(stock_after).must_equal (stock_before - 1) + + end + + it "do not reduce the inventory to check out a movie with 0 availabe inventory" do + movie_2 = movies(:taken) + movie_2.check_out + stock_before = movie_2.available_inventory + movie_2.check_out + + stock_after = movie_2.available_inventory + + expect(stock_after).must_equal stock_before + end + end + + describe "check_in" do + before do + @movie = movies(:thorn) + end + it "increase the inventory by one " do + stock_before = @movie.available_inventory + @movie.check_in + stock_after = @movie.available_inventory + expect(stock_after).must_equal (stock_before + 1) + + end + end end