From 542241ee016edc97ce4cc7f794a2c79cb7a93911 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 12:28:53 -0800 Subject: [PATCH 01/39] Initial set up --- .gitignore | 16 ++ Gemfile | 53 ++++++ Gemfile.lock | 170 ++++++++++++++++++ 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 | 35 ++++ bin/spring | 17 ++ bin/update | 29 +++ config.ru | 5 + config/application.rb | 40 +++++ config/boot.rb | 3 + config/cable.yml | 10 ++ config/database.yml | 85 +++++++++ config/environment.rb | 5 + config/environments/development.rb | 47 +++++ config/environments/production.rb | 83 +++++++++ config/environments/test.rb | 42 +++++ .../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 | 56 ++++++ config/routes.rb | 3 + config/secrets.yml | 32 ++++ config/spring.rb | 6 + db/seeds.rb | 14 +- lib/tasks/.keep | 0 log/.keep | 0 public/robots.txt | 1 + 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 | 26 +++ tmp/.keep | 0 vendor/.keep | 0 54 files changed, 933 insertions(+), 7 deletions(-) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock 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/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cors.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/secrets.yml create mode 100644 config/spring.rb create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 public/robots.txt 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..68ac019ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# 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 + +.byebug_history diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..4ae55c93d --- /dev/null +++ b/Gemfile @@ -0,0 +1,53 @@ +source 'https://rubygems.org' + +git_source(:github) do |repo_name| + repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") + "https://github.com/#{repo_name}.git" +end + + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.1.4' +# Use postgresql as the database for Active Record +gem 'pg', '~> 0.18' +# Use Puma as the app server +gem 'puma', '~> 3.7' +# 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', '~> 3.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# 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] + +gem 'jquery-turbolinks' +group :development do + gem 'better_errors' + gem 'pry-rails' + gem 'binding_of_caller' +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..4a738acb5 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,170 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.1.4) + actionpack (= 5.1.4) + nio4r (~> 2.0) + websocket-driver (~> 0.6.1) + actionmailer (5.1.4) + actionpack (= 5.1.4) + actionview (= 5.1.4) + activejob (= 5.1.4) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.1.4) + actionview (= 5.1.4) + activesupport (= 5.1.4) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.1.4) + activesupport (= 5.1.4) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.1.4) + activesupport (= 5.1.4) + globalid (>= 0.3.6) + activemodel (5.1.4) + activesupport (= 5.1.4) + activerecord (5.1.4) + activemodel (= 5.1.4) + activesupport (= 5.1.4) + arel (~> 8.0) + activesupport (5.1.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (~> 0.7) + minitest (~> 5.1) + tzinfo (~> 1.1) + ansi (1.5.0) + arel (8.0.0) + better_errors (2.4.0) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) + binding_of_caller (0.7.3) + debug_inspector (>= 0.0.1) + builder (3.2.3) + byebug (9.1.0) + coderay (1.1.2) + concurrent-ruby (1.0.5) + crass (1.0.2) + debug_inspector (0.0.3) + erubi (1.7.0) + ffi (1.9.18) + globalid (0.4.1) + activesupport (>= 4.2.0) + i18n (0.9.1) + concurrent-ruby (~> 1.0) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.1.1) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + mail (2.7.0) + mini_mime (>= 0.1.1) + method_source (0.9.0) + mini_mime (0.1.4) + mini_portile2 (2.3.0) + minitest (5.10.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.1.18) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + nio4r (2.1.0) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) + pg (0.21.0) + pry (0.11.2) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + puma (3.10.0) + rack (2.0.3) + rack-test (0.7.0) + rack (>= 1.0, < 3) + rails (5.1.4) + actioncable (= 5.1.4) + actionmailer (= 5.1.4) + actionpack (= 5.1.4) + actionview (= 5.1.4) + activejob (= 5.1.4) + activemodel (= 5.1.4) + activerecord (= 5.1.4) + activesupport (= 5.1.4) + bundler (>= 1.3.0) + railties (= 5.1.4) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.3) + loofah (~> 2.0) + railties (5.1.4) + actionpack (= 5.1.4) + activesupport (= 5.1.4) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (12.2.1) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + ruby-progressbar (1.9.0) + ruby_dep (1.5.0) + spring (2.0.2) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.0) + thread_safe (0.3.6) + turbolinks (5.0.1) + turbolinks-source (~> 5) + turbolinks-source (5.0.3) + tzinfo (1.2.4) + thread_safe (~> 0.1) + websocket-driver (0.6.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.2) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + byebug + jquery-turbolinks + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (~> 0.18) + pry-rails + puma (~> 3.7) + rails (~> 5.1.4) + spring + spring-watcher-listen (~> 2.0.0) + tzinfo-data + +BUNDLED WITH + 1.16.0.pre.3 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..66e9889e8 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +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..104e40c1c --- /dev/null +++ b/bin/setup @@ -0,0 +1,35 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 000000000..fb2ec2ebb --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == "spring" } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/bin/update new file mode 100755 index 000000000..a8e4462f2 --- /dev/null +++ b/bin/update @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +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..7d3c866ff --- /dev/null +++ b/config/application.rb @@ -0,0 +1,40 @@ +require_relative 'boot' + +require "rails" +# Pick the frameworks you want: +require "active_model/railtie" +require "active_job/railtie" +require "active_record/railtie" +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.1 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # 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..30f5120df --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,3 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..ad59bcd88 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: redis://localhost:6379/1 + channel_prefix: VideoStoreAPI_production diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 000000000..720570700 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: VideoStoreAPI_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: VideoStoreAPI + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: VideoStoreAPI_test + +# As with config/secrets.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: VideoStoreAPI_production + username: VideoStoreAPI + password: <%= ENV['VIDEOSTOREAPI_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 000000000..426333bb4 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 000000000..abc82221c --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,47 @@ +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. + 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.seconds.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # 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 + + + # 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..3bd8115ea --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,83 @@ +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 + + # Attempt to read encrypted secrets from `config/secrets.yml.enc`. + # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or + # `config/secrets.yml.key`. + config.read_encrypted_secrets = 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 + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "VideoStoreAPI_#{Rails.env}" + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 000000000..8e5cbde53 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,42 @@ +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.seconds.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 + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 000000000..59385cdf3 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb new file mode 100644 index 000000000..3b1c1b5ed --- /dev/null +++ b/config/initializers/cors.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Avoid CORS issues when API is called from the frontend app. +# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. + +# Read more: https://github.com/cyu/rack-cors + +# Rails.application.config.middleware.insert_before 0, Rack::Cors do +# allow do +# origins 'example.com' +# +# resource '*', +# headers: :any, +# methods: [:get, :post, :put, :patch, :delete, :options, :head] +# end +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 000000000..4a994e1e7 --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 000000000..ac033bf9d --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 000000000..dc1899682 --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 000000000..bbfc3961b --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 000000000..decc5a857 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 000000000..1e19380dc --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,56 @@ +# 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. If you use this option +# you need to make sure to reconnect any threads in the `on_worker_boot` +# block. +# +# preload_app! + +# If you are preloading your application and using Active Record, it's +# recommended that you close any connections to the database before workers +# are forked to prevent connection leakage. +# +# before_fork do +# ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord) +# end + +# The code in the `on_worker_boot` will be called if you are using +# clustered mode by specifying a number of `workers`. After each worker +# process is booted, this block will be run. If you are using the `preload_app!` +# option, you will want to use this block to reconnect to any threads +# or connections that may have been created at application boot, as Ruby +# cannot share connections between processes. +# +# on_worker_boot do +# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) +# end +# + +# 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/secrets.yml b/config/secrets.yml new file mode 100644 index 000000000..fab6b81df --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,32 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rails secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +# Shared secrets are available across all environments. + +# shared: +# api_key: a1B2c3D4e5F6 + +# Environmental secrets are only available for that specific environment. + +development: + secret_key_base: d6312ddd724ea4b5297874febe487d1714b9787c279ab8b5bb20ec4c84592289181e033fd46a0cc1ac82079df004ff2a9cc91868f8853f3aa4a7f9a9a8656778 + +test: + secret_key_base: dabfcbee78f979ef5504265267223cf042e6d2de8356686f34d68fc3632bee6e68cca891fc17fb783c1cb8cfb6429b915b231734d915be988f1dac7996dfd565 + +# Do not keep production secrets in the unencrypted secrets file. +# Instead, either read values from the environment. +# Or, use `bin/rails secrets:setup` to configure encrypted secrets +# and move the `production:` environment over there. + +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..c9119b40c --- /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/db/seeds.rb b/db/seeds.rb index 5322340ba..1beea2acc 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,7 +1,7 @@ -JSON.parse(File.read('db/seeds/customers.json')).each do |customer| - Customer.create!(customer) -end - -JSON.parse(File.read('db/seeds/movies.json')).each do |movie| - Movie.create!(movie) -end +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/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/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..10594a324 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,26 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails" +require "minitest/reporters" # for Colorized output + +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 000000000..e69de29bb From 9c4db7f945965c142d22d4a78a50b85edecd852a Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 13:40:30 -0800 Subject: [PATCH 02/39] added customer, movie, and rental models --- app/models/customer.rb | 2 + app/models/movie.rb | 2 + app/models/rental.rb | 2 + db/migrate/20171106213622_create_customers.rb | 15 ++++++ db/migrate/20171106213730_create_movies.rb | 12 +++++ db/migrate/20171106213958_create_rentals.rb | 11 +++++ db/schema.rb | 47 +++++++++++++++++++ test/fixtures/customers.yml | 19 ++++++++ test/fixtures/movies.yml | 13 +++++ test/fixtures/rentals.yml | 11 +++++ test/models/customer_test.rb | 9 ++++ test/models/movie_test.rb | 9 ++++ test/models/rental_test.rb | 9 ++++ 13 files changed, 161 insertions(+) create mode 100644 app/models/customer.rb create mode 100644 app/models/movie.rb create mode 100644 app/models/rental.rb create mode 100644 db/migrate/20171106213622_create_customers.rb create mode 100644 db/migrate/20171106213730_create_movies.rb create mode 100644 db/migrate/20171106213958_create_rentals.rb create mode 100644 db/schema.rb create mode 100644 test/fixtures/customers.yml create mode 100644 test/fixtures/movies.yml create mode 100644 test/fixtures/rentals.yml create mode 100644 test/models/customer_test.rb create mode 100644 test/models/movie_test.rb create mode 100644 test/models/rental_test.rb diff --git a/app/models/customer.rb b/app/models/customer.rb new file mode 100644 index 000000000..0b5277335 --- /dev/null +++ b/app/models/customer.rb @@ -0,0 +1,2 @@ +class Customer < ApplicationRecord +end diff --git a/app/models/movie.rb b/app/models/movie.rb new file mode 100644 index 000000000..dc614df15 --- /dev/null +++ b/app/models/movie.rb @@ -0,0 +1,2 @@ +class Movie < ApplicationRecord +end diff --git a/app/models/rental.rb b/app/models/rental.rb new file mode 100644 index 000000000..79e3a65ca --- /dev/null +++ b/app/models/rental.rb @@ -0,0 +1,2 @@ +class Rental < ApplicationRecord +end diff --git a/db/migrate/20171106213622_create_customers.rb b/db/migrate/20171106213622_create_customers.rb new file mode 100644 index 000000000..0a05c4bad --- /dev/null +++ b/db/migrate/20171106213622_create_customers.rb @@ -0,0 +1,15 @@ +class CreateCustomers < ActiveRecord::Migration[5.1] + 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/migrate/20171106213730_create_movies.rb b/db/migrate/20171106213730_create_movies.rb new file mode 100644 index 000000000..84782a1b7 --- /dev/null +++ b/db/migrate/20171106213730_create_movies.rb @@ -0,0 +1,12 @@ +class CreateMovies < ActiveRecord::Migration[5.1] + 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/20171106213958_create_rentals.rb b/db/migrate/20171106213958_create_rentals.rb new file mode 100644 index 000000000..93fb4924f --- /dev/null +++ b/db/migrate/20171106213958_create_rentals.rb @@ -0,0 +1,11 @@ +class CreateRentals < ActiveRecord::Migration[5.1] + def change + create_table :rentals do |t| + t.integer :movie_id + t.integer :customer_id + t.date :due_date + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..424c5e166 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,47 @@ +# 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: 20171106213958) 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 + + create_table "rentals", force: :cascade do |t| + t.integer "movie_id" + t.integer "customer_id" + t.date "due_date" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml new file mode 100644 index 000000000..bf442fa90 --- /dev/null +++ b/test/fixtures/customers.yml @@ -0,0 +1,19 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + registered_at: MyString + address: MyString + city: MyString + state: MyString + postal_code: MyString + phone: MyString + +two: + name: MyString + registered_at: MyString + address: MyString + city: MyString + state: MyString + postal_code: MyString + phone: MyString diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml new file mode 100644 index 000000000..d774de5f1 --- /dev/null +++ b/test/fixtures/movies.yml @@ -0,0 +1,13 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + title: MyString + overview: MyString + release_date: MyString + inventory: 1 + +two: + title: MyString + overview: MyString + release_date: MyString + inventory: 1 diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml new file mode 100644 index 000000000..b9677884e --- /dev/null +++ b/test/fixtures/rentals.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + movie_id: 1 + customer_id: 1 + due_date: 2017-11-06 + +two: + movie_id: 1 + customer_id: 1 + due_date: 2017-11-06 diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb new file mode 100644 index 000000000..5ebc5c850 --- /dev/null +++ b/test/models/customer_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Customer do + let(:customer) { Customer.new } + + it "must be valid" do + value(customer).must_be :valid? + end +end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb new file mode 100644 index 000000000..34d1d30a5 --- /dev/null +++ b/test/models/movie_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Movie do + let(:movie) { Movie.new } + + it "must be valid" do + value(movie).must_be :valid? + end +end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb new file mode 100644 index 000000000..6ea53d94f --- /dev/null +++ b/test/models/rental_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Rental do + let(:rental) { Rental.new } + + it "must be valid" do + value(rental).must_be :valid? + end +end From 9c4cc823e0d94c630a63ad8b2e7b38b464980443 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 13:47:33 -0800 Subject: [PATCH 03/39] add relationships at the model level --- app/models/customer.rb | 1 + app/models/movie.rb | 1 + app/models/rental.rb | 2 ++ 3 files changed, 4 insertions(+) diff --git a/app/models/customer.rb b/app/models/customer.rb index 0b5277335..d2533dbf9 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,2 +1,3 @@ class Customer < ApplicationRecord + has_many :rentals end diff --git a/app/models/movie.rb b/app/models/movie.rb index dc614df15..5a3eef0b0 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,2 +1,3 @@ class Movie < ApplicationRecord + has_many :rentals end diff --git a/app/models/rental.rb b/app/models/rental.rb index 79e3a65ca..e001ff37c 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,2 +1,4 @@ class Rental < ApplicationRecord + belongs_to :customer + belongs_to :movie end From 7952e10feaac476fc4cfc4a0d6e8f972f65994bf Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 13:54:42 -0800 Subject: [PATCH 04/39] add account_credit column to customer model --- .../20171106215231_add_acount_credit_to_customer.rb | 5 +++++ db/schema.rb | 3 ++- db/seeds.rb | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20171106215231_add_acount_credit_to_customer.rb diff --git a/db/migrate/20171106215231_add_acount_credit_to_customer.rb b/db/migrate/20171106215231_add_acount_credit_to_customer.rb new file mode 100644 index 000000000..6c96d9d40 --- /dev/null +++ b/db/migrate/20171106215231_add_acount_credit_to_customer.rb @@ -0,0 +1,5 @@ +class AddAcountCreditToCustomer < ActiveRecord::Migration[5.1] + def change + add_column :customers, :account_credit, :float + end +end diff --git a/db/schema.rb b/db/schema.rb index 424c5e166..73c02b67f 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: 20171106213958) do +ActiveRecord::Schema.define(version: 20171106215231) 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.float "account_credit" end create_table "movies", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2acc..0e8274fca 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,11 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) + +JSON.parse(File.read('db/seeds/customers.json')).each do |customer| + Customer.create!(customer) +end + +JSON.parse(File.read('db/seeds/movies.json')).each do |movie| + Movie.create!(movie) +end From c3ba982f882a3fd315e4b2b77b63a2ffbe7c9127 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 14:36:45 -0800 Subject: [PATCH 05/39] added tests for customer model validations --- Gemfile | 1 + app/models/customer.rb | 2 ++ config/routes.rb | 1 + test/models/customer_test.rb | 26 +++++++++++++++++++++++--- test/models/rental_test.rb | 4 ---- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 4ae55c93d..a6e0bdd54 100644 --- a/Gemfile +++ b/Gemfile @@ -28,6 +28,7 @@ gem 'puma', '~> 3.7' group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + gem 'pry-rails' end group :development do diff --git a/app/models/customer.rb b/app/models/customer.rb index d2533dbf9..68e735ecb 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,3 +1,5 @@ class Customer < ApplicationRecord has_many :rentals + + validates :name, presence: true end diff --git a/config/routes.rb b/config/routes.rb index 787824f88..b53201270 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,4 @@ 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/test/models/customer_test.rb b/test/models/customer_test.rb index 5ebc5c850..c55490b8d 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -3,7 +3,27 @@ describe Customer do let(:customer) { Customer.new } - it "must be valid" do - value(customer).must_be :valid? - end + describe "validations" do + it "can be created if all fields are provided" do + start_count = Customer.count + c = Customer.new(name: "Tamira", registered_at: "Date registered", address: "An address", city: "Seattle", state: "WA", postal_code: "zip", phone: "111111111", account_credit: 15.50) + + c.must_be :valid? + + c.save + Customer.count.must_equal start_count + 1 + end # can be created + + it "can't be created without a title" do + start_count = Customer.count + c = Customer.new(registered_at: "Date registered", address: "An address", city: "Seattle", state: "WA", postal_code: "zip", phone: "111111111", account_credit: 15.50) + + c.wont_be :valid? + + # can't be saved because it isn't valid + c.save + Customer.count.must_equal start_count + + end + end # validations end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6ea53d94f..0bea59f1c 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,9 +1,5 @@ require "test_helper" describe Rental do - let(:rental) { Rental.new } - it "must be valid" do - value(rental).must_be :valid? - end end From 2d6bbc9d979bceca3afe7b3b0ea248c68b97f51c Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 14:40:50 -0800 Subject: [PATCH 06/39] added error messages test to customer model tests --- test/models/customer_test.rb | 3 ++- test/models/rental_test.rb | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index c55490b8d..e3ce77543 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -19,8 +19,9 @@ c = Customer.new(registered_at: "Date registered", address: "An address", city: "Seattle", state: "WA", postal_code: "zip", phone: "111111111", account_credit: 15.50) c.wont_be :valid? + c.errors.messages.must_include :name - # can't be saved because it isn't valid + # can't be saved because it isn't valid c.save Customer.count.must_equal start_count diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 0bea59f1c..056baabfc 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,5 +1,8 @@ require "test_helper" describe Rental do - + describe "validations" do + it "can be created when all fields are given" do + end # can be created + end end From c9ede5ace8af5c4aeb9c31a06e702ded127c6b92 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 14:51:41 -0800 Subject: [PATCH 07/39] add tests for validations for rental model --- app/models/rental.rb | 4 ++++ test/models/rental_test.rb | 24 +++++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index e001ff37c..397b590d1 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,4 +1,8 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :movie + + validates :customer_id, presence: true + validates :movie_id, presence: true + validates :due_date, presence: true end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 056baabfc..4b9e9633b 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -3,6 +3,24 @@ describe Rental do describe "validations" do it "can be created when all fields are given" do - end # can be created - end -end + cus_id = Customer.first.id + mov_id = Movie.first.id + r = Rental.new(customer_id: cus_id, movie_id: mov_id, due_date: Date.new(2017, 12, 1)) + + r.must_be :valid? + end # can be created + + it "can't be created without a customer_id, movie_id, or due_date" do + start_count = Rental.count + r = Rental.new() + + r.wont_be :valid? + r.errors.messages.must_include :customer_id + r.errors.messages.must_include :movie_id + r.errors.messages.must_include :due_date + + r.save + Rental.count.must_equal start_count + end + end # validations +end # Rental From 291dedb1c6883cd18cdaaee89a91b661b116b209 Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Mon, 6 Nov 2017 14:57:38 -0800 Subject: [PATCH 08/39] Tests pass for Movie validations --- app/models/movie.rb | 4 +++- test/models/movie_test.rb | 42 +++++++++++++++++++++++++++++++++++--- test/models/rental_test.rb | 4 ---- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index 5a3eef0b0..c3161a31f 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,3 +1,5 @@ class Movie < ApplicationRecord - has_many :rentals + has_many :rentals + + validates :title, :inventory, presence: true end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 34d1d30a5..63e5e566f 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,9 +1,45 @@ require "test_helper" describe Movie do - let(:movie) { Movie.new } + let(:movie) { Movie.new( title: 'Cool Movie', + inventory: "10") + } - it "must be valid" do - value(movie).must_be :valid? + describe 'validations' do + it 'can be created with valid data' do + movie.must_be :valid? + end + + describe 'title' do + it 'requires title' do + movie.title = nil + movie.inventory = '10' + movie.save + movie.errors.messages.must_include :title + movie.wont_be :valid? + end + end + + describe "tests for presence of inventory" do + it "will reject missing inventory" do + movie.inventory = nil + movie.wont_be :valid? + movie.errors.messages.must_include :inventory + end + + it "should work if inventory is 0" do + movie.inventory = 0 + movie.must_be :valid? + end + end end + + # describe 'relationships' do + # it "has a list of rentals" do + # mermaid_fin = rentals(:ada) + # mermaid_fin.must_respond_to :products + # mermaid_fin.products.each do |product| + # product.must_be_kind_of Product + # end + # end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6ea53d94f..0bea59f1c 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,9 +1,5 @@ require "test_helper" describe Rental do - let(:rental) { Rental.new } - it "must be valid" do - value(rental).must_be :valid? - end end From 43040f22bde55307790a65128fffa275899c9a18 Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Mon, 6 Nov 2017 15:14:33 -0800 Subject: [PATCH 09/39] added controller actions for MoviesController --- app/controllers/movies_controller.rb | 40 ++++++++++++++++++++++ app/models/customer.rb | 2 ++ config/routes.rb | 5 ++- test/controllers/movies_controller_test.rb | 7 ++++ 4 files changed, 53 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..c87af0221 --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,40 @@ +class MoviesController < ApplicationController + + def index + movies = Movie.all + render( + json: movies.as_json(only: [:id, :title, :overview, :release_date, :inventory]), + status: :ok + ) + end + + def show + movie = Movie.find_by(:id, params[:id]) + + if movie + render( + json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]), + status: :ok + ) + end + + def create + movie = Movie.new(movie_params) + + if movie.save + render( + json: {id: movie.id}, status: :ok + ) + else + render( + json: {errors: movie.errors.messages}, status: :bad_request + ) + end + end + + private + + def movie_params + params.require(:movie).permit(:title, :overview, :release_date, :inventory) + end +end diff --git a/app/models/customer.rb b/app/models/customer.rb index 68e735ecb..d24ae68b0 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -2,4 +2,6 @@ class Customer < ApplicationRecord has_many :rentals validates :name, presence: true + + end diff --git a/config/routes.rb b/config/routes.rb index b53201270..91e3fca31 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,7 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - + + resources :movies, only: [:index, :show, :create] + resources :customers, only: [:index] + end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb new file mode 100644 index 000000000..67fabbcfb --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MoviesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From d6597b849919b33d541e38ec42f255bf846ef5d5 Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Mon, 6 Nov 2017 15:32:12 -0800 Subject: [PATCH 10/39] tested MoviesController methods --- app/controllers/movies_controller.rb | 6 +++ test/controllers/movies_controller_test.rb | 53 ++++++++++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index c87af0221..190664d37 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,4 +1,5 @@ class MoviesController < ApplicationController + # protect_from_forgery with: :null_session def index movies = Movie.all @@ -16,6 +17,11 @@ def show json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]), status: :ok ) + else + render( + json: {nothing: true}, status: :not_found + ) + end end def create diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 67fabbcfb..ce0f54d40 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,7 +1,54 @@ require "test_helper" + describe MoviesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe "index" do + it "is a real working route" do + get movies_path + must_respond_with :success + end + + it "returns json" do + get movies_path + response.header['Content-Type'].must_include 'json' + end + + it "returns an Array" do + get movies_path + + body = JSON.parse(response.body) + body.must_be_kind_of Array + end + + it "returns all of the movies" do + get movies_path + + body = JSON.parse(response.body) + body.length.must_equal Movie.count + end + + it "returns movies with exactly the required fields" do + keys = ["id", "inventory", "overview", "release_date", "title" ] + get movies_path + body = JSON.parse(response.body) + body.each do |movie| + movie.keys.sort.must_equal keys + end + end + + it "returns an empty array if there are no movies" do + # Arrange + Movie.destroy_all + + # Act + get movies_path + + # Assert + must_respond_with :success + body = JSON.parse(response.body) + body.must_be_kind_of Array + body.must_be :empty? + end + end end From c40a107edf15a604df48c423739230baf82777ab Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Mon, 6 Nov 2017 15:57:02 -0800 Subject: [PATCH 11/39] All tests pass for MoviesController --- app/controllers/movies_controller.rb | 2 +- config/routes.rb | 2 +- test/controllers/movies_controller_test.rb | 56 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 190664d37..824101aa6 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -10,7 +10,7 @@ def index end def show - movie = Movie.find_by(:id, params[:id]) + movie = Movie.find_by(id: params[:id]) if movie render( diff --git a/config/routes.rb b/config/routes.rb index 91e3fca31..9911246f5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,6 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :movies, only: [:index, :show, :create] - resources :customers, only: [:index] + # resources :customers, only: [:index] end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index ce0f54d40..7967ee395 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -51,4 +51,60 @@ body.must_be :empty? end end + + describe "show" do + # This bit is up to you! + it "can get a movie" do + get movie_path(movies(:two).id) + must_respond_with :success + end + + it "responds correctly when movie is not found" do + invalid_movie_id = Movie.all.last.id + 1 + get movie_path(invalid_movie_id) + + must_respond_with :not_found + + body = JSON.parse(response.body) + body.must_equal "nothing" => true + end + end + + describe "create" do + let(:movie_data) { + { + title: "Cool movie", + inventory: 7, + release_date: "feb", + overview: "Something" + } + } + + + it "Create a Movie" do + proc { + post movies_path, params: {movie: movie_data} + }.must_change 'Movie.count', 1 + + must_respond_with :success + end + + it "won't change the db if given invalid data" do + invalid_movie_data = + { + title: nil, + inventory: 7, + release_date: "feb", + overview: "Something" + } + proc { + post movies_path, params: {movie: invalid_movie_data} + }.wont_change 'Movie.count' + + must_respond_with :bad_request + + body = JSON.parse(response.body) + body.must_equal "errors" => {"title" => ["can't be blank"]} + end + end end From eea8e4e520bf2cd033d0cff710298a1183a7c38d Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Mon, 6 Nov 2017 16:28:23 -0800 Subject: [PATCH 12/39] add CustomersController index action with passing tests --- app/controllers/customers_controller.rb | 8 ++++ config/routes.rb | 2 +- test/controllers/customers_controller_test.rb | 39 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) 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..456569149 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,8 @@ +class CustomersController < ApplicationController +def index + customers = Customer.all + render( + json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone]) + ) +end +end diff --git a/config/routes.rb b/config/routes.rb index 9911246f5..91e3fca31 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,6 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :movies, only: [:index, :show, :create] - # resources :customers, only: [:index] + resources :customers, only: [:index] end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb new file mode 100644 index 000000000..fa8c51dbf --- /dev/null +++ b/test/controllers/customers_controller_test.rb @@ -0,0 +1,39 @@ +require "test_helper" + +describe CustomersController do + describe "index" do + it "is a real working rout" do + get customers_path + must_respond_with :success + end # working rout + + it "returns json" do + get customers_path + response.header['Content-Type'].must_include 'json' + end # json + + it "returns an array" do + get customers_path + body = JSON.parse(response.body) + body.must_be_kind_of Array + end # is an array + + it "returns all the customers" do + get customers_path + body = JSON.parse(response.body) + body.length.must_equal Customer.count + end # returns all the customers + + it "returns customers with exactly the required fields" do + keys = ["address", "city", "id", "name", "phone", "postal_code", "registered_at", "state"] + + get customers_path + + body = JSON.parse(response.body) + body.each do |customer| + customer.keys.sort.must_equal keys + end # .each + end # correct fields + + end # index +end From 2b6dd819fe94f69e78f355d1b69981387247c413 Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Mon, 6 Nov 2017 19:11:38 -0800 Subject: [PATCH 13/39] Changing branches --- app/controllers/movies_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 824101aa6..223fcdfbf 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,5 +1,4 @@ class MoviesController < ApplicationController - # protect_from_forgery with: :null_session def index movies = Movie.all From 6bba4828ed69bd518f6e7413788ef66af4858513 Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Mon, 6 Nov 2017 19:51:22 -0800 Subject: [PATCH 14/39] Model teting for Movie relationships --- app/controllers/customers_controller.rb | 8 ++ app/controllers/movies_controller.rb | 45 +++++++++ test/controllers/movies_controller_test.rb | 110 +++++++++++++++++++++ test/models/movie_test.rb | 16 +-- 4 files changed, 171 insertions(+), 8 deletions(-) create mode 100644 app/controllers/customers_controller.rb create mode 100644 app/controllers/movies_controller.rb create mode 100644 test/controllers/movies_controller_test.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb new file mode 100644 index 000000000..456569149 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,8 @@ +class CustomersController < ApplicationController +def index + customers = Customer.all + render( + json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone]) + ) +end +end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb new file mode 100644 index 000000000..223fcdfbf --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,45 @@ +class MoviesController < ApplicationController + + def index + movies = Movie.all + render( + json: movies.as_json(only: [:id, :title, :overview, :release_date, :inventory]), + status: :ok + ) + end + + def show + movie = Movie.find_by(id: params[:id]) + + if movie + render( + json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]), + status: :ok + ) + else + render( + json: {nothing: true}, status: :not_found + ) + end + end + + def create + movie = Movie.new(movie_params) + + if movie.save + render( + json: {id: movie.id}, status: :ok + ) + else + render( + json: {errors: movie.errors.messages}, status: :bad_request + ) + end + end + + private + + def movie_params + params.require(:movie).permit(:title, :overview, :release_date, :inventory) + end +end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb new file mode 100644 index 000000000..7967ee395 --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,110 @@ +require "test_helper" + + +describe MoviesController do + + describe "index" do + it "is a real working route" do + get movies_path + must_respond_with :success + end + + it "returns json" do + get movies_path + response.header['Content-Type'].must_include 'json' + end + + it "returns an Array" do + get movies_path + + body = JSON.parse(response.body) + body.must_be_kind_of Array + end + + it "returns all of the movies" do + get movies_path + + body = JSON.parse(response.body) + body.length.must_equal Movie.count + end + + it "returns movies with exactly the required fields" do + keys = ["id", "inventory", "overview", "release_date", "title" ] + get movies_path + body = JSON.parse(response.body) + body.each do |movie| + movie.keys.sort.must_equal keys + end + end + + it "returns an empty array if there are no movies" do + # Arrange + Movie.destroy_all + + # Act + get movies_path + + # Assert + must_respond_with :success + body = JSON.parse(response.body) + body.must_be_kind_of Array + body.must_be :empty? + end + end + + describe "show" do + # This bit is up to you! + it "can get a movie" do + get movie_path(movies(:two).id) + must_respond_with :success + end + + it "responds correctly when movie is not found" do + invalid_movie_id = Movie.all.last.id + 1 + get movie_path(invalid_movie_id) + + must_respond_with :not_found + + body = JSON.parse(response.body) + body.must_equal "nothing" => true + end + end + + describe "create" do + let(:movie_data) { + { + title: "Cool movie", + inventory: 7, + release_date: "feb", + overview: "Something" + } + } + + + it "Create a Movie" do + proc { + post movies_path, params: {movie: movie_data} + }.must_change 'Movie.count', 1 + + must_respond_with :success + end + + it "won't change the db if given invalid data" do + invalid_movie_data = + { + title: nil, + inventory: 7, + release_date: "feb", + overview: "Something" + } + proc { + post movies_path, params: {movie: invalid_movie_data} + }.wont_change 'Movie.count' + + must_respond_with :bad_request + + body = JSON.parse(response.body) + body.must_equal "errors" => {"title" => ["can't be blank"]} + end + end +end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 63e5e566f..f1944c505 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -34,12 +34,12 @@ end end - # describe 'relationships' do - # it "has a list of rentals" do - # mermaid_fin = rentals(:ada) - # mermaid_fin.must_respond_to :products - # mermaid_fin.products.each do |product| - # product.must_be_kind_of Product - # end - # end + describe 'relationships' do + it "has a list of rentals" do + movie.must_respond_to :rentals + movie.rentals.each do |rental| + rental.must_be_kind_of Rental + end + end + end end From 17a12a05d828c9e8d270abaa4584328653300540 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 10:17:50 -0800 Subject: [PATCH 15/39] add checked_out column to customers --- app/controllers/movies_controller.rb | 1 - db/migrate/20171107181648_add_checked_out.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20171107181648_add_checked_out.rb diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 824101aa6..223fcdfbf 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,5 +1,4 @@ class MoviesController < ApplicationController - # protect_from_forgery with: :null_session def index movies = Movie.all diff --git a/db/migrate/20171107181648_add_checked_out.rb b/db/migrate/20171107181648_add_checked_out.rb new file mode 100644 index 000000000..f7ee98fad --- /dev/null +++ b/db/migrate/20171107181648_add_checked_out.rb @@ -0,0 +1,5 @@ +class AddCheckedOut < ActiveRecord::Migration[5.1] + def change + add_column :customers, :checked_out, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 73c02b67f..eade83cd2 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: 20171106215231) do +ActiveRecord::Schema.define(version: 20171107181648) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -26,6 +26,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.float "account_credit" + t.boolean "checked_out" end create_table "movies", force: :cascade do |t| From bf0e11aac53d8312d2fb623ea511b96b126192a4 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 10:35:49 -0800 Subject: [PATCH 16/39] committing to be able to pull --- app/controllers/customers_controller.rb | 2 +- app/models/customer.rb | 5 ++++- test/fixtures/rentals.yml | 2 ++ test/models/customer_test.rb | 12 ++++++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 456569149..153aa54f6 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -2,7 +2,7 @@ class CustomersController < ApplicationController def index customers = Customer.all render( - json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone]) + json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out]) ) end end diff --git a/app/models/customer.rb b/app/models/customer.rb index d24ae68b0..1295a553f 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -3,5 +3,8 @@ class Customer < ApplicationRecord validates :name, presence: true - + def self.movies_checked_out + self.rentals.where(checked_out: true).count + end # movies_checked_out + end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index b9677884e..d140b5a04 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -4,8 +4,10 @@ one: movie_id: 1 customer_id: 1 due_date: 2017-11-06 + checked_out: true two: movie_id: 1 customer_id: 1 due_date: 2017-11-06 + checked_out: false diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index e3ce77543..e04edb21f 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -27,4 +27,16 @@ end end # validations + + describe "custom methods" do + describe "movies_checked_out" do + it "will return a list of the checkout out movies for that customer" do + get customers_path + + body = JSON.parse(response.body) + body[0][:movies_checked_out].must_equal 1 + + end + end # movies_checked_out + end # custom methods end From d0cdedde2e9d9313cad9ec2be16c388c7d4c517c Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 10:46:21 -0800 Subject: [PATCH 17/39] removed checked_out column from rentals table and deleted what was in this migration since we don't actually want this column --- app/controllers/customers_controller.rb | 2 +- db/migrate/20171107181648_add_checked_out.rb | 2 +- db/schema.rb | 3 +-- test/fixtures/rentals.yml | 3 +-- test/models/customer_test.rb | 3 +-- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 153aa54f6..456569149 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -2,7 +2,7 @@ class CustomersController < ApplicationController def index customers = Customer.all render( - json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out]) + json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone]) ) end end diff --git a/db/migrate/20171107181648_add_checked_out.rb b/db/migrate/20171107181648_add_checked_out.rb index f7ee98fad..3dac652f6 100644 --- a/db/migrate/20171107181648_add_checked_out.rb +++ b/db/migrate/20171107181648_add_checked_out.rb @@ -1,5 +1,5 @@ class AddCheckedOut < ActiveRecord::Migration[5.1] def change - add_column :customers, :checked_out, :boolean + end end diff --git a/db/schema.rb b/db/schema.rb index eade83cd2..73c02b67f 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: 20171107181648) do +ActiveRecord::Schema.define(version: 20171106215231) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -26,7 +26,6 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.float "account_credit" - t.boolean "checked_out" end create_table "movies", force: :cascade do |t| diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index d140b5a04..fb50b9fe7 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -4,10 +4,9 @@ one: movie_id: 1 customer_id: 1 due_date: 2017-11-06 - checked_out: true + two: movie_id: 1 customer_id: 1 due_date: 2017-11-06 - checked_out: false diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index e04edb21f..73f57bc3e 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -34,8 +34,7 @@ get customers_path body = JSON.parse(response.body) - body[0][:movies_checked_out].must_equal 1 - + body[0][:movies_checked_out].must_equal 0 end end # movies_checked_out end # custom methods From c18261ad72138545d291648bfce83c41ae4981ad Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 10:48:56 -0800 Subject: [PATCH 18/39] added back in the checked_out column cause do actually do want it --- db/migrate/20171107181648_add_checked_out.rb | 2 +- db/schema.rb | 3 ++- test/models/customer_test.rb | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/db/migrate/20171107181648_add_checked_out.rb b/db/migrate/20171107181648_add_checked_out.rb index 3dac652f6..902b8ef27 100644 --- a/db/migrate/20171107181648_add_checked_out.rb +++ b/db/migrate/20171107181648_add_checked_out.rb @@ -1,5 +1,5 @@ class AddCheckedOut < ActiveRecord::Migration[5.1] def change - + add_column :rentals, :checked_out, :boolean end end diff --git a/db/schema.rb b/db/schema.rb index 73c02b67f..6f7142676 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: 20171106215231) do +ActiveRecord::Schema.define(version: 20171107181648) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -43,6 +43,7 @@ t.date "due_date" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.boolean "checked_out" end end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 73f57bc3e..3f077bc1e 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -28,14 +28,14 @@ end end # validations - describe "custom methods" do - describe "movies_checked_out" do - it "will return a list of the checkout out movies for that customer" do - get customers_path - - body = JSON.parse(response.body) - body[0][:movies_checked_out].must_equal 0 - end - end # movies_checked_out - end # custom methods + # describe "custom methods" do + # describe "movies_checked_out" do + # it "will return a list of the checkout out movies for that customer" do + # get customers_path + # + # body = JSON.parse(response.body) + # body[0][:movies_checked_out].must_equal 0 + # end + # end # movies_checked_out + # end # custom methods end From 863b5d6616f95407cd55f2ef5ca9aa0640b5d044 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 11:00:06 -0800 Subject: [PATCH 19/39] got movies_checked_out_count to where it should be working, but need to add searializer to make sure it is working as expected --- app/controllers/customers_controller.rb | 2 +- app/models/customer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 456569149..75a9f6909 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -2,7 +2,7 @@ class CustomersController < ApplicationController def index customers = Customer.all render( - json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone]) + json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count]) ) end end diff --git a/app/models/customer.rb b/app/models/customer.rb index 1295a553f..fdf13a474 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -3,7 +3,7 @@ class Customer < ApplicationRecord validates :name, presence: true - def self.movies_checked_out + def movies_checked_out_count self.rentals.where(checked_out: true).count end # movies_checked_out From a714ed6e01a949e50e1bb660f3bf1e53d7568ad1 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 11:20:29 -0800 Subject: [PATCH 20/39] movies_checked_out_count is working and being passed as part of the api response --- Gemfile | 1 + Gemfile.lock | 9 +++++++++ app/controllers/customers_controller.rb | 7 ++++--- app/models/customer.rb | 3 +++ app/serializers/customer_serializer.rb | 3 +++ 5 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 app/serializers/customer_serializer.rb diff --git a/Gemfile b/Gemfile index a6e0bdd54..54d1f540c 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,7 @@ gem 'puma', '~> 3.7' # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible # gem 'rack-cors' +gem "active_model_serializers" group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console diff --git a/Gemfile.lock b/Gemfile.lock index 4a738acb5..7cc8096f2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -24,6 +24,11 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) + active_model_serializers (0.10.6) + actionpack (>= 4.1, < 6) + activemodel (>= 4.1, < 6) + case_transform (>= 0.2) + jsonapi-renderer (>= 0.1.1.beta1, < 0.2) activejob (5.1.4) activesupport (= 5.1.4) globalid (>= 0.3.6) @@ -48,6 +53,8 @@ GEM debug_inspector (>= 0.0.1) builder (3.2.3) byebug (9.1.0) + case_transform (0.2) + activesupport coderay (1.1.2) concurrent-ruby (1.0.5) crass (1.0.2) @@ -61,6 +68,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + jsonapi-renderer (0.1.3) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) @@ -151,6 +159,7 @@ PLATFORMS ruby DEPENDENCIES + active_model_serializers better_errors binding_of_caller byebug diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 75a9f6909..9287f3d42 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,8 +1,9 @@ class CustomersController < ApplicationController def index customers = Customer.all - render( - json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count]) - ) + render json: customers, status: :ok + # render( + # json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count]) + # ) end end diff --git a/app/models/customer.rb b/app/models/customer.rb index fdf13a474..859acc7a3 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,4 +1,7 @@ class Customer < ApplicationRecord + + include ActiveModel::Serialization + has_many :rentals validates :name, presence: true diff --git a/app/serializers/customer_serializer.rb b/app/serializers/customer_serializer.rb new file mode 100644 index 000000000..5df7a944b --- /dev/null +++ b/app/serializers/customer_serializer.rb @@ -0,0 +1,3 @@ +class CustomerSerializer < ActiveModel::Serializer + attributes :id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count +end From 6607c40515ed94333b0af9737c895f28b59cfaa7 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 11:27:14 -0800 Subject: [PATCH 21/39] got movies_checked_out_count to be passed in api response not using serializer --- app/controllers/customers_controller.rb | 8 ++++---- app/models/customer.rb | 3 +-- app/serializers/customer_serializer.rb | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 9287f3d42..c3919a8f6 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,9 +1,9 @@ class CustomersController < ApplicationController def index customers = Customer.all - render json: customers, status: :ok - # render( - # json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count]) - # ) + # render json: customers, status: :ok + render( + json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone], methods: [ :movies_checked_out_count]) + ) end end diff --git a/app/models/customer.rb b/app/models/customer.rb index 859acc7a3..8f4558692 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,7 +1,6 @@ class Customer < ApplicationRecord + # include ActiveModel::Serialization - include ActiveModel::Serialization - has_many :rentals validates :name, presence: true diff --git a/app/serializers/customer_serializer.rb b/app/serializers/customer_serializer.rb index 5df7a944b..336c84d80 100644 --- a/app/serializers/customer_serializer.rb +++ b/app/serializers/customer_serializer.rb @@ -1,3 +1,3 @@ -class CustomerSerializer < ActiveModel::Serializer - attributes :id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count -end +# class CustomerSerializer < ActiveModel::Serializer +# attributes :id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count +# end From b2e1a01423ad90671c0643af49c4782cec9f24d7 Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Tue, 7 Nov 2017 11:31:44 -0800 Subject: [PATCH 22/39] committing to switch branches --- app/controllers/movies_controller.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index cfd7e348a..223fcdfbf 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,8 +1,4 @@ class MoviesController < ApplicationController -<<<<<<< HEAD -======= - # protect_from_forgery with: :null_session ->>>>>>> eea8e4e520bf2cd033d0cff710298a1183a7c38d def index movies = Movie.all From 4f1a3c70c00e2d18f0303b8cf30118729a78bd1c Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Tue, 7 Nov 2017 11:41:21 -0800 Subject: [PATCH 23/39] Merging --- app/models/movie.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/movie.rb b/app/models/movie.rb index c3161a31f..1792b5708 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,5 +1,6 @@ class Movie < ApplicationRecord has_many :rentals + validates :title, :inventory, presence: true end From 7174230d1f34b3f6c4b6bbf641c46a6f9a900bbb Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Tue, 7 Nov 2017 11:57:30 -0800 Subject: [PATCH 24/39] Added available_inventory method to Movie --- app/controllers/movies_controller.rb | 4 +++- app/models/movie.rb | 6 +++++- test/controllers/customers_controller_test.rb | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 223fcdfbf..a0d26bb50 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -13,7 +13,7 @@ def show if movie render( - json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]), + json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory], methods: [ :available_inventory]), status: :ok ) else @@ -21,6 +21,8 @@ def show json: {nothing: true}, status: :not_found ) end + + end def create diff --git a/app/models/movie.rb b/app/models/movie.rb index 1792b5708..6f23eb1b6 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,6 +1,10 @@ class Movie < ApplicationRecord has_many :rentals - validates :title, :inventory, presence: true + + def available_inventory + (self.inventory) - (self.rentals.where(checked_out: true).count) + end + end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index fa8c51dbf..10d98a6ad 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -25,14 +25,14 @@ end # returns all the customers it "returns customers with exactly the required fields" do - keys = ["address", "city", "id", "name", "phone", "postal_code", "registered_at", "state"] + keys = ["address", "city", "id", "movies_checked_out_count", "name", "phone", "postal_code", "registered_at", "state"] get customers_path body = JSON.parse(response.body) body.each do |customer| customer.keys.sort.must_equal keys - end # .each + end # .each end # correct fields end # index From afcd1eea5b3574cf15dad100560d2bedf972c4e1 Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Tue, 7 Nov 2017 12:03:26 -0800 Subject: [PATCH 25/39] Model test passes for available inventory method --- test/controllers/movies_controller_test.rb | 4 ++++ test/models/movie_test.rb | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 7967ee395..8cb99b020 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -68,6 +68,10 @@ body = JSON.parse(response.body) body.must_equal "nothing" => true end + + #TO DO + ### Test available inventory + end describe "create" do diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index f1944c505..c3156fe86 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -42,4 +42,15 @@ end end end + + describe "available_inventory" do + it "should return available_inventory" do + movie = Movie.first + available = movie.inventory + movie.available_inventory.must_equal available + end + + # write addidtional test for available_inventory + end + end From e3e356e59bc07eae582e1fc2ce764af7a182a59a Mon Sep 17 00:00:00 2001 From: Sairagul Abdukhalieva Date: Tue, 7 Nov 2017 12:11:37 -0800 Subject: [PATCH 26/39] Model test added to movies_checked_out method --- test/models/customer_test.rb | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 3f077bc1e..a6cd4499c 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -28,14 +28,12 @@ end end # validations - # describe "custom methods" do - # describe "movies_checked_out" do - # it "will return a list of the checkout out movies for that customer" do - # get customers_path - # - # body = JSON.parse(response.body) - # body[0][:movies_checked_out].must_equal 0 - # end - # end # movies_checked_out - # end # custom methods + describe "movies_checked_out_count" do + it "will return the number of checked out movies for that customer" do + customer = Customer.first + customer.movies_checked_out_count.must_equal 0 + # TO DO add test after implementing check out method + + end + end end From d1d5e18e49c089e19980f206438d97f24733cf6f Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 13:24:26 -0800 Subject: [PATCH 27/39] Added foreign key relationships at the db level to the rentals model for customers and movies. Now my tests are passing because rails can use that relationship to run the availible_inventory and movies_checked_out_count methods --- app/models/rental.rb | 2 +- ...7212027_add_foreign_keys_to_rentals_model.rb | 6 ++++++ db/schema.rb | 4 +++- test/models/customer_test.rb | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20171107212027_add_foreign_keys_to_rentals_model.rb diff --git a/app/models/rental.rb b/app/models/rental.rb index 397b590d1..d752985c3 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -4,5 +4,5 @@ class Rental < ApplicationRecord validates :customer_id, presence: true validates :movie_id, presence: true - validates :due_date, presence: true + validates :due_date, presence: true end diff --git a/db/migrate/20171107212027_add_foreign_keys_to_rentals_model.rb b/db/migrate/20171107212027_add_foreign_keys_to_rentals_model.rb new file mode 100644 index 000000000..4006797e6 --- /dev/null +++ b/db/migrate/20171107212027_add_foreign_keys_to_rentals_model.rb @@ -0,0 +1,6 @@ +class AddForeignKeysToRentalsModel < ActiveRecord::Migration[5.1] + def change + add_foreign_key :rentals, :movies + add_foreign_key :rentals, :customers + end +end diff --git a/db/schema.rb b/db/schema.rb index 6f7142676..aaf7030fa 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: 20171107181648) do +ActiveRecord::Schema.define(version: 20171107212027) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -46,4 +46,6 @@ t.boolean "checked_out" end + add_foreign_key "rentals", "customers" + add_foreign_key "rentals", "movies" end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index a6cd4499c..60caec265 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -3,6 +3,23 @@ describe Customer do let(:customer) { Customer.new } + describe "relationships" do + it "has a collection of rentals" do + c = Customer.new(name: "Mira") + c. save + m_id = Movie.first.id + c_id = c.id + + c.must_respond_to :rentals + c.rentals.must_be :empty + + r = Rental.new(customer_id: "c_id", movie_id: "m_id", due_date: Date.new(2017, 12, 1)) + + c.rentals << r + c.rentals.must_include r + end # collection of rentals + end # relationships + describe "validations" do it "can be created if all fields are provided" do start_count = Customer.count From 4c53e22727fc987804a40c1d5c79b1b084177e4a Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 13:25:28 -0800 Subject: [PATCH 28/39] Added test for has_many relationship for customer model to rentals --- test/models/customer_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 60caec265..714fa19af 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -11,7 +11,7 @@ c_id = c.id c.must_respond_to :rentals - c.rentals.must_be :empty + c.rentals.must_be :empty? r = Rental.new(customer_id: "c_id", movie_id: "m_id", due_date: Date.new(2017, 12, 1)) From 7615e3d04eac6c1a650267740caef17cc18e8b95 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 13:33:21 -0800 Subject: [PATCH 29/39] added relationship tests for belongs_to for rentals to customer and movie --- test/models/rental_test.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 4b9e9633b..715635e8a 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -23,4 +23,23 @@ Rental.count.must_equal start_count end end # validations + + describe "relationships" do + let(:m) { Movie.first } + let(:c) { Customer.first } + let(:r) { + Rental.new(customer_id: c.id, movie_id: m.id, due_date: Date.new(2017, 12, 1)) + } + it "belongs to a movie" do + r.must_respond_to :customer + r.customer.must_equal c + r.customer.id.must_equal c.id + end + + it "belongs to a customer" do + r.must_respond_to :movie + r.movie.must_equal m + r.movie.id.must_equal m.id + end + end # relationships end # Rental From f77f8d0027092dda8599bdf6cffa70c9b19bf289 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 14:13:38 -0800 Subject: [PATCH 30/39] wrote part of test for create and made it so checked_out will default to true --- app/controllers/rentals_controller.rb | 6 ++++++ config/routes.rb | 2 ++ ...71107221211_default_to_true_checked_out.rb | 5 +++++ db/schema.rb | 4 ++-- test/controllers/rentals_controller_test.rb | 20 +++++++++++++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 app/controllers/rentals_controller.rb create mode 100644 db/migrate/20171107221211_default_to_true_checked_out.rb create mode 100644 test/controllers/rentals_controller_test.rb diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb new file mode 100644 index 000000000..bc9f7c6b0 --- /dev/null +++ b/app/controllers/rentals_controller.rb @@ -0,0 +1,6 @@ +class RentalsController < ApplicationController + + def create + render json: { "test" => 1} + end +end diff --git a/config/routes.rb b/config/routes.rb index 91e3fca31..c8e3581b1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,4 +4,6 @@ resources :movies, only: [:index, :show, :create] resources :customers, only: [:index] + resources :rentals, only: [:create] + end diff --git a/db/migrate/20171107221211_default_to_true_checked_out.rb b/db/migrate/20171107221211_default_to_true_checked_out.rb new file mode 100644 index 000000000..f87cfc789 --- /dev/null +++ b/db/migrate/20171107221211_default_to_true_checked_out.rb @@ -0,0 +1,5 @@ +class DefaultToTrueCheckedOut < ActiveRecord::Migration[5.1] + def change + change_column :rentals, :checked_out, :boolean, default: true + end +end diff --git a/db/schema.rb b/db/schema.rb index aaf7030fa..a7a09c3f1 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: 20171107212027) do +ActiveRecord::Schema.define(version: 20171107221211) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -43,7 +43,7 @@ t.date "due_date" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.boolean "checked_out" + t.boolean "checked_out", default: true end add_foreign_key "rentals", "customers" diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb new file mode 100644 index 000000000..1baaf91cd --- /dev/null +++ b/test/controllers/rentals_controller_test.rb @@ -0,0 +1,20 @@ +require "test_helper" + +describe RentalsController do + describe "checkout" do + it "will create a new instance of rental" do + c = Customer.first + m = Movie.first + rental_data = + { + customer_id: c.id, + movie_id: m.id + } + start_count = Rental.count + + post rentals_path, params: {rental: rental_data} + + Rental.count.must_equal start_count + 1 + end # create a new instance + end # checkout +end From 6bc172ceb98b39822c7407fed95e97afb53a5e31 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 14:17:19 -0800 Subject: [PATCH 31/39] finished test for create --- test/controllers/rentals_controller_test.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 1baaf91cd..c50eb3541 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -3,6 +3,7 @@ describe RentalsController do describe "checkout" do it "will create a new instance of rental" do + # arrange c = Customer.first m = Movie.first rental_data = @@ -10,11 +11,18 @@ customer_id: c.id, movie_id: m.id } + start_count = Rental.count + availible = m.available_inventory + num_movies = c.movies_checked_out_count + # Act post rentals_path, params: {rental: rental_data} + # Assert Rental.count.must_equal start_count + 1 + m.available_inventory.must_equal availible - 1 + c.movies_checked_out_count.must_equal num_movies + 1 end # create a new instance end # checkout end From 2394d024e6d1123e2be2eac5b3a253d3c07dc311 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 14:29:01 -0800 Subject: [PATCH 32/39] wrote create method and now positive create test is passing --- app/controllers/rentals_controller.rb | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index bc9f7c6b0..a1c376c44 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,6 +1,23 @@ class RentalsController < ApplicationController def create - render json: { "test" => 1} + rental = Rental.new(rental_data) + rental.due_date = Date.today + 3 + binding.pry + if rental.save + binding.pry + render( + json: {id: rental.id, customer_id: rental.customer.id, movie_id: rental.movie.id} + ) + else + render( + json: {error: rental.errors.messages}, status: :bad_request + ) + end # if/else end + + private + def rental_data + params.require(:rental).permit(:customer_id, :movie_id) + end # rental_data end From 1bc48b23932ce216338d63592fbaee06dad61949 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 14:33:03 -0800 Subject: [PATCH 33/39] Added test so that the db won't be changed if the request to create a renal doesn't have a customer_id --- app/controllers/rentals_controller.rb | 2 -- test/controllers/rentals_controller_test.rb | 28 ++++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index a1c376c44..3e46ecda4 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -3,9 +3,7 @@ class RentalsController < ApplicationController def create rental = Rental.new(rental_data) rental.due_date = Date.today + 3 - binding.pry if rental.save - binding.pry render( json: {id: rental.id, customer_id: rental.customer.id, movie_id: rental.movie.id} ) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index c50eb3541..2cef89f21 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,11 +1,11 @@ require "test_helper" describe RentalsController do + let(:c) {Customer.first} + let(:m) {Movie.first} describe "checkout" do it "will create a new instance of rental" do # arrange - c = Customer.first - m = Movie.first rental_data = { customer_id: c.id, @@ -22,7 +22,29 @@ # Assert Rental.count.must_equal start_count + 1 m.available_inventory.must_equal availible - 1 - c.movies_checked_out_count.must_equal num_movies + 1 + c.movies_checked_out_count.must_equal num_movies + 1 end # create a new instance + + it "won't change the db if the request didn't provide the movie_id" do + rental_data = + { + movie_id: m.id + } + + start_count = Rental.count + availible = m.available_inventory + num_movies = c.movies_checked_out_count + + # Act + post rentals_path, params: {rental: rental_data} + + # Assert + Rental.count.must_equal start_count + m.available_inventory.must_equal availible + c.movies_checked_out_count.must_equal num_movies + end # without customer_id + + it "won't change the db if the request didn't provide the customer_id" do + end # without movie_id end # checkout end From 56dba431af344c8e3ef1047737d14a14240ec3cc Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 14:34:58 -0800 Subject: [PATCH 34/39] Added passing test that a new rental won't be created without a movie_id --- test/controllers/rentals_controller_test.rb | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 2cef89f21..841448816 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -41,10 +41,26 @@ # Assert Rental.count.must_equal start_count m.available_inventory.must_equal availible - c.movies_checked_out_count.must_equal num_movies + c.movies_checked_out_count.must_equal num_movies end # without customer_id it "won't change the db if the request didn't provide the customer_id" do + rental_data = + { + customer_id: c.id + } + + start_count = Rental.count + availible = m.available_inventory + num_movies = c.movies_checked_out_count + + # Act + post rentals_path, params: {rental: rental_data} + + # Assert + Rental.count.must_equal start_count + m.available_inventory.must_equal availible + c.movies_checked_out_count.must_equal num_movies end # without movie_id end # checkout end From e876a49a16ca692eb27074aba45ebb2e257b1b49 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 14:48:50 -0800 Subject: [PATCH 35/39] Added test that the correct data is sent back after the new instance of Rental is created --- app/controllers/rentals_controller.rb | 2 +- test/controllers/rentals_controller_test.rb | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 3e46ecda4..7b7fa25ba 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -5,7 +5,7 @@ def create rental.due_date = Date.today + 3 if rental.save render( - json: {id: rental.id, customer_id: rental.customer.id, movie_id: rental.movie.id} + json: {id: rental.id, customer_id: rental.customer.id, movie_id: rental.movie.id, due_date: rental.due_date} ) else render( diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 841448816..0e0ba0394 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -3,15 +3,15 @@ describe RentalsController do let(:c) {Customer.first} let(:m) {Movie.first} + let(:rental_data) { + { + customer_id: c.id, + movie_id: m.id + } + } describe "checkout" do it "will create a new instance of rental" do # arrange - rental_data = - { - customer_id: c.id, - movie_id: m.id - } - start_count = Rental.count availible = m.available_inventory num_movies = c.movies_checked_out_count @@ -62,5 +62,13 @@ m.available_inventory.must_equal availible c.movies_checked_out_count.must_equal num_movies end # without movie_id + + it "sends the correct data back in the response" do + keys = ["customer_id", "due_date", "id", "movie_id"] + post rentals_path, params: {rental: rental_data} + + body = JSON.parse(response.body) + body.keys.sort.must_equal keys + end end # checkout end From 36648e1fa370d2e6214ab6f42ac0251a624b4202 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 15:04:39 -0800 Subject: [PATCH 36/39] wrote positive case test for checkin --- app/controllers/rentals_controller.rb | 5 +++- config/routes.rb | 3 ++- test/controllers/rentals_controller_test.rb | 27 ++++++++++++++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 7b7fa25ba..fee966367 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -12,7 +12,10 @@ def create json: {error: rental.errors.messages}, status: :bad_request ) end # if/else - end + end # create + + def update + end # update private def rental_data diff --git a/config/routes.rb b/config/routes.rb index c8e3581b1..be900cde6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,6 +4,7 @@ resources :movies, only: [:index, :show, :create] resources :customers, only: [:index] - resources :rentals, only: [:create] + resources :rentals, only: [:create, :update] + # patch '/rentals/:id', to: "rentals#checkin", as: 'rental_checkin' end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 0e0ba0394..f2446ae98 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -71,4 +71,29 @@ body.keys.sort.must_equal keys end end # checkout -end + + describe "checkin" do + let(:r) {Rental.new(customer_id: c.id,movie_id: m.id)} + + it "will check in a movie" do + # arrange + start_count = Rental.count + availible = m.available_inventory + num_movies = c.movies_checked_out_count + + r = post rentals_path, params: {rental: rental_data} + + Rental.count.must_equal start_count + 1 + + r_id = Rental.last.id + + # Act + patch rental_path(r_id) + + # Assert + Rental.count.must_equal start_count + m.available_inventory.must_equal availible + c.movies_checked_out_count.must_equal num_movies + end # checkin a movie + end # checkin +end # renals From d7d4510ca7acbe1ccb35e79346c09c901f4efb34 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 15:15:37 -0800 Subject: [PATCH 37/39] positive test for checking in a movie passes --- app/controllers/rentals_controller.rb | 14 +++++++++++++- test/controllers/rentals_controller_test.rb | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index fee966367..d5b446c17 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -15,7 +15,19 @@ def create end # create def update - end # update + rental = Rental.find_by(id: params[:id]) + rental.checked_out = false + if rental.save + binding.pry + render( + json: {"checked_in" => true}, status: :ok + ) + else + render( + json: {error: rental.errors.messages}, status: :bad_request + ) + end # if/else + end # update private def rental_data diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index f2446ae98..8f2523f69 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -84,6 +84,8 @@ r = post rentals_path, params: {rental: rental_data} Rental.count.must_equal start_count + 1 + m.available_inventory.must_equal availible - 1 + c.movies_checked_out_count.must_equal num_movies + 1 r_id = Rental.last.id @@ -91,7 +93,7 @@ patch rental_path(r_id) # Assert - Rental.count.must_equal start_count + Rental.count.must_equal start_count + 1 m.available_inventory.must_equal availible c.movies_checked_out_count.must_equal num_movies end # checkin a movie From c870ccae1a72e1b86d6708e94d6275d187fdc844 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 15:27:04 -0800 Subject: [PATCH 38/39] added test and functionality to handle when the rental being updated does not exist --- app/controllers/rentals_controller.rb | 21 +++++++++++------- test/controllers/rentals_controller_test.rb | 24 +++++++++++++++++++-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index d5b446c17..c94b15a5e 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -16,17 +16,22 @@ def create def update rental = Rental.find_by(id: params[:id]) - rental.checked_out = false - if rental.save - binding.pry - render( - json: {"checked_in" => true}, status: :ok - ) + if rental + rental.checked_out = false + if rental.save + render( + json: {"checked_in" => true}, status: :ok + ) + else + render( + json: {error: rental.errors.messages}, status: :bad_request + ) + end # if/else else render( - json: {error: rental.errors.messages}, status: :bad_request + json: {"no rental found": true}, status: :not_found ) - end # if/else + end # if rental end # update private diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 8f2523f69..1caa9a9c9 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -75,7 +75,7 @@ describe "checkin" do let(:r) {Rental.new(customer_id: c.id,movie_id: m.id)} - it "will check in a movie" do + it "will check in a movie if the movie exists" do # arrange start_count = Rental.count availible = m.available_inventory @@ -85,7 +85,7 @@ Rental.count.must_equal start_count + 1 m.available_inventory.must_equal availible - 1 - c.movies_checked_out_count.must_equal num_movies + 1 + c.movies_checked_out_count.must_equal num_movies + 1 r_id = Rental.last.id @@ -97,5 +97,25 @@ m.available_inventory.must_equal availible c.movies_checked_out_count.must_equal num_movies end # checkin a movie + + it "will return not_found if rental does not exist" do + # arrange + start_count = Rental.count + + r = post rentals_path, params: {rental: rental_data} + + Rental.count.must_equal start_count + 1 + + r_id = Rental.last.id + 1 + + # Act + patch rental_path(r_id) + + # Assert + must_respond_with :not_found + + body = JSON.parse(response.body) + body.must_equal "no rental found" => true + end # not_found end # checkin end # renals From 04051f5b33fa9d323565d58fafdecb38b6148a03 Mon Sep 17 00:00:00 2001 From: Tamira Vojnar Date: Tue, 7 Nov 2017 16:08:02 -0800 Subject: [PATCH 39/39] added some comments to models and controllers --- app/controllers/customers_controller.rb | 1 + app/controllers/movies_controller.rb | 3 +++ app/controllers/rentals_controller.rb | 6 ++++++ app/models/customer.rb | 2 ++ app/models/movie.rb | 2 ++ 5 files changed, 14 insertions(+) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index c3919a8f6..3ef2de06d 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,4 +1,5 @@ class CustomersController < ApplicationController +# this action returns information for all of the customers in the api request def index customers = Customer.all # render json: customers, status: :ok diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index a0d26bb50..142638721 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,5 +1,6 @@ class MoviesController < ApplicationController +# this action will return a list of all the movies in the api response def index movies = Movie.all render( @@ -8,6 +9,7 @@ def index ) end +# this action will return information for a sinlge instance of Movie in the api request def show movie = Movie.find_by(id: params[:id]) @@ -25,6 +27,7 @@ def show end +# this action allows a new instance of Movie to be created by the user of the api def create movie = Movie.new(movie_params) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index c94b15a5e..e160d97c4 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,5 +1,8 @@ class RentalsController < ApplicationController + # This method is used to 'check-out' a movie. + # A new instance of Rental is created using a customer_id and movie_id passed in by the user + # This instance of Rental's checked_out status defaults to true def create rental = Rental.new(rental_data) rental.due_date = Date.today + 3 @@ -7,6 +10,7 @@ def create render( json: {id: rental.id, customer_id: rental.customer.id, movie_id: rental.movie.id, due_date: rental.due_date} ) + # if the user did not pass in valid information (i.e. there was no customer_id or movie_id) then the new instance of Rental will not save else render( json: {error: rental.errors.messages}, status: :bad_request @@ -14,6 +18,7 @@ def create end # if/else end # create + # the update method is used to 'check-in' a movie. It changes the checked_out attribute for the rental to false def update rental = Rental.find_by(id: params[:id]) if rental @@ -27,6 +32,7 @@ def update json: {error: rental.errors.messages}, status: :bad_request ) end # if/else + # if the rental_id passed in does not exist then not_found is returned else render( json: {"no rental found": true}, status: :not_found diff --git a/app/models/customer.rb b/app/models/customer.rb index 8f4558692..c666fdb0b 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -5,6 +5,8 @@ class Customer < ApplicationRecord validates :name, presence: true + # this method calculates the number of movies checked out for the index action for customer + # when we render json in the index action it knows to run this method for each instance of Customer (treating the each instance as self) without having to pass any parameters to this method. def movies_checked_out_count self.rentals.where(checked_out: true).count end # movies_checked_out diff --git a/app/models/movie.rb b/app/models/movie.rb index 6f23eb1b6..b30daecc5 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -3,6 +3,8 @@ class Movie < ApplicationRecord validates :title, :inventory, presence: true + # this method shows the availible inventory for a specific movies_path + # when this method is called in the show action for movie (:available_inventory) it knows that self is the instance of movie that 'movie' points to without having to pass any parameters to this method def available_inventory (self.inventory) - (self.rentals.where(checked_out: true).count) end