From dbb4a6f9f519c13ded52240429e8bd9343d702ee Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 12:06:41 -0800 Subject: [PATCH 01/30] new rails api --- .gitignore | 23 +++ .ruby-version | 1 + Gemfile | 59 ++++++ Gemfile.lock | 175 ++++++++++++++++++ Guardfile | 9 + Rakefile | 6 + app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/mailer.html.erb | 13 ++ app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 33 ++++ bin/spring | 17 ++ bin/update | 28 +++ config.ru | 5 + config/application.rb | 41 ++++ config/boot.rb | 4 + config/cable.yml | 10 + config/credentials.yml.enc | 1 + config/database.yml | 85 +++++++++ config/environment.rb | 5 + config/environments/development.rb | 54 ++++++ config/environments/production.rb | 85 +++++++++ config/environments/test.rb | 46 +++++ config/initializers/action_view.rb | 1 + .../application_controller_renderer.rb | 8 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/cors.rb | 16 ++ .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 ++ config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 ++ config/locales/en.yml | 33 ++++ config/puma.rb | 34 ++++ config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 ++++ lib/tasks/.keep | 0 log/.keep | 0 public/robots.txt | 1 + storage/.keep | 0 test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/test_helper.rb | 10 + tmp/.keep | 0 vendor/.keep | 0 58 files changed, 932 insertions(+) create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 Rakefile create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/action_view.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cors.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/spring.rb create mode 100644 config/storage.yml create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ea4b32f59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore uploaded files in development +/storage/* +!/storage/.keep + +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 000000000..160fe391c --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.5.5 \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..8143da43e --- /dev/null +++ b/Gemfile @@ -0,0 +1,59 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.5.5' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.3' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +# gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false + +# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible +# gem 'rack-cors' + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'debase', '>= 0.2.4.1' + gem 'ruby-debug-ide', '>= 0.7.0' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..981f08e8a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,175 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.2.3) + actionpack (= 5.2.3) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.2.3) + actionview (= 5.2.3) + activesupport (= 5.2.3) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.3) + activesupport (= 5.2.3) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.3) + activesupport (= 5.2.3) + globalid (>= 0.3.6) + activemodel (5.2.3) + activesupport (= 5.2.3) + activerecord (5.2.3) + activemodel (= 5.2.3) + activesupport (= 5.2.3) + arel (>= 9.0) + activestorage (5.2.3) + actionpack (= 5.2.3) + activerecord (= 5.2.3) + marcel (~> 0.3.1) + activesupport (5.2.3) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + ansi (1.5.0) + arel (9.0.0) + bootsnap (1.4.5) + msgpack (~> 1.0) + builder (3.2.3) + byebug (11.0.1) + coderay (1.1.2) + concurrent-ruby (1.1.5) + crass (1.0.5) + debase (0.2.4.1) + debase-ruby_core_source (>= 0.10.2) + debase-ruby_core_source (0.10.6) + erubi (1.9.0) + ffi (1.11.1) + globalid (0.4.2) + activesupport (>= 4.2.0) + i18n (1.7.0) + concurrent-ruby (~> 1.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.3.1) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (0.9.2) + mimemagic (0.3.3) + mini_mime (1.0.2) + mini_portile2 (2.4.0) + minitest (5.13.0) + minitest-rails (5.2.0) + minitest (~> 5.10) + railties (~> 5.2.0) + minitest-reporters (1.4.2) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.3.1) + nio4r (2.5.2) + nokogiri (1.10.5) + mini_portile2 (~> 2.4.0) + pg (1.1.4) + pry (0.12.2) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.9) + pry (>= 0.10.4) + puma (3.12.1) + rack (2.0.7) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.3) + actioncable (= 5.2.3) + actionmailer (= 5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) + activemodel (= 5.2.3) + activerecord (= 5.2.3) + activestorage (= 5.2.3) + activesupport (= 5.2.3) + bundler (>= 1.3.0) + railties (= 5.2.3) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + railties (5.2.3) + actionpack (= 5.2.3) + activesupport (= 5.2.3) + method_source + rake (>= 0.8.7) + thor (>= 0.19.0, < 2.0) + rake (13.0.0) + rb-fsevent (0.10.3) + rb-inotify (0.10.0) + ffi (~> 1.0) + ruby-debug-ide (0.7.0) + rake (>= 0.8.1) + ruby-progressbar (1.10.1) + ruby_dep (1.5.0) + spring (2.1.0) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (4.0.0) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.3) + thread_safe (0.3.6) + tzinfo (1.2.5) + thread_safe (~> 0.1) + websocket-driver (0.7.1) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.4) + +PLATFORMS + ruby + +DEPENDENCIES + bootsnap (>= 1.1.0) + byebug + debase (>= 0.2.4.1) + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 3.11) + rails (~> 5.2.3) + ruby-debug-ide (>= 0.7.0) + spring + spring-watcher-listen (~> 2.0.0) + tzinfo-data + +RUBY VERSION + ruby 2.5.5p157 + +BUNDLED WITH + 2.0.2 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..d89ee495f --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads Spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == 'spring' } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/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..56f84c20c --- /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..6cc616cd1 --- /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: video-store-api_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 000000000..5bf73597b --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +fRO1QzPHiXc7Rv9hvLWxukJF/mXIa4Y/ceQCYu6y9qaTz/7TsVSw2aZr9nzQmx+r0tqADF7RT1JCeYfRtPxO//2ovEYGb46BZHff0fKd0PI4arWXZKwa0v2d+vVUnTVix+VXesDS4o2zXPAHwUWc9PWFFw5Ckp4e/8H+BYj36qX7tdjexxJ75FoHe9admzutUrUyNAyOPgZREUVN5cYBfHs1qsUxPAGH4GUvse51iUs0JBoaB0uDrFY3ehi8Ahw6hLakhbPuwR1JbXdt5xu0j207tvGvE7rV5KCED0H0ZKqH7PwP1rkxcIB1VkzCnWZGsEa01nb1va2FQetmh0xXWwj4LXtJ1P+fX5F+Ntll65VaeIDCmuOLyBggU0P7Sw5BCwbmUodIzAWrQqVVYFxt5sNezATySNRf4fXE--Li1rDJ+ALdYfEn0d--by8UxJQDkH8I/HXI+kQNeg== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 000000000..25f76c8e1 --- /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: video-store-api_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: video-store-api + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: video-store-api_test + +# As with config/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: video-store-api_production + username: video-store-api + password: <%= ENV['VIDEO-STORE-API_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 000000000..426333bb4 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 000000000..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..5f023a796 --- /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 = "video-store-api_#{Rails.env}" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 000000000..0a38fd3ce --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,46 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 000000000..142d382f8 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1 @@ +Rails.application.config.action_view.form_with_generates_remote_forms = false diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 000000000..59385cdf3 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb new file mode 100644 index 000000000..3b1c1b5ed --- /dev/null +++ b/config/initializers/cors.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Avoid CORS issues when API is called from the frontend app. +# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. + +# Read more: https://github.com/cyu/rack-cors + +# Rails.application.config.middleware.insert_before 0, Rack::Cors do +# allow do +# origins 'example.com' +# +# resource '*', +# headers: :any, +# methods: [:get, :post, :put, :patch, :delete, :options, :head] +# end +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 000000000..4a994e1e7 --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 000000000..ac033bf9d --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 000000000..dc1899682 --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 000000000..bbfc3961b --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 000000000..decc5a857 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 000000000..a5eccf816 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,34 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 000000000..787824f88 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html +end diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..9fa7863f9 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w[ + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +].each { |path| Spring.watch(path) } diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 000000000..d32f76e8f --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/log/.keep b/log/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..37b576a4a --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 000000000..3ab84e3d1 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,10 @@ +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/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 8d8dc210c41c885ec26e8e533b16c03b0d9c2558 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 12:12:35 -0800 Subject: [PATCH 02/30] Movie and Customer Model --- app/models/customer.rb | 2 + app/models/movie.rb | 2 + db/migrate/20191105200845_create_movies.rb | 12 ++++++ db/migrate/20191105201203_create_customers.rb | 15 +++++++ db/schema.rb | 39 +++++++++++++++++++ test/models/customer_test.rb | 7 ++++ test/models/movie_test.rb | 7 ++++ 7 files changed, 84 insertions(+) create mode 100644 app/models/customer.rb create mode 100644 app/models/movie.rb create mode 100644 db/migrate/20191105200845_create_movies.rb create mode 100644 db/migrate/20191105201203_create_customers.rb create mode 100644 db/schema.rb create mode 100644 test/models/customer_test.rb create mode 100644 test/models/movie_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/db/migrate/20191105200845_create_movies.rb b/db/migrate/20191105200845_create_movies.rb new file mode 100644 index 000000000..95d31e0f8 --- /dev/null +++ b/db/migrate/20191105200845_create_movies.rb @@ -0,0 +1,12 @@ +class CreateMovies < ActiveRecord::Migration[5.2] + def change + create_table :movies do |t| + t.string :title + t.string :overview + t.string :release_date + t.integer :inventory + + t.timestamps + end + end +end diff --git a/db/migrate/20191105201203_create_customers.rb b/db/migrate/20191105201203_create_customers.rb new file mode 100644 index 000000000..d05cb792c --- /dev/null +++ b/db/migrate/20191105201203_create_customers.rb @@ -0,0 +1,15 @@ +class CreateCustomers < ActiveRecord::Migration[5.2] + def change + create_table :customers do |t| + t.string :name + t.string :registered_at + t.string :address + t.string :city + t.string :state + t.string :postal_code + t.string :phone + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..e87428cce --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,39 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2019_11_05_201203) 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.string "registered_at" + t.string "address" + t.string "city" + t.string "state" + t.string "postal_code" + t.string "phone" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "movies", force: :cascade do |t| + t.string "title" + t.string "overview" + t.string "release_date" + t.integer "inventory" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb new file mode 100644 index 000000000..30d5c5309 --- /dev/null +++ b/test/models/customer_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Customer do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb new file mode 100644 index 000000000..cd59ab14a --- /dev/null +++ b/test/models/movie_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Movie do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 6071afec091b50ef881d3971967d5cd020dfc973 Mon Sep 17 00:00:00 2001 From: Mira Date: Tue, 5 Nov 2019 13:21:41 -0800 Subject: [PATCH 03/30] generates movies controller --- app/controllers/movies_controller.rb | 5 +++++ config/routes.rb | 2 +- test/controllers/movies_controller_test.rb | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 app/controllers/movies_controller.rb create mode 100644 test/controllers/movies_controller_test.rb diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb new file mode 100644 index 000000000..3bcf2c2e0 --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,5 @@ +class MoviesController < ApplicationController + def it_works + render json: "it_works", status: :ok + end +end diff --git a/config/routes.rb b/config/routes.rb index 787824f88..54b72c860 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,3 @@ Rails.application.routes.draw do - # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + get 'zomg', to: 'movies#it_works' end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb new file mode 100644 index 000000000..b11d50cea --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MoviesController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 5fb561784b3c40665758eb4850181b12d0848547 Mon Sep 17 00:00:00 2001 From: Mira Date: Tue, 5 Nov 2019 13:23:35 -0800 Subject: [PATCH 04/30] generates customers controller --- app/controllers/customers_controller.rb | 2 ++ test/controllers/customers_controller_test.rb | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 app/controllers/customers_controller.rb create mode 100644 test/controllers/customers_controller_test.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb new file mode 100644 index 000000000..ca3b6e024 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,2 @@ +class CustomersController < ApplicationController +end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb new file mode 100644 index 000000000..61881e925 --- /dev/null +++ b/test/controllers/customers_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe CustomersController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From edfaf18e03d971162e1be342459b9cb42c87e6fa Mon Sep 17 00:00:00 2001 From: Mira Date: Tue, 5 Nov 2019 13:41:06 -0800 Subject: [PATCH 05/30] adds minitest --- test/test_helper.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 3ab84e3d1..a9f6a954c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,6 +1,11 @@ ENV['RAILS_ENV'] ||= 'test' require_relative '../config/environment' require 'rails/test_help' +require 'minitest/autorun' +require 'minitest/rails' +require 'minitest/reporters' + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. From 3b5fc6ea2ff259e1c8c1db7e4a3b562d9f4be3f9 Mon Sep 17 00:00:00 2001 From: Mira Date: Tue, 5 Nov 2019 13:55:30 -0800 Subject: [PATCH 06/30] some customer fixtures --- test/fixtures/customers.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 test/fixtures/customers.yml diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml new file mode 100644 index 000000000..1551b1070 --- /dev/null +++ b/test/fixtures/customers.yml @@ -0,0 +1,17 @@ +shelley: + name: "Shelley Rocha" + registered_at: "Wed, 29 Apr 2015 07:54:14 -0700" + address: "Ap #292-5216 Ipsum Rd." + city: "Hillsboro" + state: "OR" + postal_code: "24309" + phone: "(322) 510-8695" + +curran: + name: "Curran Stout" + registered_at: "Wed, 16 Apr 2014 21:40:20 -0700" + address: "Ap #658-1540 Erat Rd." + city: "San Francisco" + state: "California" + postal_code: "94267" + phone: "(908) 949-6758" From ab336c12a9c92bc1b8654422116581338183f9ea Mon Sep 17 00:00:00 2001 From: Mira Date: Tue, 5 Nov 2019 13:58:46 -0800 Subject: [PATCH 07/30] index for customers --- app/controllers/customers_controller.rb | 4 ++++ config/routes.rb | 2 +- test/controllers/customers_controller_test.rb | 24 ++++++++++++++++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index ca3b6e024..24a056cd2 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,2 +1,6 @@ class CustomersController < ApplicationController + def index + customers = Customer.all + render json: customers.as_json(only: [:id, :name, :registered_at, :postal_code, :phone]) + end end diff --git a/config/routes.rb b/config/routes.rb index 54b72c860..96d2b4e1e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,3 @@ Rails.application.routes.draw do - get 'zomg', to: 'movies#it_works' + resources :customers, only: [:index] end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 61881e925..b184f6b87 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -1,7 +1,25 @@ require "test_helper" describe CustomersController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe 'index' do + it 'responds with json and success' do + get customers_path + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :ok + end + + it 'responds with an array of customer hashes' do + get customers_path + + body = JSON.parse(response.body) + + expect(body).must_be_instance_of Array + expect(body.count).must_equal Customer.count + + body.each do |customer| + expect(customer).must_be_instance_of Hash + expect(customer.keys.sort).must_equal ["id", "name", "phone", "postal_code", "registered_at"] + end + end + end end From b4443013845824b3dc889287e6cbf2a0e994ae65 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 14:13:27 -0800 Subject: [PATCH 08/30] Movies#Index action --- app/controllers/movies_controller.rb | 5 +++-- config/routes.rb | 1 + test/controllers/movies_controller_test.rb | 24 +++++++++++++++++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 3bcf2c2e0..19b6167b1 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,5 +1,6 @@ class MoviesController < ApplicationController - def it_works - render json: "it_works", status: :ok + def index + movies = Movie.all + render json: movies.as_json(only: [:id, :release_date, :title]), status: :ok end end diff --git a/config/routes.rb b/config/routes.rb index 96d2b4e1e..afbbeaf9f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,4 @@ Rails.application.routes.draw do resources :customers, only: [:index] + resources :movies, only: [:index] end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index b11d50cea..0de244f02 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,7 +1,25 @@ require "test_helper" describe MoviesController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe 'index' do + it 'responds with json and success' do + get movies_path + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :ok + end + + it 'responds with an array of movie hashes' do + get movies_path + + body = JSON.parse(response.body) + + expect(body).must_be_instance_of Array + expect(body.count).must_equal Movie.count + + body.each do |movie| + expect(movie).must_be_instance_of Hash + expect(movie.keys.sort).must_equal ["id", "release_date", "title"] + end + end + end end From ab044816bab8a3fde3b0805173ddca4418e2205d Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 14:26:38 -0800 Subject: [PATCH 09/30] Movies#show action --- app/controllers/movies_controller.rb | 9 +++++++ config/routes.rb | 2 +- test/controllers/movies_controller_test.rb | 28 ++++++++++++++++++++++ test/fixtures/movies.yml | 10 ++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/movies.yml diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 19b6167b1..92aa7d740 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -3,4 +3,13 @@ def index movies = Movie.all render json: movies.as_json(only: [:id, :release_date, :title]), status: :ok end + + def show + movie = Movie.find_by(id: params[:id]) + if movie + render json: movie.as_json(only: [:id, :release_date, :title]), status: :ok + else + render json: {"errors" => {"id" => ["Movie with id #{params[:id]} not found."]}} + end + end end diff --git a/config/routes.rb b/config/routes.rb index afbbeaf9f..431481737 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,4 @@ Rails.application.routes.draw do resources :customers, only: [:index] - resources :movies, only: [:index] + resources :movies, only: [:index, :show] end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 0de244f02..703643eb3 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -4,6 +4,7 @@ describe 'index' do it 'responds with json and success' do get movies_path + expect(response.header['Content-Type']).must_include 'json' must_respond_with :ok end @@ -22,4 +23,31 @@ end end end + + describe "show" do + it 'responds with json and success' do + get movie_path(movies(:first)) + + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :ok + end + + it 'responds with the correct movie hash' do + get movie_path(movies(:second)) + + body = JSON.parse(response.body) + + expect(body).must_be_instance_of Hash + expect(body["title"]).must_equal movies(:second).title + end + + it 'responds with error when given incorrect parameter' do + get movie_path(-1) + + body = JSON.parse(response.body) + + expect(body).must_be_instance_of Hash + expect(body["errors"]["id"]).must_equal ["Movie with id -1 not found."] + end + end end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml new file mode 100644 index 000000000..239ccdf64 --- /dev/null +++ b/test/fixtures/movies.yml @@ -0,0 +1,10 @@ +first: + title: "Blacksmith Of The Banished" + overview: "The unexciting life of a boy will be permanently altered as a strange woman enters his life." + release_date: "1979-01-18" + inventory: 10 +second: + title: "Savior Of The Curse" + overview: "The strange woman claims the boy has a DNA strain which very likely offers the key to cure several crippling diseases. Tests will have to be done, but the key to save millions of lives is within the grasp of science through this DNA strain. Unsure what to think of all this and of this strange woman, the boy hesitantly agrees to the proposal, there's something exciting about this whole situation, surely the right choice was made." + release_date: "2010-11-05" + inventory: 1 From 19c037931b0750d690a62c96383cbd7258faa84d Mon Sep 17 00:00:00 2001 From: Mira Date: Tue, 5 Nov 2019 14:47:57 -0800 Subject: [PATCH 10/30] validations for movie --- app/models/movie.rb | 4 ++++ test/models/movie_test.rb | 49 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index dc614df15..c70c4dbf5 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,2 +1,6 @@ class Movie < ApplicationRecord + validates :title, presence: true + validates :overview, presence: true + validates :release_date, presence: true + validates :inventory, presence: true, numericality: true end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index cd59ab14a..b6402d225 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,7 +1,50 @@ require "test_helper" describe Movie do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe 'validations' do + before do + @movie = Movie.new(title: "titanic", overview: "long", release_date: "1990-03-20", inventory: 10) + end + + it 'can make a movie with a title' do + assert @movie.valid? + end + + it 'wont make a movie without a title' do + @movie[:title] = nil + refute @movie.valid? + end + + it 'can make a movie with a overview' do + assert @movie.valid? + end + + it 'wont make a movie without a overview' do + @movie[:overview] = nil + refute @movie.valid? + end + + it 'can make a movie with a release_date' do + assert @movie.valid? + end + + it 'wont make a movie without a release_date' do + @movie[:release_date] = nil + refute @movie.valid? + end + + it 'can make a movie with a inventory' do + assert @movie.valid? + end + + it 'wont make a movie without a inventory' do + @movie[:inventory] = nil + refute @movie.valid? + end + + it 'wont make a movie with a non-numeric inventory' do + @movie[:inventory] = "x" + refute @movie.valid? + end + end end From 424db42f24396768b70567bb6ba5d1a90f3e0571 Mon Sep 17 00:00:00 2001 From: Mira Date: Tue, 5 Nov 2019 15:34:37 -0800 Subject: [PATCH 11/30] create for movie --- app/controllers/movies_controller.rb | 20 ++++++++++++++ config/routes.rb | 2 +- test/controllers/movies_controller_test.rb | 31 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 92aa7d740..e1e084604 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -12,4 +12,24 @@ def show render json: {"errors" => {"id" => ["Movie with id #{params[:id]} not found."]}} end end + + def create + movie = Movie.new(movie_params) + + if movie.save + render json: movie.as_json(only: [:id]) + return + else + render json: { + ok: false, + errors: movie.errors.messages + }, status: :bad_request + return + end + end + + private + def movie_params + params.require(:movie).permit(:title, :overview, :release_date, :inventory) + end end diff --git a/config/routes.rb b/config/routes.rb index 431481737..3f106f46a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,4 @@ Rails.application.routes.draw do resources :customers, only: [:index] - resources :movies, only: [:index, :show] + resources :movies, only: [:index, :show, :create] end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 703643eb3..cac3afb61 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -50,4 +50,35 @@ expect(body["errors"]["id"]).must_equal ["Movie with id -1 not found."] end end + + describe 'create' do + before do + @movie_params = { movie: { title: "test", overview: "test movie", release_date: "today", inventory: 4 } } + end + + it 'responds with json and success' do + post movies_path, params: @movie_params + + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :ok + end + + it 'stores the movie info in the db and returns id' do + expect { post movies_path, params: @movie_params }.must_change "Movie.count", 1 + + movie = Movie.find_by(title: "test") + + assert movie + expect(movie.overview).must_equal "test movie" + end + + it 'wont save a bad movie' do + movie_params = { movie: { title: nil, overview: "stinker", release_date: "today", inventory: 4 } } + + expect { post movies_path, params: movie_params }.wont_change "Movie.count" + + body = JSON.parse(response.body) + expect(body["errors"]["title"]).must_equal ["can't be blank"] + end + end end From 05eeaf0602fb3489a9ea0646c444a3a291f1b824 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 16:13:02 -0800 Subject: [PATCH 12/30] Migration, Smoke Tests Pass --- app/controllers/movies_controller.rb | 8 ++++---- .../20191106000248_add_available_inventory_to_movie.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20191106000248_add_available_inventory_to_movie.rb diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index e1e084604..b179f1335 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,13 +1,13 @@ class MoviesController < ApplicationController def index movies = Movie.all - render json: movies.as_json(only: [:id, :release_date, :title]), status: :ok + render json: movies.as_json(only: [:id, :release_date, :title, :overview, :inventory, :available_inventory]), status: :ok end def show movie = Movie.find_by(id: params[:id]) if movie - render json: movie.as_json(only: [:id, :release_date, :title]), status: :ok + render json: movie.as_json(only: [:id, :release_date, :title, :overview, :inventory, :available_inventory]), status: :ok else render json: {"errors" => {"id" => ["Movie with id #{params[:id]} not found."]}} end @@ -17,7 +17,7 @@ def create movie = Movie.new(movie_params) if movie.save - render json: movie.as_json(only: [:id]) + render json: movie.as_json(only: [:id]), status: :ok return else render json: { @@ -30,6 +30,6 @@ def create private def movie_params - params.require(:movie).permit(:title, :overview, :release_date, :inventory) + params.permit(:title, :overview, :release_date, :inventory) end end diff --git a/db/migrate/20191106000248_add_available_inventory_to_movie.rb b/db/migrate/20191106000248_add_available_inventory_to_movie.rb new file mode 100644 index 000000000..3f18628b2 --- /dev/null +++ b/db/migrate/20191106000248_add_available_inventory_to_movie.rb @@ -0,0 +1,5 @@ +class AddAvailableInventoryToMovie < 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 e87428cce..6bf14bb4a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_11_05_201203) do +ActiveRecord::Schema.define(version: 2019_11_06_000248) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -34,6 +34,7 @@ t.integer "inventory" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "available_inventory" end end From 639abf364cc19a419aa2cc11cd128d954f374af7 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 16:34:41 -0800 Subject: [PATCH 13/30] fixed failing tests --- app/controllers/customers_controller.rb | 2 +- app/controllers/movies_controller.rb | 3 ++- .../20191106001525_movies_checked_out_count_to_customer.rb | 5 +++++ db/schema.rb | 3 ++- test/controllers/customers_controller_test.rb | 2 +- test/controllers/movies_controller_test.rb | 6 +++--- 6 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20191106001525_movies_checked_out_count_to_customer.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 24a056cd2..013c9daa9 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,6 +1,6 @@ class CustomersController < ApplicationController def index customers = Customer.all - render json: customers.as_json(only: [:id, :name, :registered_at, :postal_code, :phone]) + render json: customers.as_json(only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count]) end end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index b179f1335..6dbec5cba 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -14,6 +14,7 @@ def show end def create + movie = Movie.new(movie_params) if movie.save @@ -30,6 +31,6 @@ def create private def movie_params - params.permit(:title, :overview, :release_date, :inventory) + params.permit(:title, :overview, :release_date, :inventory).merge({ available_inventory: params[:inventory]} ) end end diff --git a/db/migrate/20191106001525_movies_checked_out_count_to_customer.rb b/db/migrate/20191106001525_movies_checked_out_count_to_customer.rb new file mode 100644 index 000000000..3af4a7d6e --- /dev/null +++ b/db/migrate/20191106001525_movies_checked_out_count_to_customer.rb @@ -0,0 +1,5 @@ +class MoviesCheckedOutCountToCustomer < ActiveRecord::Migration[5.2] + def change + add_column :customers, :movies_checked_out_count, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 6bf14bb4a..5a6bd1dca 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_11_06_000248) do +ActiveRecord::Schema.define(version: 2019_11_06_001525) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -25,6 +25,7 @@ t.string "phone" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "movies_checked_out_count" end create_table "movies", force: :cascade do |t| diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index b184f6b87..d15bdb66c 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -18,7 +18,7 @@ body.each do |customer| expect(customer).must_be_instance_of Hash - expect(customer.keys.sort).must_equal ["id", "name", "phone", "postal_code", "registered_at"] + expect(customer.keys.sort).must_equal ["id", "movies_checked_out_count", "name", "phone", "postal_code", "registered_at"] end end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index cac3afb61..8fe87b667 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -19,7 +19,7 @@ body.each do |movie| expect(movie).must_be_instance_of Hash - expect(movie.keys.sort).must_equal ["id", "release_date", "title"] + expect(movie.keys.sort).must_equal ["available_inventory", "id", "inventory", "overview", "release_date", "title"] end end end @@ -53,7 +53,7 @@ describe 'create' do before do - @movie_params = { movie: { title: "test", overview: "test movie", release_date: "today", inventory: 4 } } + @movie_params = { title: "test", overview: "test movie", release_date: "today", inventory: 4 } end it 'responds with json and success' do @@ -73,7 +73,7 @@ end it 'wont save a bad movie' do - movie_params = { movie: { title: nil, overview: "stinker", release_date: "today", inventory: 4 } } + movie_params = { title: nil, overview: "stinker", release_date: "today", inventory: 4 } expect { post movies_path, params: movie_params }.wont_change "Movie.count" From 2cafa6601d2463fb93b3be14786c2f70bb65b54e Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 16:46:32 -0800 Subject: [PATCH 14/30] Migrations adding relations --- db/migrate/20191106003718_create_rentals.rb | 10 ++++++++++ .../20191106004112_add_rentals_to_customer.rb | 5 +++++ .../20191106004446_add_movies_to_rentals.rb | 5 +++++ db/schema.rb | 15 ++++++++++++++- 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20191106003718_create_rentals.rb create mode 100644 db/migrate/20191106004112_add_rentals_to_customer.rb create mode 100644 db/migrate/20191106004446_add_movies_to_rentals.rb diff --git a/db/migrate/20191106003718_create_rentals.rb b/db/migrate/20191106003718_create_rentals.rb new file mode 100644 index 000000000..1d62d454c --- /dev/null +++ b/db/migrate/20191106003718_create_rentals.rb @@ -0,0 +1,10 @@ +class CreateRentals < ActiveRecord::Migration[5.2] + def change + create_table :rentals do |t| + t.datetime :due_date + t.datetime :checkout_date + + t.timestamps + end + end +end diff --git a/db/migrate/20191106004112_add_rentals_to_customer.rb b/db/migrate/20191106004112_add_rentals_to_customer.rb new file mode 100644 index 000000000..5e1cbbc4b --- /dev/null +++ b/db/migrate/20191106004112_add_rentals_to_customer.rb @@ -0,0 +1,5 @@ +class AddRentalsToCustomer < ActiveRecord::Migration[5.2] + def change + add_reference :rentals, :customer, foreign_key: true + end +end diff --git a/db/migrate/20191106004446_add_movies_to_rentals.rb b/db/migrate/20191106004446_add_movies_to_rentals.rb new file mode 100644 index 000000000..cbc96ccbe --- /dev/null +++ b/db/migrate/20191106004446_add_movies_to_rentals.rb @@ -0,0 +1,5 @@ +class AddMoviesToRentals < ActiveRecord::Migration[5.2] + def change + add_reference :rentals, :movie, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 5a6bd1dca..96dfac732 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_11_06_001525) do +ActiveRecord::Schema.define(version: 2019_11_06_004446) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -38,4 +38,17 @@ t.integer "available_inventory" end + create_table "rentals", force: :cascade do |t| + t.datetime "due_date" + t.datetime "checkout_date" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.bigint "customer_id" + t.bigint "movie_id" + t.index ["customer_id"], name: "index_rentals_on_customer_id" + t.index ["movie_id"], name: "index_rentals_on_movie_id" + end + + add_foreign_key "rentals", "customers" + add_foreign_key "rentals", "movies" end From 03789aa67637bef962d68664623a5c155fdd8dd9 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 16:47:36 -0800 Subject: [PATCH 15/30] Rental Model and Test --- app/models/rental.rb | 2 ++ test/models/rental_test.rb | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 app/models/rental.rb create mode 100644 test/models/rental_test.rb diff --git a/app/models/rental.rb b/app/models/rental.rb new file mode 100644 index 000000000..79e3a65ca --- /dev/null +++ b/app/models/rental.rb @@ -0,0 +1,2 @@ +class Rental < ApplicationRecord +end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb new file mode 100644 index 000000000..3e64959b4 --- /dev/null +++ b/test/models/rental_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Rental do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 35c1fca33ca445005259f8ac3108808a39e0c227 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 16:50:13 -0800 Subject: [PATCH 16/30] Relations to rentals for Customer and Movie --- app/models/customer.rb | 1 + app/models/movie.rb | 2 ++ test/models/customer_test.rb | 10 +++++++--- test/models/movie_test.rb | 8 ++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) 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 c70c4dbf5..265187556 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -3,4 +3,6 @@ class Movie < ApplicationRecord validates :overview, presence: true validates :release_date, presence: true validates :inventory, presence: true, numericality: true + + has_many :rentals end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 30d5c5309..e3545350f 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,7 +1,11 @@ require "test_helper" describe Customer do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe 'relations' do + it 'has many rentals' do + customer = customers(:shelley) + + expect(customer).must_respond_to(:rentals) + end + end end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index b6402d225..a3a986186 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -47,4 +47,12 @@ refute @movie.valid? end end + + describe 'relations' do + it 'has many rentals' do + movie = movies(:first) + + expect(movie).must_respond_to(:rentals) + end + end end From 4d8046dcbb62c3775f7fce566c225eeb9002f13b Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Tue, 5 Nov 2019 16:54:22 -0800 Subject: [PATCH 17/30] Belongs_to relations for Rental --- app/models/rental.rb | 2 ++ test/models/rental_test.rb | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index 79e3a65ca..e001ff37c 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,2 +1,4 @@ class Rental < ApplicationRecord + belongs_to :customer + belongs_to :movie end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 3e64959b4..d443e3dfa 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,7 +1,13 @@ require "test_helper" describe Rental do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe 'relations' do + it 'belongs to a movie' do + expect(Rental.new).must_respond_to(:movie) + end + + it 'belongs to a customer' do + expect(Rental.new).must_respond_to(:customer) + end + end end From b0c6ef8e4ecef7548799d685ca4c28658720f14e Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Wed, 6 Nov 2019 12:43:18 -0800 Subject: [PATCH 18/30] routes for movies#checkin and movies#checkout --- config/routes.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 3f106f46a..4927bf93d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,7 @@ Rails.application.routes.draw do resources :customers, only: [:index] resources :movies, only: [:index, :show, :create] + + post "/rentals/check-out", to: "movies#checkout", as: "checkout_movie" + post "/rentals/check-in", to: "movies#checkin", as: "checkin_movie" end From 9b1ff234a03a3cf7ed4880e2f3c0e94d311a4c63 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Wed, 6 Nov 2019 12:44:30 -0800 Subject: [PATCH 19/30] routes update --- config/routes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 4927bf93d..33e66b694 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,6 @@ resources :customers, only: [:index] resources :movies, only: [:index, :show, :create] - post "/rentals/check-out", to: "movies#checkout", as: "checkout_movie" - post "/rentals/check-in", to: "movies#checkin", as: "checkin_movie" + post "/rentals/check-out", to: "rentals#checkout", as: "checkout" + post "/rentals/check-in", to: "rentals#checkin", as: "checkin" end From 1523b155c3a536030d6a7aebc6a3eefd1f70721a Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Wed, 6 Nov 2019 13:56:18 -0800 Subject: [PATCH 20/30] rental model tests --- app/controllers/rentals_controller.rb | 2 ++ test/controllers/rentals_controller_test.rb | 9 +++++ test/fixtures/rentals.yml | 3 ++ test/models/rental_test.rb | 37 +++++++++++++++++++-- 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 app/controllers/rentals_controller.rb create mode 100644 test/controllers/rentals_controller_test.rb create mode 100644 test/fixtures/rentals.yml diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb new file mode 100644 index 000000000..58c72b791 --- /dev/null +++ b/app/controllers/rentals_controller.rb @@ -0,0 +1,2 @@ +class RentalsController < ApplicationController +end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb new file mode 100644 index 000000000..44e27aee2 --- /dev/null +++ b/test/controllers/rentals_controller_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe RentalsController do + describe "checkout" do + end + + describe "checkin" do + end +end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml new file mode 100644 index 000000000..c12001b31 --- /dev/null +++ b/test/fixtures/rentals.yml @@ -0,0 +1,3 @@ +one: + customer: shelley + movie: first \ No newline at end of file diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index d443e3dfa..0bcb46be7 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -3,11 +3,44 @@ describe Rental do describe 'relations' do it 'belongs to a movie' do - expect(Rental.new).must_respond_to(:movie) + expect(rentals(:one)).must_respond_to(:movie) + expect(rentals(:one).movie).must_be_instance_of Movie end it 'belongs to a customer' do - expect(Rental.new).must_respond_to(:customer) + expect(rentals(:one)).must_respond_to(:customer) + expect(rentals(:one).customer).must_be_instance_of Customer + end + end + + describe 'model methods' do + describe 'checkout' do + it "should respond with JSON, created, & store a rental in the db for an existing customer and movie" do + + end + + it "should decrement the available inventory of movies" do + end + + it "should increment the number of movies checked out for a customer" do + end + + it "customer but no movie" do + end + + it "movie but no customer" do + end + + it "no movie no customer" do + end + + it "won't check out an unavailable movie" do + + end + end + + describe 'checkin' do + end end end From cf33a33a4c5a0a2e0e39788ad5d43649cb2c2275 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Thu, 7 Nov 2019 09:05:38 -0800 Subject: [PATCH 21/30] saving work --- app/controllers/rentals_controller.rb | 29 +++++++++++++++++++++ app/models/rental.rb | 19 ++++++++++++++ config/routes.rb | 2 +- test/controllers/rentals_controller_test.rb | 9 +++++++ test/models/rental_test.rb | 25 +++++++++++------- 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 58c72b791..3e7ad9dd3 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,2 +1,31 @@ class RentalsController < ApplicationController + def checkout + + rental = Rental.new(customer_id: params[:customer_id], movie_id: params[:movie_id]) + + if rental.save + + render json: rental.as_json(only: [:id]), status: :ok + return + else + render json: { + ok: false, + errors: rental.errors.messages + }, status: :bad_request + return + end + end + + + # new_rental Rental.new(params params) + # new_rental.checkout + + # if rental.checkout + # else + # #not save + # end + + + def checkin + end end diff --git a/app/models/rental.rb b/app/models/rental.rb index e001ff37c..591118bc3 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,4 +1,23 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :movie + validate :available + + def available + if rental.movie.available_inventory == 0 + errors.add(:availability, "can't check out a movie that is not in stock" + else + checkout + end + end + + def checkout + movie.available_inventory -= 1 + customer.movies_checked_out_count += 1 + @checkout_date = Date.now + # make this work + @due_date = checkout_date + 7 + self.save + end + end diff --git a/config/routes.rb b/config/routes.rb index 33e66b694..add9e2c18 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,5 +3,5 @@ resources :movies, only: [:index, :show, :create] post "/rentals/check-out", to: "rentals#checkout", as: "checkout" - post "/rentals/check-in", to: "rentals#checkin", as: "checkin" + post "/rentals/check-in", to: "rentals#checkin", as: "check-in" end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 44e27aee2..475006ac2 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -2,6 +2,15 @@ describe RentalsController do describe "checkout" do + + # it "should respond with JSON, created, & store a rental in the db for an existing customer and movie" do + # checkout_params = { customer_id: customers(:shelley), movie_id: movies(:first) } + + # post 'rentals/check-out', params: checkout_params + + # expect(response.header['Content-Type']).must_include 'json' + # must_respond_with :ok + # end end describe "checkin" do diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 0bcb46be7..e11c990da 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -14,27 +14,32 @@ end describe 'model methods' do - describe 'checkout' do - it "should respond with JSON, created, & store a rental in the db for an existing customer and movie" do + describe 'checkout' do + before do + @rental = Rental.new(customer: customers(:shelley), movie: movies(:first)) end it "should decrement the available inventory of movies" do - end + expect{ + @rental.checkout + }.must_change @rental.movie.available_inventory, -1 - it "should increment the number of movies checked out for a customer" do end - it "customer but no movie" do - end - - it "movie but no customer" do + it "should increment the number of movies checked out for a customer" do + expect{ + @rental.checkout + }.must_change @rental.customer.movies_checked_out_count, 1 end - it "no movie no customer" do + it "returns true when when checkout is successful" do + expect{ + @rental.checkout + }.must_equal true end - it "won't check out an unavailable movie" do + it "returns false when checking out an unavailable movie" dolk, end end From 72cd1c70f3906fe1f05aba29a1fa87f5999da61d Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Thu, 7 Nov 2019 10:07:42 -0800 Subject: [PATCH 22/30] we now have a handy private method which sets available_inventory to equal inventory --- app/models/movie.rb | 8 ++++++++ test/models/movie_test.rb | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/app/models/movie.rb b/app/models/movie.rb index 265187556..b95403eeb 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -5,4 +5,12 @@ class Movie < ApplicationRecord validates :inventory, presence: true, numericality: true has_many :rentals + + before_create :set_available_inventory + + private + + def set_available_inventory + self.available_inventory = self.inventory + end end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index a3a986186..abf5f753a 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -46,6 +46,11 @@ @movie[:inventory] = "x" refute @movie.valid? end + + it "will automatically set the available_inventory to equal inventory" do + @movie.save + expect(@movie.available_inventory).must_equal @movie.inventory + end end describe 'relations' do From 5816f71038e9bbf620f436bedea624a9ee753d11 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Thu, 7 Nov 2019 10:29:29 -0800 Subject: [PATCH 23/30] rentals validations --- app/controllers/rentals_controller.rb | 4 +++- app/models/rental.rb | 17 +++++++------ ..._default_movies_checked_out_to_customer.rb | 5 ++++ db/schema.rb | 4 ++-- test/fixtures/customers.yml | 3 ++- test/fixtures/movies.yml | 2 ++ test/fixtures/rentals.yml | 5 +++- test/models/rental_test.rb | 24 +++++++++++-------- 8 files changed, 40 insertions(+), 24 deletions(-) create mode 100644 db/migrate/20191107181102_add_default_movies_checked_out_to_customer.rb diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 3e7ad9dd3..28b0f4334 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -4,7 +4,9 @@ def checkout rental = Rental.new(customer_id: params[:customer_id], movie_id: params[:movie_id]) if rental.save - + + rental.checkout + render json: rental.as_json(only: [:id]), status: :ok return else diff --git a/app/models/rental.rb b/app/models/rental.rb index 591118bc3..0b7dc048b 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -4,20 +4,19 @@ class Rental < ApplicationRecord validate :available def available - if rental.movie.available_inventory == 0 - errors.add(:availability, "can't check out a movie that is not in stock" - else - checkout + if self.movie.available_inventory == 0 + errors.add(:availability, "can't check out a movie that is not in stock") end end def checkout - movie.available_inventory -= 1 - customer.movies_checked_out_count += 1 - @checkout_date = Date.now + self.movie.available_inventory -= 1 + self.customer.movies_checked_out_count += 1 + self.checkout_date = Date.today # make this work - @due_date = checkout_date + 7 - self.save + self.due_date = self.checkout_date + 7 + + return self.save end end diff --git a/db/migrate/20191107181102_add_default_movies_checked_out_to_customer.rb b/db/migrate/20191107181102_add_default_movies_checked_out_to_customer.rb new file mode 100644 index 000000000..c628ea14e --- /dev/null +++ b/db/migrate/20191107181102_add_default_movies_checked_out_to_customer.rb @@ -0,0 +1,5 @@ +class AddDefaultMoviesCheckedOutToCustomer < ActiveRecord::Migration[5.2] + def change + change_column :customers, :movies_checked_out_count, :integer, default: 0 + end +end diff --git a/db/schema.rb b/db/schema.rb index 96dfac732..9c4955f2e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_11_06_004446) do +ActiveRecord::Schema.define(version: 2019_11_07_181102) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -25,7 +25,7 @@ t.string "phone" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "movies_checked_out_count" + t.integer "movies_checked_out_count", default: 0 end create_table "movies", force: :cascade do |t| diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index 1551b1070..d004b6017 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -6,7 +6,7 @@ shelley: state: "OR" postal_code: "24309" phone: "(322) 510-8695" - + movies_checked_out_count: 0 curran: name: "Curran Stout" registered_at: "Wed, 16 Apr 2014 21:40:20 -0700" @@ -15,3 +15,4 @@ curran: state: "California" postal_code: "94267" phone: "(908) 949-6758" + movies_checked_out_count: 0 diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index 239ccdf64..d009c3b87 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -3,8 +3,10 @@ first: overview: "The unexciting life of a boy will be permanently altered as a strange woman enters his life." release_date: "1979-01-18" inventory: 10 + available_inventory: 10 second: title: "Savior Of The Curse" overview: "The strange woman claims the boy has a DNA strain which very likely offers the key to cure several crippling diseases. Tests will have to be done, but the key to save millions of lives is within the grasp of science through this DNA strain. Unsure what to think of all this and of this strange woman, the boy hesitantly agrees to the proposal, there's something exciting about this whole situation, surely the right choice was made." release_date: "2010-11-05" inventory: 1 + available_inventory: 1 diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index c12001b31..2c0048223 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -1,3 +1,6 @@ one: customer: shelley - movie: first \ No newline at end of file + movie: first +two: + customer: shelley + movie: second \ No newline at end of file diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index e11c990da..6f06c6a45 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -21,25 +21,29 @@ end it "should decrement the available inventory of movies" do - expect{ - @rental.checkout - }.must_change @rental.movie.available_inventory, -1 + movie_inventory = @rental.movie.available_inventory + @rental.checkout + + expect(@rental.movie.available_inventory).must_equal movie_inventory - 1 end it "should increment the number of movies checked out for a customer" do - expect{ - @rental.checkout - }.must_change @rental.customer.movies_checked_out_count, 1 + movies_checked_out_count = @rental.customer.movies_checked_out_count + + @rental.checkout + + expect(@rental.customer.movies_checked_out_count).must_equal movies_checked_out_count + 1 end it "returns true when when checkout is successful" do - expect{ - @rental.checkout - }.must_equal true + assert @rental.checkout end - it "returns false when checking out an unavailable movie" dolk, + it "returns false when checking out an unavailable movie" do + rental = Rental.create(customer: customers(:shelley), movie: movies(:second)) + + refute rentals(:two).checkout end end From af5c1462a55a96fd8469b989e44c5c20f541d4d7 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Thu, 7 Nov 2019 12:21:44 -0800 Subject: [PATCH 24/30] checkout date and due date tests in rental model --- app/models/rental.rb | 2 +- test/fixtures/rentals.yml | 6 +++++- test/models/rental_test.rb | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index 0b7dc048b..507336c7f 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -14,7 +14,7 @@ def checkout self.customer.movies_checked_out_count += 1 self.checkout_date = Date.today # make this work - self.due_date = self.checkout_date + 7 + self.due_date = (Date.today + 7) return self.save end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index 2c0048223..2b890c8ec 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -1,6 +1,10 @@ one: customer: shelley movie: first + checkout_date: Date.today + due_date: (Date.today + 7) two: customer: shelley - movie: second \ No newline at end of file + movie: second + checkout_date: Date.today + due_date: (Date.today + 7) \ No newline at end of file diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6f06c6a45..1ac961753 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -44,7 +44,30 @@ rental = Rental.create(customer: customers(:shelley), movie: movies(:second)) refute rentals(:two).checkout + end + + it "should set the checkout date to today" do + rental = Rental.create(customer: customers(:shelley), movie: movies(:first)) + + rental.checkout + + today = Date.today + + expect(rental.checkout_date).must_equal today + end + + it "should set the due date upon creation (equal to 7 days plus checkout date)" do + rental = Rental.create(customer: customers(:shelley), movie: movies(:first)) + + rental.checkout + + today = Date.today + + expect(rental.checkout_date).must_equal today + + next_week = (Date.today + 7) + expect(rental.due_date).must_equal next_week end end From c86d5c1fe9b952173d5ee98f4e5b40f13367a27f Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Thu, 7 Nov 2019 12:44:10 -0800 Subject: [PATCH 25/30] checkout valid validations --- app/models/rental.rb | 19 +++++++++++-------- test/models/rental_test.rb | 22 ++++++++++++++++++++-- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index 507336c7f..08bff703f 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,7 +1,7 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :movie - validate :available + validate :available, on: :checkout def available if self.movie.available_inventory == 0 @@ -10,13 +10,16 @@ def available end def checkout - self.movie.available_inventory -= 1 - self.customer.movies_checked_out_count += 1 - self.checkout_date = Date.today - # make this work - self.due_date = (Date.today + 7) - - return self.save + if self.valid?(:checkout) + self.movie.available_inventory -= 1 + self.customer.movies_checked_out_count += 1 + self.checkout_date = Date.today + # make this work + self.due_date = (Date.today + 7) + return true + else + return false + end end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 1ac961753..0ef356358 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -14,7 +14,6 @@ end describe 'model methods' do - describe 'checkout' do before do @rental = Rental.new(customer: customers(:shelley), movie: movies(:first)) @@ -41,9 +40,14 @@ end it "returns false when checking out an unavailable movie" do + rental = Rental.create(customer: customers(:shelley), movie: movies(:second)) + rental_two = Rental.create(customer: customers(:shelley), movie: movies(:second)) + + rental.checkout + refute rental_two.checkout + expect(rental_two.errors[:availability]).must_equal ["can't check out a movie that is not in stock"] - refute rentals(:two).checkout end it "should set the checkout date to today" do @@ -75,4 +79,18 @@ end end + + describe 'validations' do + describe 'available' do + it 'is valid when movie has available inventory' do + assert(rentals(:one).valid?(:checkout)) + expect(rentals(:one).errors).must_be_empty + + end + + it 'is invalid and returns errors when movie has no availability' do + + end + end + end end From e7e54601b2219e3b44375e9b1c4c7ce8d5dc0025 Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Thu, 7 Nov 2019 13:03:03 -0800 Subject: [PATCH 26/30] checkout action --- app/controllers/rentals_controller.rb | 13 ++++--- app/models/rental.rb | 4 +- test/controllers/rentals_controller_test.rb | 43 ++++++++++++++++++--- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 28b0f4334..87131b3c1 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,15 +1,13 @@ class RentalsController < ApplicationController def checkout - rental = Rental.new(customer_id: params[:customer_id], movie_id: params[:movie_id]) - - if rental.save - - rental.checkout + rental = Rental.new(rental_params) + if rental.checkout render json: rental.as_json(only: [:id]), status: :ok return else + # binding.pry render json: { ok: false, errors: rental.errors.messages @@ -30,4 +28,9 @@ def checkout def checkin end + + private + def rental_params + params.permit(:customer_id, :movie_id) + end end diff --git a/app/models/rental.rb b/app/models/rental.rb index 08bff703f..579e10a24 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -10,7 +10,9 @@ def available end def checkout - if self.valid?(:checkout) + # self.save + + if self.save && self.valid?(:checkout) self.movie.available_inventory -= 1 self.customer.movies_checked_out_count += 1 self.checkout_date = Date.today diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 475006ac2..07906cef0 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -2,15 +2,46 @@ describe RentalsController do describe "checkout" do + it "should respond with JSON, created, & store a rental in the db for an existing customer and movie" do + checkout_params = { customer_id: customers(:shelley).id, movie_id: movies(:first).id } - # it "should respond with JSON, created, & store a rental in the db for an existing customer and movie" do - # checkout_params = { customer_id: customers(:shelley), movie_id: movies(:first) } + expect { + post checkout_path, params: checkout_params + }.must_change "Rental.count", 1 - # post 'rentals/check-out', params: checkout_params + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :ok + + end - # expect(response.header['Content-Type']).must_include 'json' - # must_respond_with :ok - # end + it "should respond with bad_request if customer doesn't exist and won't change the db" do + checkout_params = { customer_id: -1, movie_id: movies(:first).id } + + expect { + post checkout_path, params: checkout_params + }.wont_change "Rental.count" + + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :bad_request + + response_body = JSON.parse(response.body) + expect(response_body["errors"]["customer"]).must_equal ["must exist"] + end + + it "should respond with bad_request if movie doesn't exist and won't change the db" do + checkout_params = { customer_id: customers(:shelley).id, movie_id: -1 } + + expect { + post checkout_path, params: checkout_params + }.wont_change "Rental.count" + + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :bad_request + + response_body = JSON.parse(response.body) + + expect(response_body["errors"]["movie"]).must_equal ["must exist"] + end end describe "checkin" do From d27bccf7fd69b60acddc01693b971743678afed9 Mon Sep 17 00:00:00 2001 From: Mira Date: Thu, 7 Nov 2019 13:15:17 -0800 Subject: [PATCH 27/30] clean up comments and formatting --- app/controllers/rentals_controller.rb | 12 ------------ app/models/rental.rb | 4 ---- config/routes.rb | 2 +- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 87131b3c1..6a77c9b53 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,13 +1,11 @@ class RentalsController < ApplicationController def checkout - rental = Rental.new(rental_params) if rental.checkout render json: rental.as_json(only: [:id]), status: :ok return else - # binding.pry render json: { ok: false, errors: rental.errors.messages @@ -16,16 +14,6 @@ def checkout end end - - # new_rental Rental.new(params params) - # new_rental.checkout - - # if rental.checkout - # else - # #not save - # end - - def checkin end diff --git a/app/models/rental.rb b/app/models/rental.rb index 579e10a24..2fc467b41 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -10,18 +10,14 @@ def available end def checkout - # self.save - if self.save && self.valid?(:checkout) self.movie.available_inventory -= 1 self.customer.movies_checked_out_count += 1 self.checkout_date = Date.today - # make this work self.due_date = (Date.today + 7) return true else return false end end - end diff --git a/config/routes.rb b/config/routes.rb index add9e2c18..33e66b694 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,5 +3,5 @@ resources :movies, only: [:index, :show, :create] post "/rentals/check-out", to: "rentals#checkout", as: "checkout" - post "/rentals/check-in", to: "rentals#checkin", as: "check-in" + post "/rentals/check-in", to: "rentals#checkin", as: "checkin" end From d95b54d69afce131567c71bf9766a775134bc48d Mon Sep 17 00:00:00 2001 From: Natalie Tapias Date: Fri, 8 Nov 2019 13:29:03 -0800 Subject: [PATCH 28/30] a few changes to start --- app/controllers/rentals_controller.rb | 12 +----- app/models/rental.rb | 7 +++- config/routes.rb | 2 +- ...Wave_3_smoke_tests.postman_collection.json | 1 + test/controllers/rentals_controller_test.rb | 40 +++++++++++++++++++ test/models/rental_test.rb | 5 +++ 6 files changed, 53 insertions(+), 14 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 87131b3c1..a2ab3c210 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -7,7 +7,6 @@ def checkout render json: rental.as_json(only: [:id]), status: :ok return else - # binding.pry render json: { ok: false, errors: rental.errors.messages @@ -16,17 +15,8 @@ def checkout end end - - # new_rental Rental.new(params params) - # new_rental.checkout - - # if rental.checkout - # else - # #not save - # end - - def checkin + end private diff --git a/app/models/rental.rb b/app/models/rental.rb index 579e10a24..31d1416ce 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -10,8 +10,6 @@ def available end def checkout - # self.save - if self.save && self.valid?(:checkout) self.movie.available_inventory -= 1 self.customer.movies_checked_out_count += 1 @@ -24,4 +22,9 @@ def checkout end end + def checkin + self.movie.available_inventory += 1 + self.customer.movies_checked_out_count -= 1 + end + end diff --git a/config/routes.rb b/config/routes.rb index add9e2c18..33e66b694 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,5 +3,5 @@ resources :movies, only: [:index, :show, :create] post "/rentals/check-out", to: "rentals#checkout", as: "checkout" - post "/rentals/check-in", to: "rentals#checkin", as: "check-in" + post "/rentals/check-in", to: "rentals#checkin", as: "checkin" end diff --git a/test/VideoStoreAPI_Wave_3_smoke_tests.postman_collection.json b/test/VideoStoreAPI_Wave_3_smoke_tests.postman_collection.json index 9f640d98c..449b8f35d 100644 --- a/test/VideoStoreAPI_Wave_3_smoke_tests.postman_collection.json +++ b/test/VideoStoreAPI_Wave_3_smoke_tests.postman_collection.json @@ -453,6 +453,7 @@ "tests[\"Data is not an array\"] = !Array.isArray(movie);", "", "var expected = Number(postman.getEnvironmentVariable(\"movie_ai\"));", + "tests[\"Movie available_inventory increased\"] = movie.available_inventory === parseInt(postman.getEnvironmentVariable(\"new_movie_ai\")) + 1;" "tests[\"Movie available_inventory increased\"] = movie.available_inventory === expected;" ] } diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 07906cef0..ca02f1a8c 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -45,5 +45,45 @@ end describe "checkin" do + it "should respond with JSON, created, & store a rental in the db for an existing customer and movie" do + checkin_params = { customer_id: customers(:shelley).id, movie_id: movies(:first).id } + + expect { + post checkin_path, params: checkin_params + }.must_change "Rental.count", 1 + + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :ok + + end + + it "should respond with bad_request if customer doesn't exist and won't change the db" do + checkin_params = { customer_id: -1, movie_id: movies(:first).id } + + expect { + post checkin_path, params: checkin_params + }.wont_change "Rental.count" + + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :bad_request + + response_body = JSON.parse(response.body) + expect(response_body["errors"]["customer"]).must_equal ["must exist"] + end + + it "should respond with bad_request if movie doesn't exist and won't change the db" do + checkin_params = { customer_id: customers(:shelley).id, movie_id: -1 } + + expect { + post checkin_path, params: checkin_path + }.wont_change "Rental.count" + + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :bad_request + + response_body = JSON.parse(response.body) + + expect(response_body["errors"]["movie"]).must_equal ["must exist"] + end end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 0ef356358..78b90cb21 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -76,7 +76,12 @@ end describe 'checkin' do + it "should increment the movie available inventory when checked in by 1" do + end + it "should decrement the customer movies checked out by 1" do + end + end end From 53b6ea2a606dbed88d067f74e371d3241527480c Mon Sep 17 00:00:00 2001 From: Mira Date: Fri, 8 Nov 2019 13:43:02 -0800 Subject: [PATCH 29/30] checkin --- app/models/rental.rb | 5 +++++ test/models/rental_test.rb | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/app/models/rental.rb b/app/models/rental.rb index 2fc467b41..ecc96a832 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -20,4 +20,9 @@ def checkout return false end end + + def checkin + self.movie.available_inventory += 1 + self.customer.movies_checked_out_count -= 1 + end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 78b90cb21..1f465f722 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -77,9 +77,21 @@ describe 'checkin' do it "should increment the movie available inventory when checked in by 1" do + rental = rentals(:one) + inventory = rental.movie.available_inventory + + rental.checkin + + expect(rental.movie.available_inventory).must_equal inventory + 1 end it "should decrement the customer movies checked out by 1" do + rental = rentals(:one) + movies = rental.customer.movies_checked_out_count + + rental.checkin + + expect(rental.customer.movies_checked_out_count).must_equal movies - 1 end end From a5bf4f4951c49915de501612077fcfb5a7f08e81 Mon Sep 17 00:00:00 2001 From: Mira Date: Fri, 8 Nov 2019 13:59:31 -0800 Subject: [PATCH 30/30] checkin for rental --- app/controllers/rentals_controller.rb | 8 ++++++ test/controllers/rentals_controller_test.rb | 30 ++++++--------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 4f4113f62..ea3b6e9fe 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -15,7 +15,15 @@ def checkout end def checkin + rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id]) + if rental + rental.checkin + render status: :ok + return + else + render json: { errors: { rental: "not found" } }, status: :bad_request + end end private diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index ca02f1a8c..8082e37a4 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -45,45 +45,31 @@ end describe "checkin" do - it "should respond with JSON, created, & store a rental in the db for an existing customer and movie" do + it "wont_change the db and responds ok for an existing customer and movie" do checkin_params = { customer_id: customers(:shelley).id, movie_id: movies(:first).id } expect { post checkin_path, params: checkin_params - }.must_change "Rental.count", 1 + }.wont_change "Rental.count" - expect(response.header['Content-Type']).must_include 'json' must_respond_with :ok - end - it "should respond with bad_request if customer doesn't exist and won't change the db" do + it "should respond with bad_request if customer or movie doesn't exist and won't change the db" do + available_inventory = movies(:first).available_inventory checkin_params = { customer_id: -1, movie_id: movies(:first).id } expect { post checkin_path, params: checkin_params - }.wont_change "Rental.count" - - expect(response.header['Content-Type']).must_include 'json' - must_respond_with :bad_request - - response_body = JSON.parse(response.body) - expect(response_body["errors"]["customer"]).must_equal ["must exist"] - end + }.wont_change "Rental.count" - it "should respond with bad_request if movie doesn't exist and won't change the db" do - checkin_params = { customer_id: customers(:shelley).id, movie_id: -1 } - - expect { - post checkin_path, params: checkin_path - }.wont_change "Rental.count" + expect(movies(:first).available_inventory).must_equal available_inventory expect(response.header['Content-Type']).must_include 'json' must_respond_with :bad_request - - response_body = JSON.parse(response.body) - expect(response_body["errors"]["movie"]).must_equal ["must exist"] + response_body = JSON.parse(response.body) + expect(response_body["errors"]["rental"]).must_equal "not found" end end end