From d1022e7296f1d8f3eb378a8dbbfe2d3e0031835c Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 21:49:10 -0700 Subject: [PATCH 01/53] Set up the inviremant --- .gitignore | 27 +++ .ruby-version | 1 + Gemfile | 57 +++++ Gemfile.lock | 212 ++++++++++++++++++ Guardfile | 9 + Rakefile | 6 + app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/jobs/application_job.rb | 7 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/mailer.html.erb | 13 ++ app/views/layouts/mailer.text.erb | 1 + bin/bundle | 114 ++++++++++ bin/rails | 9 + bin/rake | 9 + bin/setup | 33 +++ bin/spring | 17 ++ config.ru | 5 + config/application.rb | 41 ++++ config/boot.rb | 4 + config/cable.yml | 10 + config/credentials.yml.enc | 1 + config/database.yml | 85 +++++++ config/environment.rb | 5 + config/environments/development.rb | 52 +++++ config/environments/production.rb | 105 +++++++++ config/environments/test.rb | 49 ++++ config/initializers/action_view.rb | 1 + .../application_controller_renderer.rb | 8 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/cors.rb | 16 ++ .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 ++ config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 ++ config/locales/en.yml | 33 +++ config/puma.rb | 38 ++++ config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 +++ db/schema.rb | 18 ++ lib/tasks/.keep | 0 log/.keep | 0 node_modules/.yarn-integrity | 10 + public/robots.txt | 1 + storage/.keep | 0 .../application_cable/connection_test.rb | 11 + test/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 | 21 ++ tmp/.keep | 0 tmp/pids/.keep | 0 vendor/.keep | 0 yarn.lock | 4 + 62 files changed, 1138 insertions(+) create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 Rakefile create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/action_view.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cors.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/spring.rb create mode 100644 config/storage.yml create mode 100644 db/schema.rb create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 node_modules/.yarn-integrity create mode 100644 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/channels/application_cable/connection_test.rb create mode 100644 test/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 tmp/pids/.keep create mode 100644 vendor/.keep create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8a1b1134b --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/ +!/tmp/pids/.keep + +# Ignore uploaded files in development. +/storage/* +!/storage/.keep +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 000000000..57cf282eb --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.6.5 diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..b585a3d2b --- /dev/null +++ b/Gemfile @@ -0,0 +1,57 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.6.5' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 6.0.3', '>= 6.0.3.1' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 4.1' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +# gem 'jbuilder', '~> 2.7' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use Active Model has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Active Storage variant +# gem 'image_processing', '~> 1.2' + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.4.2', require: false + +# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible +# gem 'rack-cors' + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + gem 'listen', '~> 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'guard' + gem 'guard-minitest' + gem 'debase', '>= 0.2.4.1' + gem 'ruby-debug-ide', '>= 0.7.0' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..41b7d4311 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,212 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (6.0.3.1) + actionpack (= 6.0.3.1) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (6.0.3.1) + actionpack (= 6.0.3.1) + activejob (= 6.0.3.1) + activerecord (= 6.0.3.1) + activestorage (= 6.0.3.1) + activesupport (= 6.0.3.1) + mail (>= 2.7.1) + actionmailer (6.0.3.1) + actionpack (= 6.0.3.1) + actionview (= 6.0.3.1) + activejob (= 6.0.3.1) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (6.0.3.1) + actionview (= 6.0.3.1) + activesupport (= 6.0.3.1) + rack (~> 2.0, >= 2.0.8) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.0.3.1) + actionpack (= 6.0.3.1) + activerecord (= 6.0.3.1) + activestorage (= 6.0.3.1) + activesupport (= 6.0.3.1) + nokogiri (>= 1.8.5) + actionview (6.0.3.1) + activesupport (= 6.0.3.1) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + activejob (6.0.3.1) + activesupport (= 6.0.3.1) + globalid (>= 0.3.6) + activemodel (6.0.3.1) + activesupport (= 6.0.3.1) + activerecord (6.0.3.1) + activemodel (= 6.0.3.1) + activesupport (= 6.0.3.1) + activestorage (6.0.3.1) + actionpack (= 6.0.3.1) + activejob (= 6.0.3.1) + activerecord (= 6.0.3.1) + marcel (~> 0.3.1) + activesupport (6.0.3.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + ansi (1.5.0) + bootsnap (1.4.6) + msgpack (~> 1.0) + builder (3.2.4) + byebug (11.1.3) + coderay (1.1.2) + concurrent-ruby (1.1.6) + crass (1.0.6) + debase (0.2.4.1) + debase-ruby_core_source (>= 0.10.2) + debase-ruby_core_source (0.10.9) + erubi (1.9.0) + ffi (1.12.2) + formatador (0.2.5) + globalid (0.4.2) + activesupport (>= 4.2.0) + guard (2.16.2) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-minitest (2.4.6) + guard-compat (~> 1.2) + minitest (>= 3.0) + i18n (1.8.2) + concurrent-ruby (~> 1.0) + listen (3.2.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + loofah (2.5.0) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.2.4) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (1.0.0) + mimemagic (0.3.5) + mini_mime (1.0.2) + mini_portile2 (2.4.0) + minitest (5.14.1) + minitest-rails (6.0.1) + minitest (~> 5.10) + railties (~> 6.0.0) + minitest-reporters (1.4.2) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.3.3) + nenv (0.3.0) + nio4r (2.5.2) + nokogiri (1.10.9) + mini_portile2 (~> 2.4.0) + notiffany (0.1.3) + nenv (~> 0.1) + shellany (~> 0.0) + pg (1.2.3) + pry (0.13.1) + coderay (~> 1.1) + method_source (~> 1.0) + pry-rails (0.3.9) + pry (>= 0.10.4) + puma (4.3.5) + nio4r (~> 2.0) + rack (2.2.2) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (6.0.3.1) + actioncable (= 6.0.3.1) + actionmailbox (= 6.0.3.1) + actionmailer (= 6.0.3.1) + actionpack (= 6.0.3.1) + actiontext (= 6.0.3.1) + actionview (= 6.0.3.1) + activejob (= 6.0.3.1) + activemodel (= 6.0.3.1) + activerecord (= 6.0.3.1) + activestorage (= 6.0.3.1) + activesupport (= 6.0.3.1) + bundler (>= 1.3.0) + railties (= 6.0.3.1) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + railties (6.0.3.1) + actionpack (= 6.0.3.1) + activesupport (= 6.0.3.1) + method_source + rake (>= 0.8.7) + thor (>= 0.20.3, < 2.0) + rake (13.0.1) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + ruby-debug-ide (0.7.2) + rake (>= 0.8.1) + ruby-progressbar (1.10.1) + shellany (0.0.1) + spring (2.1.0) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (4.0.0) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (1.0.1) + thread_safe (0.3.6) + tzinfo (1.2.7) + thread_safe (~> 0.1) + websocket-driver (0.7.2) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.4) + zeitwerk (2.3.0) + +PLATFORMS + ruby + +DEPENDENCIES + bootsnap (>= 1.4.2) + byebug + debase (>= 0.2.4.1) + guard + guard-minitest + listen (~> 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 4.1) + rails (~> 6.0.3, >= 6.0.3.1) + ruby-debug-ide (>= 0.7.0) + spring + spring-watcher-listen (~> 2.0.0) + tzinfo-data + +RUBY VERSION + ruby 2.6.5p114 + +BUNDLED WITH + 2.1.4 diff --git a/Guardfile b/Guardfile new file mode 100644 index 000000000..e34f706f4 --- /dev/null +++ b/Guardfile @@ -0,0 +1,9 @@ +guard :minitest, autorun: false, spring: true do + watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' } + watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" } + watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" } + watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" } + watch(%r{^test/.+_test.rb$}) + watch(%r{^test/test_helper.rb$}) { 'test' } +end diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..e85f91391 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 000000000..d67269728 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 000000000..0ff5442f4 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 000000000..4ac8823b0 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::API +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 000000000..d394c3d10 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,7 @@ +class ApplicationJob < ActiveJob::Base + # Automatically retry jobs that encountered a deadlock + # retry_on ActiveRecord::Deadlocked + + # Most jobs are safe to ignore if the underlying records are no longer available + # discard_on ActiveJob::DeserializationError +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 000000000..286b2239d --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 000000000..10a4cba84 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 000000000..cbd34d2e9 --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 000000000..37f0bddbd --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 000000000..a71368e32 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,114 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'bundle' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "rubygems" + +m = Module.new do + module_function + + def invoked_as_script? + File.expand_path($0) == File.expand_path(__FILE__) + end + + def env_var_version + ENV["BUNDLER_VERSION"] + end + + def cli_arg_version + return unless invoked_as_script? # don't want to hijack other binstubs + return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` + bundler_version = nil + update_index = nil + ARGV.each_with_index do |a, i| + if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN + bundler_version = a + end + next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ + bundler_version = $1 + update_index = i + end + bundler_version + end + + def gemfile + gemfile = ENV["BUNDLE_GEMFILE"] + return gemfile if gemfile && !gemfile.empty? + + File.expand_path("../../Gemfile", __FILE__) + end + + def lockfile + lockfile = + case File.basename(gemfile) + when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) + else "#{gemfile}.lock" + end + File.expand_path(lockfile) + end + + def lockfile_version + return unless File.file?(lockfile) + lockfile_contents = File.read(lockfile) + return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ + Regexp.last_match(1) + end + + def bundler_version + @bundler_version ||= + env_var_version || cli_arg_version || + lockfile_version + end + + def bundler_requirement + return "#{Gem::Requirement.default}.a" unless bundler_version + + bundler_gem_version = Gem::Version.new(bundler_version) + + requirement = bundler_gem_version.approximate_recommendation + + return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") + + requirement += ".a" if bundler_gem_version.prerelease? + + requirement + end + + def load_bundler! + ENV["BUNDLE_GEMFILE"] ||= gemfile + + activate_bundler + end + + def activate_bundler + gem_error = activation_error_handling do + gem "bundler", bundler_requirement + end + return if gem_error.nil? + require_error = activation_error_handling do + require "bundler/version" + end + return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) + warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" + exit 42 + end + + def activation_error_handling + yield + nil + rescue StandardError, LoadError => e + e + end +end + +m.load_bundler! + +if m.invoked_as_script? + load Gem.bin_path("bundler", "bundle") +end diff --git a/bin/rails b/bin/rails new file mode 100755 index 000000000..5badb2fde --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 000000000..d87d5f578 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 000000000..0e39e8cb1 --- /dev/null +++ b/bin/setup @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby +require 'fileutils' + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +FileUtils.chdir APP_ROOT do + # This script is a way to setup or update your development environment automatically. + # This script is idempotent, so that you can run it at anytime and get an expectable outcome. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:prepare' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 000000000..d89ee495f --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads Spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == 'spring' } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 000000000..f7ba0b527 --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 000000000..43301a817 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,41 @@ +require_relative 'boot' + +require "rails" +# Pick the frameworks you want: +require "active_model/railtie" +require "active_job/railtie" +require "active_record/railtie" +require "active_storage/engine" +require "action_controller/railtie" +require "action_mailer/railtie" +require "action_mailbox/engine" +require "action_text/engine" +require "action_view/railtie" +require "action_cable/engine" +# require "sprockets/railtie" +require "rails/test_unit/railtie" + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module VideoStoreApi + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 6.0 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + + # Only loads a smaller set of middleware suitable for API only apps. + # Middleware like session, flash, cookies can be added back manually. + # Skip views, helpers and assets when generating a new resource. + config.api_only = true + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 000000000..b9e460cef --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..6b21ab7bc --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: test + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: video_store_api_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 000000000..6858c9191 --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +WW7T8iQqvoihxk5W/+pobr8VpbNZA305DEp7wa7w6PdTmtnZOOI5Vi0Zmi7fJN9Cr1inkAOolBDssFq746nvIz0T7isVdsII0LAquD2123D5AlUPdA+j1RdEhkmSQrFVczYLd0lHaeCqBYb7vC49P4KeSm55PU9wR9b23i+7vk/cbSZMykIXETrxk3PSd2n9Nz7Rqh+umQPVgNfH2RuHssmfiu85XNja8OomnkZm06I7JvGAHKoKxbaBVecQEnNnOIjIdHSlgz/jCEUTjrs0Vb6q/7FQP6bBcheFdUga1BMX9knJojMS0u8XKjPetZzD+IAaF2PKhJ2LC9YZdNYDtZ3B/xkHgV21CsBac290BTH56e4UkuzP3WKUSAGfqtTxRMMJSis9OL0Y1D/D9tNOeSJy3oG2v63cW7BN--3AZkuqAsvIViFUug--fELgihJ/I+f9AkqN9RHi2w== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 000000000..8536d1cda --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.3 and up are supported. +# +# Install the pg driver: +# gem install pg +# On macOS with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On macOS with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # https://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: video_store_api_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: video_store_api + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: video_store_api_test + +# As with config/credentials.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: video_store_api_production + username: video_store_api + password: <%= ENV['VIDEO_STORE_API_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 000000000..426333bb4 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 000000000..698f159d8 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,52 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + + # Raises error for missing translations. + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 000000000..7a3bb3e50 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,105 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain. + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment). + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "video_store_api_production" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false + + # Inserts middleware to perform automatic connection switching. + # The `database_selector` hash is used to pass options to the DatabaseSelector + # middleware. The `delay` is used to determine how long to wait after a write + # to send a subsequent read to the primary. + # + # The `database_resolver` class is used by the middleware to determine which + # database is appropriate to use based on the time delay. + # + # The `database_resolver_context` class is used by the middleware to set + # timestamps for the last write to the primary. The resolver uses the context + # class timestamps to determine how long to wait before reading from the + # replica. + # + # By default Rails will store a last write timestamp in the session. The + # DatabaseSelector middleware is designed as such you can define your own + # strategy for connection switching and pass that into the middleware through + # these configuration options. + # config.active_record.database_selector = { delay: 2.seconds } + # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 000000000..0cb24249b --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,49 @@ +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + config.cache_classes = false + config.action_view.cache_template_loading = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + config.cache_store = :null_store + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory. + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations. + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 000000000..142d382f8 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1 @@ +Rails.application.config.action_view.form_with_generates_remote_forms = false diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 000000000..59385cdf3 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb new file mode 100644 index 000000000..3b1c1b5ed --- /dev/null +++ b/config/initializers/cors.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Avoid CORS issues when API is called from the frontend app. +# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. + +# Read more: https://github.com/cyu/rack-cors + +# Rails.application.config.middleware.insert_before 0, Rack::Cors do +# allow do +# origins 'example.com' +# +# resource '*', +# headers: :any, +# methods: [:get, :post, :put, :patch, :delete, :options, :head] +# end +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 000000000..4a994e1e7 --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 000000000..ac033bf9d --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 000000000..dc1899682 --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 000000000..bbfc3961b --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 000000000..cf9b342d0 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at https://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 000000000..5ed443774 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,38 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the `pidfile` that Puma will use. +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked web server processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 000000000..c06383a17 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html +end diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..db5bf1307 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +Spring.watch( + ".ruby-version", + ".rbenv-vars", + "tmp/restart.txt", + "tmp/caching-dev.txt" +) diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 000000000..d32f76e8f --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..b10373ba6 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,18 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `rails +# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 0) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + +end diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/log/.keep b/log/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 000000000..0f19eb7ab --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "darwin-x64-83", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..c19f78ab6 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/channels/application_cable/connection_test.rb b/test/channels/application_cable/connection_test.rb new file mode 100644 index 000000000..800405f15 --- /dev/null +++ b/test/channels/application_cable/connection_test.rb @@ -0,0 +1,11 @@ +require "test_helper" + +class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase + # test "connects with cookies" do + # cookies.signed[:user_id] = 42 + # + # connect + # + # assert_equal connection.user_id, "42" + # end +end diff --git a/test/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..b19af0d5b --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,21 @@ +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +require 'rails/test_help' +require "minitest/rails" +require "minitest/reporters" # for Colorized output +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + +class ActiveSupport::TestCase + # Run tests in parallel with specified workers + # parallelize(workers: :number_of_processors) # causes out of order output. + + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/tmp/pids/.keep b/tmp/pids/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..fb57ccd13 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + From 50dba0c410ab493e24a7b1e41aa1955252d5bedd Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 21:55:43 -0700 Subject: [PATCH 02/53] add Customer Schema --- app/models/customer.rb | 2 ++ db/migrate/20200527045321_create_customers.rb | 15 +++++++++++++++ db/schema.rb | 14 +++++++++++++- test/models/customer_test.rb | 7 +++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 app/models/customer.rb create mode 100644 db/migrate/20200527045321_create_customers.rb create mode 100644 test/models/customer_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/db/migrate/20200527045321_create_customers.rb b/db/migrate/20200527045321_create_customers.rb new file mode 100644 index 000000000..89a48e5a4 --- /dev/null +++ b/db/migrate/20200527045321_create_customers.rb @@ -0,0 +1,15 @@ +class CreateCustomers < ActiveRecord::Migration[6.0] + def change + create_table :customers do |t| + t.string :name + t.datetime :registered_at + t.string :address + t.string :city + t.string :state + t.string :postal_code + t.string :phone + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index b10373ba6..ae566be3f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,9 +10,21 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 0) do +ActiveRecord::Schema.define(version: 2020_05_27_045321) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "customers", force: :cascade do |t| + t.string "name" + t.datetime "registered_at" + t.string "address" + t.string "city" + t.string "state" + t.string "postal_code" + t.string "phone" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb new file mode 100644 index 000000000..30d5c5309 --- /dev/null +++ b/test/models/customer_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Customer do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From d1f0ef3765ef90bea8741691c2b435c3b2adfa64 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 21:58:28 -0700 Subject: [PATCH 03/53] added conteroller for Customer --- app/controllers/customers_controller.rb | 4 ++++ config/routes.rb | 1 + test/controllers/customers_controller_test.rb | 9 +++++++++ 3 files changed, 14 insertions(+) create mode 100644 app/controllers/customers_controller.rb create mode 100644 test/controllers/customers_controller_test.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb new file mode 100644 index 000000000..73302240c --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,4 @@ +class CustomersController < ApplicationController + def index + end +end diff --git a/config/routes.rb b/config/routes.rb index c06383a17..45e6114d0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,4 @@ Rails.application.routes.draw do + get 'customers/index' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb new file mode 100644 index 000000000..20069eb1a --- /dev/null +++ b/test/controllers/customers_controller_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe CustomersController do + it "must get index" do + get customers_index_url + must_respond_with :success + end + +end From 857e050e7f7d55621d291f691cf726d4d3628390 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 22:01:00 -0700 Subject: [PATCH 04/53] add routes for Customer --- config/routes.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 45e6114d0..82aea6680 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ Rails.application.routes.draw do get 'customers/index' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + + resources :customers, only: [:index] end From 832a084931b93503492e1987f130e3581d8e0592 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 22:05:10 -0700 Subject: [PATCH 05/53] add model for Vidoes --- app/models/video.rb | 2 ++ db/migrate/20200527050426_create_videos.rb | 13 +++++++++++++ db/schema.rb | 12 +++++++++++- test/models/video_test.rb | 7 +++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 app/models/video.rb create mode 100644 db/migrate/20200527050426_create_videos.rb create mode 100644 test/models/video_test.rb diff --git a/app/models/video.rb b/app/models/video.rb new file mode 100644 index 000000000..dc572b44b --- /dev/null +++ b/app/models/video.rb @@ -0,0 +1,2 @@ +class Video < ApplicationRecord +end diff --git a/db/migrate/20200527050426_create_videos.rb b/db/migrate/20200527050426_create_videos.rb new file mode 100644 index 000000000..166cf0b96 --- /dev/null +++ b/db/migrate/20200527050426_create_videos.rb @@ -0,0 +1,13 @@ +class CreateVideos < ActiveRecord::Migration[6.0] + def change + create_table :videos do |t| + t.string :title + t.string :overview + t.date :release_date + t.integer :total_inventory + t.integer :available_inventory + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index ae566be3f..ad08616ba 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_05_27_045321) do +ActiveRecord::Schema.define(version: 2020_05_27_050426) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -27,4 +27,14 @@ t.datetime "updated_at", precision: 6, null: false end + create_table "videos", force: :cascade do |t| + t.string "title" + t.string "overview" + t.date "release_date" + t.integer "total_inventory" + t.integer "available_inventory" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + end diff --git a/test/models/video_test.rb b/test/models/video_test.rb new file mode 100644 index 000000000..eead50d2f --- /dev/null +++ b/test/models/video_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Video do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 76bae4ae88f607d2433be0247137dbff054b6c69 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 22:07:19 -0700 Subject: [PATCH 06/53] add contoller for Videos --- app/controllers/videos_controller.rb | 10 ++++++++++ config/routes.rb | 3 +++ test/controllers/videos_controller_test.rb | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 app/controllers/videos_controller.rb create mode 100644 test/controllers/videos_controller_test.rb diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb new file mode 100644 index 000000000..8c63e1d04 --- /dev/null +++ b/app/controllers/videos_controller.rb @@ -0,0 +1,10 @@ +class VideosController < ApplicationController + def index + end + + def show + end + + def create + end +end diff --git a/config/routes.rb b/config/routes.rb index 82aea6680..e50e30c80 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,7 @@ Rails.application.routes.draw do + get 'videos/index' + get 'videos/show' + get 'videos/create' get 'customers/index' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb new file mode 100644 index 000000000..fe6ee33c3 --- /dev/null +++ b/test/controllers/videos_controller_test.rb @@ -0,0 +1,19 @@ +require "test_helper" + +describe VideosController do + it "must get index" do + get videos_index_url + must_respond_with :success + end + + it "must get show" do + get videos_show_url + must_respond_with :success + end + + it "must get create" do + get videos_create_url + must_respond_with :success + end + +end From a1d66ace22164f5e64e0352f84c97050f4de87c4 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 22:09:01 -0700 Subject: [PATCH 07/53] add routes for videos --- config/routes.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index e50e30c80..e54595104 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,12 @@ Rails.application.routes.draw do - get 'videos/index' - get 'videos/show' - get 'videos/create' - get 'customers/index' + # get 'videos/index' + # get 'videos/show' + # get 'videos/create' + # get 'customers/index' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html resources :customers, only: [:index] + + resources :videos, only: [:index, :show, :create] + end From ea700c35b38125464f678934cbf11b387156ce1d Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Tue, 26 May 2020 22:27:42 -0700 Subject: [PATCH 08/53] add relationship betwin databases --- app/models/customer.rb | 2 ++ app/models/video.rb | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/models/customer.rb b/app/models/customer.rb index 0b5277335..ab2215bdc 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,2 +1,4 @@ class Customer < ApplicationRecord + # has_many :rentals + has_many :videos #through: :rentals end diff --git a/app/models/video.rb b/app/models/video.rb index dc572b44b..aaf4e12c1 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -1,2 +1,4 @@ class Video < ApplicationRecord + # has_many :rentals + has_many :customers #through: :rentals end From e8b1e4353e67c97b5ee87858c19c30b29ab1e3c5 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 00:12:26 -0700 Subject: [PATCH 09/53] set up rental controller --- app/controllers/rentals_controller.rb | 4 ++++ app/models/rental.rb | 4 ++++ config/routes.rb | 2 ++ db/migrate/20200527055921_create_rentals.rb | 13 +++++++++++++ test/controllers/rentals_controller_test.rb | 9 +++++++++ test/models/rental_test.rb | 7 +++++++ 6 files changed, 39 insertions(+) create mode 100644 app/controllers/rentals_controller.rb create mode 100644 app/models/rental.rb create mode 100644 db/migrate/20200527055921_create_rentals.rb create mode 100644 test/controllers/rentals_controller_test.rb create mode 100644 test/models/rental_test.rb diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb new file mode 100644 index 000000000..48f311fbc --- /dev/null +++ b/app/controllers/rentals_controller.rb @@ -0,0 +1,4 @@ +class RentalsController < ApplicationController + def index + end +end diff --git a/app/models/rental.rb b/app/models/rental.rb new file mode 100644 index 000000000..144989547 --- /dev/null +++ b/app/models/rental.rb @@ -0,0 +1,4 @@ +class Rental < ApplicationRecord + belongs_to :videos + belongs_to :customers +end diff --git a/config/routes.rb b/config/routes.rb index e54595104..0b5cdf784 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Rails.application.routes.draw do + get 'rentals/index' # get 'videos/index' # get 'videos/show' # get 'videos/create' @@ -9,4 +10,5 @@ resources :videos, only: [:index, :show, :create] + resources :rentals, only: [:index] end diff --git a/db/migrate/20200527055921_create_rentals.rb b/db/migrate/20200527055921_create_rentals.rb new file mode 100644 index 000000000..a88791c57 --- /dev/null +++ b/db/migrate/20200527055921_create_rentals.rb @@ -0,0 +1,13 @@ +class CreateRentals < ActiveRecord::Migration[6.0] + def change + create_table :rentals do |t| + t.string :title + t.string :name + t.string :postal_code + t.datetime :checkout_date + t.datetime :due_date + + t.timestamps + end + end +end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb new file mode 100644 index 000000000..4f6c21eb6 --- /dev/null +++ b/test/controllers/rentals_controller_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe RentalsController do + it "must get index" do + get rentals_index_url + must_respond_with :success + end + +end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb new file mode 100644 index 000000000..3e64959b4 --- /dev/null +++ b/test/models/rental_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Rental do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 636459e7d57c3be64444760e783841c67c9e90c4 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 00:12:55 -0700 Subject: [PATCH 10/53] edit customer relations --- app/models/customer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/customer.rb b/app/models/customer.rb index ab2215bdc..fd1dc21c8 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,4 +1,4 @@ class Customer < ApplicationRecord - # has_many :rentals - has_many :videos #through: :rentals + has_many :rentals + has_many :videos, through: :rentals end From 49d304c73ea382e393291391c2428250f20eefee Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 00:13:20 -0700 Subject: [PATCH 11/53] edit video relations --- app/models/video.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/video.rb b/app/models/video.rb index aaf4e12c1..c40a47c30 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -1,4 +1,4 @@ class Video < ApplicationRecord - # has_many :rentals - has_many :customers #through: :rentals + has_many :rentals + has_many :customers, through: :rentals end From 351a6a16ae889d1533baef83760a340ceeae98bd Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 00:13:51 -0700 Subject: [PATCH 12/53] table migration --- db/migrate/20200527060415_relate_tables.rb | 6 ++++++ db/schema.rb | 18 +++++++++++++++++- db/seeds.rb | 2 +- node_modules/.yarn-integrity | 6 ++++-- 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20200527060415_relate_tables.rb diff --git a/db/migrate/20200527060415_relate_tables.rb b/db/migrate/20200527060415_relate_tables.rb new file mode 100644 index 000000000..fc2d43201 --- /dev/null +++ b/db/migrate/20200527060415_relate_tables.rb @@ -0,0 +1,6 @@ +class RelateTables < ActiveRecord::Migration[6.0] + def change + add_reference :rentals, :customers, foreign_key: true + add_reference :rentals, :videos, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index ad08616ba..5d0b214f3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_05_27_050426) do +ActiveRecord::Schema.define(version: 2020_05_27_060415) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -27,6 +27,20 @@ t.datetime "updated_at", precision: 6, null: false end + create_table "rentals", force: :cascade do |t| + t.string "title" + t.string "name" + t.string "postal_code" + t.datetime "checkout_date" + t.datetime "due_date" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.bigint "customers_id" + t.bigint "videos_id" + t.index ["customers_id"], name: "index_rentals_on_customers_id" + t.index ["videos_id"], name: "index_rentals_on_videos_id" + end + create_table "videos", force: :cascade do |t| t.string "title" t.string "overview" @@ -37,4 +51,6 @@ t.datetime "updated_at", precision: 6, null: false end + add_foreign_key "rentals", "customers", column: "customers_id" + add_foreign_key "rentals", "videos", column: "videos_id" end diff --git a/db/seeds.rb b/db/seeds.rb index 2ea255387..06003891a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,5 +1,5 @@ JSON.parse(File.read('db/seeds/customers.json')).each do |customer| - customer['videos_checked_out_count'] = 1 + # customer['videos_checked_out_count'] = 1 Customer.create!(customer) end diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity index 0f19eb7ab..e1aa95ff5 100644 --- a/node_modules/.yarn-integrity +++ b/node_modules/.yarn-integrity @@ -1,6 +1,8 @@ { - "systemParams": "darwin-x64-83", - "modulesFolders": [], + "systemParams": "darwin-x64-79", + "modulesFolders": [ + "node_modules" + ], "flags": [], "linkedModules": [], "topLevelPatterns": [], From e3f9cd7c967c70ef1d0df02b36b4b7a64518e44b Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 00:44:52 -0700 Subject: [PATCH 13/53] added test for index --- test/controllers/videos_controller_test.rb | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index fe6ee33c3..a7cbb1439 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -1,19 +1,25 @@ require "test_helper" describe VideosController do + it "must get index" do - get videos_index_url - must_respond_with :success - end + get videos_path - it "must get show" do - get videos_show_url must_respond_with :success + expect(response.header['Content-Type']).must_include 'json' end - it "must get create" do - get videos_create_url - must_respond_with :success - end + + + + # it "must get show" do + # get videos_show_url + # must_respond_with :success + # end + + # it "must get create" do + # get videos_create_url + # must_respond_with :success + # end end From 06a33279f993b14dbf5455c53776c3814f252242 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 00:46:22 -0700 Subject: [PATCH 14/53] added index action in Videos controller --- app/controllers/videos_controller.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 8c63e1d04..c078a952c 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -1,7 +1,14 @@ class VideosController < ApplicationController def index + + videos = Video.all.order(:id) + + render json: videos.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), + status: :ok + end + def show end From b014a00078cd033526c41ae58bccf136c49e71cd Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 00:52:43 -0700 Subject: [PATCH 15/53] added test to check if the index is returning all proper feelds for list of videos --- test/controllers/videos_controller_test.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index a7cbb1439..d397b1420 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -1,6 +1,7 @@ require "test_helper" describe VideosController do + VIDEO_FIELDS = ["id", "title", "overview", "release_date", "total_inventory", "available_inventory"] it "must get index" do get videos_path @@ -9,6 +10,20 @@ expect(response.header['Content-Type']).must_include 'json' end + it "will return all the proper fields for a list of videos" do + + get videos_path + + body = JSON.parse(response.body) + + expect(body).must_be_instance_of Array + + body.each do |video| + expect(video).must_be_instance_of Hash + expect(video.keys.sort).must_equal VIDEO_FIELDS + end + end + From cd399b2cc2c976cf5f01327da65d54d16187f092 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 00:57:07 -0700 Subject: [PATCH 16/53] add test for if its no videos to test if index will return an empty array --- test/controllers/videos_controller_test.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index d397b1420..94b888a28 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -24,6 +24,17 @@ end end + it "returns an empty array if no videos exist" do + Video.destroy_all + + get videos_path + + body = JSON.parse(response.body) + + expect(body).must_be_instance_of Array + expect(body.length).must_equal 0 + end + From 18b2373808217cf498d78d64683296ec8e831bb0 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 01:16:02 -0700 Subject: [PATCH 17/53] add fixtures for videos --- test/fixtures/videos.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 test/fixtures/videos.yml diff --git a/test/fixtures/videos.yml b/test/fixtures/videos.yml new file mode 100644 index 000000000..e55acfc28 --- /dev/null +++ b/test/fixtures/videos.yml @@ -0,0 +1,36 @@ +video1: + title: Blacksmith Of The Banished + overview: The unexciting life of a boy will be permanently altered as a strange woman enters his life. + release_date: 1979-01-18 + total_inventory: 10 + available_inventory: 9 +video2: + title: Savior Of The Curse + overview: The strange woman claims the boy has a DNA strain which very likely offers the key to cure several crippling diseases. Tests will have to be done, but the key to save millions of lives is within the grasp of science through this DNA strain. Unsure what to think of all this and of this strange woman, the boy hesitantly agrees to the proposal, there's something exciting about this whole situation, surely the right choice was made. + release_date: 2010-11-05 + total_inventory: 1 + available_inventory: 1 +video3: + title: Women Of Destruction + overview: But what if this strange woman is a con artist. Or what if everything told is completely true. How could an ordinary boy be relied upon in something this big. Time will tell. + release_date: 2006-10-01 + total_inventory: 1 + available_inventory: 1 +video4: + title: Robots Of Eternity + overview: The laid-back life of a woman is going in a different direction as a childhood friend enters her life. + release_date: 2007-10-10 + total_inventory: 7 + available_inventory: 5 +video5: + title: Rats And Strangers + overview: The childhood friend claims the woman is heir to an incredible fortune, all paperwork has been taken care of already, all there's left to do is sign them. Distrustful of both this situation and of this childhood friend, the woman somewhat gladly agrees to the proposal, but there's no time to waste, a decision had to be made quickly. + release_date: 2012-09-25 + total_inventory: 2 + available_inventory: 2 +video6: + title: Soldiers And Gangsters + overview: But what if this childhood friend is just a crazy person. Or what if the complete opposite is true. How could an ordinary woman be relied upon in something this big. No turning back now though.", + release_date: 1948-03-31 + total_inventory: 9 + available_inventory: 8 \ No newline at end of file From 34f4b78f95449b71737603c15359c5bb80104886 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 01:17:27 -0700 Subject: [PATCH 18/53] add nominal test for show action --- test/controllers/videos_controller_test.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index 94b888a28..df277d954 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" describe VideosController do - VIDEO_FIELDS = ["id", "title", "overview", "release_date", "total_inventory", "available_inventory"] + VIDEO_FIELDS = ["id", "title", "overview", "release_date", "total_inventory", "available_inventory"].sort it "must get index" do get videos_path @@ -35,6 +35,24 @@ expect(body.length).must_equal 0 end + describe "show" do + # Nominal + it "for an existing video will return a hash with the proper fields" do + video = videos(:video1) + + get video_path(video.id) + + must_respond_with :success + + body = JSON.parse(response.body) + + expect(response.header['Content-Type']).must_include 'json' + + expect(body).must_be_instance_of Hash + expect(body.keys.sort).must_equal VIDEO_FIELDS + end + end + From 8bf6b9eda76c9071a4a5f669fca9bd28f887852f Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 01:31:22 -0700 Subject: [PATCH 19/53] added edge test for show action --- test/controllers/videos_controller_test.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index df277d954..39c2c3582 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -51,6 +51,17 @@ expect(body).must_be_instance_of Hash expect(body.keys.sort).must_equal VIDEO_FIELDS end + + # Edge Case + it " for a non-existent video will return a 404 request with json" do + get video_path(-1) + + must_respond_with :not_found + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + expect(body['ok']).must_equal false + expect(body['message']).must_equal 'Not found' + end end From d678f9086ded0990ccb758866e677be4a3ce3812 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 01:32:01 -0700 Subject: [PATCH 20/53] added show action for video contoller --- app/controllers/videos_controller.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index c078a952c..f5fc383a1 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -8,8 +8,21 @@ def index end - def show + video = Video.find_by(id: params[:id]) + + if video.nil? + render json: { + ok: false, + message: 'Not found', + }, status: :not_found + + + return + end + + render json: video.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), + status: :ok end def create From 3f05b6e639970ad0bc1636814ae3264386acaedc Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 12:26:15 -0700 Subject: [PATCH 21/53] added test for success video create --- test/controllers/videos_controller_test.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index 39c2c3582..df7fdb745 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -64,6 +64,22 @@ end end + describe "create" do + it "can create new video" do + video_params = { + video: { + title: "video1", + overview: "Somthing", + release_date: "1979-01-18", + total_inventory: 10, + available_inventory: 9, + } + } + expect{ post videos_path, params: video_params}.must_differ "Video.count", 1 + must_respond_with :created + end + end + From eab54cf3c5d813b6d6b3611ac14f93f6e9cf200f Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 12:29:04 -0700 Subject: [PATCH 22/53] pass the test that create successfully the video --- app/controllers/videos_controller.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index f5fc383a1..e5db5ddd9 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -22,9 +22,23 @@ def show end render json: video.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), - status: :ok + status: :ok end def create + video = Video.new(video_params) + if video.save + render json: video.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), status: :created + else + #TODO + end + end + + private + + def video_params + return params.require(:video).permit(:title, :overview, :release_date, :total_inventory, :available_inventory) + end + end From aa82f00f0bcb5a5200a22aa9a06ead5ad0fca135 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 12:59:40 -0700 Subject: [PATCH 23/53] index test for customer --- app/controllers/customers_controller.rb | 2 ++ test/controllers/customers_controller_test.rb | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 73302240c..f8cbefec6 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,4 +1,6 @@ class CustomersController < ApplicationController def index + #@customers = Customer.all + render json: { ready_for_lunch: "yessss" }, status: :ok end end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 20069eb1a..287ad53b4 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -1,9 +1,12 @@ require "test_helper" describe CustomersController do - it "must get index" do - get customers_index_url - must_respond_with :success - end + describe "index" do + it "responds with JSON and success" do + get customers_path + expect(response.header['Content-Type']).must_include 'json' + must_respond_with :ok + end + end end From 8d6065c159b15f1cc6b0709b17b6cbc94636f054 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 13:21:24 -0700 Subject: [PATCH 24/53] add validation for video --- app/models/video.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/models/video.rb b/app/models/video.rb index c40a47c30..9ba4e8351 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -1,4 +1,10 @@ class Video < ApplicationRecord has_many :rentals has_many :customers, through: :rentals + + validates :title, presence: true + validates :overview, presence: true + validates :release_date, presence: true + validates :total_inventory, presence: true + validates :available_inventory, presence: true end From 938b8deca42ba816e35f9206248563e77014a83b Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 13:28:31 -0700 Subject: [PATCH 25/53] added tests for bad_request and pass add code to create action to pass the test --- app/controllers/videos_controller.rb | 3 +- test/controllers/videos_controller_test.rb | 38 +++++++++++++--------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index e5db5ddd9..2388b1473 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -17,7 +17,6 @@ def show message: 'Not found', }, status: :not_found - return end @@ -30,7 +29,7 @@ def create if video.save render json: video.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), status: :created else - #TODO + render json: {errors: video.errors.messages}, status: :bad_request end end diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index df7fdb745..5e7cacd55 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -65,9 +65,8 @@ end describe "create" do - it "can create new video" do - video_params = { - video: { + let (:video_params){ + {video: { title: "video1", overview: "Somthing", release_date: "1979-01-18", @@ -75,22 +74,31 @@ available_inventory: 9, } } + } + + it "can create new video" do expect{ post videos_path, params: video_params}.must_differ "Video.count", 1 must_respond_with :created end - end - - + it "gives bad_request status when user doesn't adding all the feeled" do + video_params[:video][:title] = nil + video_params[:video][:overview] = nil + video_params[:video][:release_date] = nil + video_params[:video][:total_inventory] = nil + video_params[:video][:available_inventory] = nil + + expect{ post videos_path, params: video_params}.wont_change "Video.count" + must_respond_with :bad_request - # it "must get show" do - # get videos_show_url - # must_respond_with :success - # end - - # it "must get create" do - # get videos_create_url - # must_respond_with :success - # end + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body['errors'].keys).must_include "title" + expect(body['errors'].keys).must_include "overview" + expect(body['errors'].keys).must_include "release_date" + expect(body['errors'].keys).must_include "total_inventory" + expect(body['errors'].keys).must_include "available_inventory" + end + end end From d225bdf48b5a99829a2f5c820f3cc1f4046094f6 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 14:38:00 -0700 Subject: [PATCH 26/53] add nomianl test that video can be instantiated --- test/models/video_test.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index eead50d2f..c1b53fc14 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -1,7 +1,13 @@ require "test_helper" describe Video do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + before do + @video = Video.new(title: "Somthign", overview: "Somthing", release_date: 2017-03-14, total_inventory: 4, available_inventory: 5) + end + + it "Video can be instantiated" do + expect(@video.valid?).must_equal true + end + + end From 1f911f399c096270444d2d102b679b6f0ec23a09 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 14:41:58 -0700 Subject: [PATCH 27/53] added test that video will have required field --- test/models/video_test.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index c1b53fc14..22cfcad4e 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -5,9 +5,15 @@ @video = Video.new(title: "Somthign", overview: "Somthing", release_date: 2017-03-14, total_inventory: 4, available_inventory: 5) end - it "Video can be instantiated" do + it "video can be instantiated" do expect(@video.valid?).must_equal true end + it "video will have the required field" do + [:id, :title, :overview, :release_date, :total_inventory, :available_inventory].each do |field| + expect(@video).must_respond_to field + end + end + end From de17b367f1d9f16024baade056bd0344684344e3 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 14:47:48 -0700 Subject: [PATCH 28/53] added tests for title validation --- test/models/video_test.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index 22cfcad4e..ef8e0a74e 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -15,5 +15,19 @@ end end + describe "validations" do + it "it's invalid when video does't have title" do + @video.title = nil + expect(@video.valid?).must_equal false + expect(@video.errors.messages).must_include :title + expect(@video.errors.messages[:title]).must_equal ["can't be blank"] + end + + it "it's valid when video has title" do + @video.title = "Somthing" + expect(@video.valid?).must_equal true + end + end + end From 296b1cd125d6bd41249f5e64250d940f47306708 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 14:58:27 -0700 Subject: [PATCH 29/53] added tests for overview validation --- test/models/video_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index ef8e0a74e..521d1ae29 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -27,6 +27,18 @@ @video.title = "Somthing" expect(@video.valid?).must_equal true end + + it "it's invalid when video does't have overview" do + @video.overview = nil + expect(@video.valid?).must_equal false + expect(@video.errors.messages).must_include :overview + expect(@video.errors.messages[:overview]).must_equal ["can't be blank"] + end + + it "it's valid when video has overview" do + @video.overview = "Somthing" + expect(@video.valid?).must_equal true + end end From 9ac44a06dc32ee8efe967c88a0079db08bade843 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 15:02:02 -0700 Subject: [PATCH 30/53] added tests for release_date validation --- test/models/video_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index 521d1ae29..b7e9d14a7 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -39,6 +39,18 @@ @video.overview = "Somthing" expect(@video.valid?).must_equal true end + + it "it's invalid when video does't have release_date" do + @video.release_date = nil + expect(@video.valid?).must_equal false + expect(@video.errors.messages).must_include :release_date + expect(@video.errors.messages[:release_date]).must_equal ["can't be blank"] + end + + it "it's valid when video has release_date" do + @video.release_date = 2017-03-14 + expect(@video.valid?).must_equal true + end end From 9d3daf854343897d2fb40cf42d1278f587a3d0ff Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 15:05:02 -0700 Subject: [PATCH 31/53] added tests for total_inventory validation --- test/models/video_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index b7e9d14a7..b85c18c13 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -51,6 +51,18 @@ @video.release_date = 2017-03-14 expect(@video.valid?).must_equal true end + + it "it's invalid when video does't have total_inventory" do + @video.total_inventory = nil + expect(@video.valid?).must_equal false + expect(@video.errors.messages).must_include :total_inventory + expect(@video.errors.messages[:total_inventory]).must_equal ["can't be blank"] + end + + it "it's valid when video has total_inventory" do + @video.total_inventory = 2 + expect(@video.valid?).must_equal true + end end From d4e8f8f5988ae071dc4bbded560d4ecf9dc6d63b Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 15:06:22 -0700 Subject: [PATCH 32/53] added tests for available_inventory validation --- test/models/video_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/models/video_test.rb b/test/models/video_test.rb index b85c18c13..9b6733298 100644 --- a/test/models/video_test.rb +++ b/test/models/video_test.rb @@ -63,6 +63,18 @@ @video.total_inventory = 2 expect(@video.valid?).must_equal true end + + it "it's invalid when video does't have available_inventory" do + @video.available_inventory = nil + expect(@video.valid?).must_equal false + expect(@video.errors.messages).must_include :available_inventory + expect(@video.errors.messages[:available_inventory]).must_equal ["can't be blank"] + end + + it "it's valid when video has available_inventory" do + @video.available_inventory = 2 + expect(@video.valid?).must_equal true + end end From 0123bb456e9961ee45dd88ecaa2ab7e0fc205e99 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 15:28:40 -0700 Subject: [PATCH 33/53] update customer controller and index test --- app/controllers/customers_controller.rb | 7 +++-- test/controllers/customers_controller_test.rb | 27 +++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index f8cbefec6..217a32e07 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,6 +1,9 @@ class CustomersController < ApplicationController def index - #@customers = Customer.all - render json: { ready_for_lunch: "yessss" }, status: :ok + customers = Customer.all.order(:name) + + # render json: { ready_for_lunch: "yessss" }, status: :ok + render json: customers.as_json(only: [:id, :name, :register_at, :address, :city, :state, :postal_code, :phone]), + status: :ok end end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 287ad53b4..dd54c6875 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -2,11 +2,28 @@ describe CustomersController do describe "index" do - it "responds with JSON and success" do - get customers_path + CUSTOMER_FIELDS = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone"].sort + it "must get index" do + get customers_path + must_respond_with :success expect(response.header['Content-Type']).must_include 'json' - must_respond_with :ok end - end -end + it "will return all the proper fields for a list of customers" do + get customers_path + body = JSON.parse(response.body) + expect(body).must_be_instance_of Array + body.each do |customer| + expect(customer).must_be_instance_of Hash + expect(customer.keys.sort).must_equal CUSTOMER_FIELDS + end + end + it "returns an empty array if no customers exist" do + Customer.destroy_all + get customers_path + body = JSON.parse(response.body) + expect(body).must_be_instance_of Array + expect(body.length).must_equal 0 + end + end +end \ No newline at end of file From e2d2122c34376818a384c33f73faa32a51d13999 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Wed, 27 May 2020 15:41:09 -0700 Subject: [PATCH 34/53] small change in video index action --- app/controllers/videos_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 2388b1473..59bbc88ba 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -1,7 +1,7 @@ class VideosController < ApplicationController def index - videos = Video.all.order(:id) + videos = Video.all.order(:title) render json: videos.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), status: :ok From 68a75f081447e976f85d634eaaff930d2c15f688 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 21:53:20 -0700 Subject: [PATCH 35/53] added column to customers --- db/migrate/20200528044917_videos_checked_out_count.rb | 5 +++++ db/schema.rb | 3 ++- db/seeds.rb | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20200528044917_videos_checked_out_count.rb diff --git a/db/migrate/20200528044917_videos_checked_out_count.rb b/db/migrate/20200528044917_videos_checked_out_count.rb new file mode 100644 index 000000000..22c3abb00 --- /dev/null +++ b/db/migrate/20200528044917_videos_checked_out_count.rb @@ -0,0 +1,5 @@ +class VideosCheckedOutCount < ActiveRecord::Migration[6.0] + def change + add_column :customers, :videos_checked_out_count, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 5d0b214f3..29e65139f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_05_27_060415) do +ActiveRecord::Schema.define(version: 2020_05_28_044917) 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", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.integer "videos_checked_out_count" end create_table "rentals", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index 06003891a..2ea255387 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,5 +1,5 @@ JSON.parse(File.read('db/seeds/customers.json')).each do |customer| - # customer['videos_checked_out_count'] = 1 + customer['videos_checked_out_count'] = 1 Customer.create!(customer) end From 96c4edfd024f57dbe8ec7bd3960fc0e2382c4503 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 21:57:58 -0700 Subject: [PATCH 36/53] added routes for check-in, check-out --- config/routes.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 0b5cdf784..b47bb76b7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,9 +6,12 @@ # get 'customers/index' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + resources :videos, only: [:index, :show, :create] + resources :customers, only: [:index] - resources :videos, only: [:index, :show, :create] + post '/rentals/check-out', to: 'rentals#check_out', as: 'check_out' + post '/rentals/check-in', to: 'rentals#check_in', as: 'check_in' - resources :rentals, only: [:index] + # resources :rentals, only: [:index] end From cfc5ea44a2416c520a6458f52f01b7e3d1fa3219 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 22:15:01 -0700 Subject: [PATCH 37/53] rename rental column --- .../20200528050650_change_rental_column_name.rb | 6 ++++++ db/schema.rb | 14 +++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20200528050650_change_rental_column_name.rb diff --git a/db/migrate/20200528050650_change_rental_column_name.rb b/db/migrate/20200528050650_change_rental_column_name.rb new file mode 100644 index 000000000..1481e4ac8 --- /dev/null +++ b/db/migrate/20200528050650_change_rental_column_name.rb @@ -0,0 +1,6 @@ +class ChangeRentalColumnName < ActiveRecord::Migration[6.0] + def change + rename_column :rentals, :customers_id, :customer_id + rename_column :rentals, :videos_id, :video_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 29e65139f..dcabd47ef 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_05_28_044917) do +ActiveRecord::Schema.define(version: 2020_05_28_050650) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -36,10 +36,10 @@ t.datetime "due_date" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false - t.bigint "customers_id" - t.bigint "videos_id" - t.index ["customers_id"], name: "index_rentals_on_customers_id" - t.index ["videos_id"], name: "index_rentals_on_videos_id" + t.bigint "customer_id" + t.bigint "video_id" + t.index ["customer_id"], name: "index_rentals_on_customer_id" + t.index ["video_id"], name: "index_rentals_on_video_id" end create_table "videos", force: :cascade do |t| @@ -52,6 +52,6 @@ t.datetime "updated_at", precision: 6, null: false end - add_foreign_key "rentals", "customers", column: "customers_id" - add_foreign_key "rentals", "videos", column: "videos_id" + add_foreign_key "rentals", "customers" + add_foreign_key "rentals", "videos" end From b4ba6f6741b44dac45b8df914124b1005c7594de Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 22:16:12 -0700 Subject: [PATCH 38/53] fixed rental relationships --- app/models/rental.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index 144989547..2420bf8cc 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,4 +1,4 @@ class Rental < ApplicationRecord - belongs_to :videos - belongs_to :customers + belongs_to :video + belongs_to :customer end From 41a572d5a60fe9f83483fdb44ae79329f0e8f420 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 27 May 2020 22:43:45 -0700 Subject: [PATCH 39/53] check out method added --- app/controllers/rentals_controller.rb | 42 +++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 48f311fbc..f4b4af5de 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,4 +1,42 @@ class RentalsController < ApplicationController - def index + + #decrease available_inventory + #increase videos_checked_out_count + def check_out + @video = Video.find_by(id: params[:id]) + @customer = Customer.find_by(id: params[:id]) + + if video.nil? && customer.nil? + rental = Rental.find_by(customer_id: @customer.id, video_id: @video.id) + if (rental.nil?) && (@video.video_id.available_inventory > 0) #this availability has to be the same as the video_id + rental_params = {customer_id: @customer.id, video_id: @video.id} + new_rental = Rental.new(rental_params) + #videos_checked_out_count needs to increment + end + else #video and customer are nil, show error + render json: { + ok: false, + message: 'Not found', + }, status: :not_found + end + + end #check_out method + + + def check_in + #increase available_inventory + + #decrease videos_checked_out_count + end -end + + + + private + + # def rental_params + # return params.require(:rental).permit(:customer_id, :video_id) + # end + +end #class + From 55e8eee5fdf218fc3cb8e2ffe0d87555556b0269 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 28 May 2020 03:00:43 -0700 Subject: [PATCH 40/53] rental methods --- app/controllers/customers_controller.rb | 4 +- app/controllers/rentals_controller.rb | 165 +++++++++++++++--- db/migrate/20200527045321_create_customers.rb | 3 +- db/migrate/20200527055921_create_rentals.rb | 12 +- db/migrate/20200527060415_relate_tables.rb | 6 - ...20200528044917_videos_checked_out_count.rb | 5 - ...0200528050650_change_rental_column_name.rb | 6 - db/schema.rb | 20 +-- 8 files changed, 165 insertions(+), 56 deletions(-) delete mode 100644 db/migrate/20200527060415_relate_tables.rb delete mode 100644 db/migrate/20200528044917_videos_checked_out_count.rb delete mode 100644 db/migrate/20200528050650_change_rental_column_name.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 217a32e07..b09baac3f 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -3,7 +3,9 @@ def index customers = Customer.all.order(:name) # render json: { ready_for_lunch: "yessss" }, status: :ok - render json: customers.as_json(only: [:id, :name, :register_at, :address, :city, :state, :postal_code, :phone]), + render json: customers.as_json(only: [:id, :name, :register_at, :address, :city, :state, :postal_code, :phone, :videos_checked_out_count]), status: :ok end end + + diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index f4b4af5de..9f0aa91bc 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,42 +1,167 @@ +require 'date' + class RentalsController < ApplicationController #decrease available_inventory #increase videos_checked_out_count + #POST def check_out - @video = Video.find_by(id: params[:id]) - @customer = Customer.find_by(id: params[:id]) + #calling required params immediately + #in Postman, test that this gets triggered by mispelling "rentals" to "rentils", will return a 400 + rental_params() + + #accessing customer_id and video_id + customer_id = params[:rental][:customer_id] + video_id = params[:rental][:video_id] + # puts customer_id + # puts video_id - if video.nil? && customer.nil? - rental = Rental.find_by(customer_id: @customer.id, video_id: @video.id) - if (rental.nil?) && (@video.video_id.available_inventory > 0) #this availability has to be the same as the video_id - rental_params = {customer_id: @customer.id, video_id: @video.id} - new_rental = Rental.new(rental_params) - #videos_checked_out_count needs to increment - end - else #video and customer are nil, show error + #quering DB to find customer and video object + customer = Customer.find_by(id: customer_id) + video = Video.find_by(id: video_id) #another version: video = Video.find(video_id) + + # puts customer.name + # puts video.title + + #check if customer_id and video_id exist + if customer.nil? || video.nil? + #head :not_found #404 + # response with error message per requirement render json: { - ok: false, - message: 'Not found', + "errors": { + "user_video": [ + "Not Found" + ] + } }, status: :not_found + return + end + + #check if available_inventory is less than 1 + #Req: The API should return back detailed errors and a status 400: Bad Request if the video does not have any available inventory before check out + if video.available_inventory < 1 + # response with error message per requirement + render json: { + "errors": { + "available_inventory": [ + "No available inventory" + ] + } + }, status: :bad_request + + return end + # increase the customer's videos_checked_out_count by one (customers) + customer.videos_checked_out_count += 1 + # decrease the video's available_inventory by one (videos) + video.available_inventory -= 1 + # create a due date. The rental's due date is the seven days from the current date. + #https://stackoverflow.com/questions/8196434/rails-datetime-now-without-time + due_date = (DateTime.current.to_date) + 7 + #puts due_date + + #create rental object + rental = Rental.new + rental.customer_id = customer_id + rental.video_id = video_id + rental.check_out = DateTime.current.to_date + rental.due_date = due_date + + #if rental is able to save, then also save customer and video + #if rental does not save, then customer and video don't save + #helps DB stay in sync + if rental.save #save to db + customer.save #save customer object with video checked out count back to db + video.save #save video available inventory back to db + end + + #manually create the json to meet requirement + render json: {"customer_id": customer_id, + "video_id": video_id, + "due_date": due_date, + "videos_checked_out_count": customer.videos_checked_out_count, + "available_inventory": video.available_inventory}, + status: :ok + end #check_out method - + #********************************************************************* + def check_in - #increase available_inventory + rental_params + #accessing customer_id and video_id + customer_id = params[:rental][:customer_id] + video_id = params[:rental][:video_id] - #decrease videos_checked_out_count + #quering DB to find customer and video object + customer = Customer.find_by(id: customer_id) + video = Video.find_by(id: video_id) - end + #check if customer_id and video_id exist + if customer.nil? || video.nil? + #head :not_found #404 + # response with error message per requirement + render json: { + "errors": { + "user_video": [ + "Not Found" + ] + } + }, status: :not_found - + return + end + + # decrease the customer's videos_checked_out_count by one (customers) + customer.videos_checked_out_count -= 1 + # increase the video's available_inventory by one (videos) + video.available_inventory += 1 + + #find first rental object + #limit 1 bc scenario: i check out 20 copies of jurassic park, but when i check in, i will return just 1 + #return the one is due soonest + rentals = Rental.where(check_in: nil, customer_id: customer_id, video_id: video_id).order(due_date: :asc).limit(1) + #check if rental exists + if rentals.nil? || rentals.length == 0 + #head :not_found #404 + render json: { + "errors": { + "rental": [ + "Not found" + ] + } + }, status: :not_found + + return + end + + #populate the check in date + rental = rentals[0] + #when i check in a video, i use today's date + rental.check_in = DateTime.current.to_date + + #need to save updates made to rental in db + if rental.save #save to db + customer.save #save customer object with video checked out count back to db + video.save #save video available inventory back to db + end + #manually create the json to meet requirement + render json: {"customer_id": customer_id, + "video_id": video_id, + "videos_checked_out_count": customer.videos_checked_out_count, + "available_inventory": video.available_inventory}, + status: :ok + + end #check in method + + private - # def rental_params - # return params.require(:rental).permit(:customer_id, :video_id) - # end + def rental_params + return params.require(:rental).permit(:customer_id, :video_id) + end end #class diff --git a/db/migrate/20200527045321_create_customers.rb b/db/migrate/20200527045321_create_customers.rb index 89a48e5a4..19ed49405 100644 --- a/db/migrate/20200527045321_create_customers.rb +++ b/db/migrate/20200527045321_create_customers.rb @@ -8,7 +8,8 @@ def change t.string :state t.string :postal_code t.string :phone - + t.integer :videos_checked_out_count + t.timestamps end end diff --git a/db/migrate/20200527055921_create_rentals.rb b/db/migrate/20200527055921_create_rentals.rb index a88791c57..ca8662533 100644 --- a/db/migrate/20200527055921_create_rentals.rb +++ b/db/migrate/20200527055921_create_rentals.rb @@ -1,12 +1,12 @@ class CreateRentals < ActiveRecord::Migration[6.0] def change create_table :rentals do |t| - t.string :title - t.string :name - t.string :postal_code - t.datetime :checkout_date - t.datetime :due_date - + t.date :check_in #just need date, time not a requirement + t.date :check_out + t.date :due_date + t.belongs_to :customer + t.belongs_to :video + t.timestamps end end diff --git a/db/migrate/20200527060415_relate_tables.rb b/db/migrate/20200527060415_relate_tables.rb deleted file mode 100644 index fc2d43201..000000000 --- a/db/migrate/20200527060415_relate_tables.rb +++ /dev/null @@ -1,6 +0,0 @@ -class RelateTables < ActiveRecord::Migration[6.0] - def change - add_reference :rentals, :customers, foreign_key: true - add_reference :rentals, :videos, foreign_key: true - end -end diff --git a/db/migrate/20200528044917_videos_checked_out_count.rb b/db/migrate/20200528044917_videos_checked_out_count.rb deleted file mode 100644 index 22c3abb00..000000000 --- a/db/migrate/20200528044917_videos_checked_out_count.rb +++ /dev/null @@ -1,5 +0,0 @@ -class VideosCheckedOutCount < ActiveRecord::Migration[6.0] - def change - add_column :customers, :videos_checked_out_count, :integer - end -end diff --git a/db/migrate/20200528050650_change_rental_column_name.rb b/db/migrate/20200528050650_change_rental_column_name.rb deleted file mode 100644 index 1481e4ac8..000000000 --- a/db/migrate/20200528050650_change_rental_column_name.rb +++ /dev/null @@ -1,6 +0,0 @@ -class ChangeRentalColumnName < ActiveRecord::Migration[6.0] - def change - rename_column :rentals, :customers_id, :customer_id - rename_column :rentals, :videos_id, :video_id - end -end diff --git a/db/schema.rb b/db/schema.rb index dcabd47ef..3062e63a0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_05_28_050650) do +ActiveRecord::Schema.define(version: 2020_05_27_055921) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -23,21 +23,19 @@ t.string "state" t.string "postal_code" t.string "phone" + t.integer "videos_checked_out_count" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false - t.integer "videos_checked_out_count" end create_table "rentals", force: :cascade do |t| - t.string "title" - t.string "name" - t.string "postal_code" - t.datetime "checkout_date" - t.datetime "due_date" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.date "check_in" + t.date "check_out" + t.date "due_date" t.bigint "customer_id" t.bigint "video_id" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false t.index ["customer_id"], name: "index_rentals_on_customer_id" t.index ["video_id"], name: "index_rentals_on_video_id" end @@ -52,6 +50,6 @@ t.datetime "updated_at", precision: 6, null: false end - add_foreign_key "rentals", "customers" - add_foreign_key "rentals", "videos" end + +#to recreate schema: https://stackoverflow.com/questions/9731585/lost-my-schema-rb-can-it-be-regenerated \ No newline at end of file From e17da6725204d9d6db875931b40d56b9d8a6d70e Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 14:25:31 -0700 Subject: [PATCH 41/53] fix strong parems method --- app/controllers/videos_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 59bbc88ba..60fb3537b 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -37,7 +37,7 @@ def create private def video_params - return params.require(:video).permit(:title, :overview, :release_date, :total_inventory, :available_inventory) + return params.permit(:title, :overview, :release_date, :total_inventory, :available_inventory) end end From 5fc3ce729b1a79dea324427ee2f658d69e925508 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 28 May 2020 14:52:37 -0700 Subject: [PATCH 42/53] fixed layers of errors, all tests pass --- app/controllers/rentals_controller.rb | 40 ++++++++++++--------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 9f0aa91bc..65c5a436e 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -8,11 +8,11 @@ class RentalsController < ApplicationController def check_out #calling required params immediately #in Postman, test that this gets triggered by mispelling "rentals" to "rentils", will return a 400 - rental_params() + # rental_params() #accessing customer_id and video_id - customer_id = params[:rental][:customer_id] - video_id = params[:rental][:video_id] + customer_id = rental_params[:customer_id] + video_id = rental_params[:video_id] # puts customer_id # puts video_id @@ -28,12 +28,11 @@ def check_out #head :not_found #404 # response with error message per requirement render json: { - "errors": { - "user_video": [ - "Not Found" - ] - } + "errors": [ + "Not Found" + ] }, status: :not_found + return end @@ -42,11 +41,9 @@ def check_out if video.available_inventory < 1 # response with error message per requirement render json: { - "errors": { - "available_inventory": [ - "No available inventory" - ] - } + "errors": [ + "No available inventory" + ] }, status: :bad_request return @@ -89,10 +86,10 @@ def check_out #********************************************************************* def check_in - rental_params + # rental_params #accessing customer_id and video_id - customer_id = params[:rental][:customer_id] - video_id = params[:rental][:video_id] + customer_id = rental_params[:customer_id] + video_id = rental_params[:video_id] #quering DB to find customer and video object customer = Customer.find_by(id: customer_id) @@ -103,13 +100,10 @@ def check_in #head :not_found #404 # response with error message per requirement render json: { - "errors": { - "user_video": [ - "Not Found" - ] - } + "errors": [ + "Not Found" + ] }, status: :not_found - return end @@ -160,7 +154,7 @@ def check_in private def rental_params - return params.require(:rental).permit(:customer_id, :video_id) + return params.permit(:customer_id, :video_id) end end #class From c8f28a611acfcc1bbb08732a95ba197e6db91feb Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 28 May 2020 15:38:32 -0700 Subject: [PATCH 43/53] fixed spelling and error messages to pass tests --- app/controllers/customers_controller.rb | 2 +- app/controllers/videos_controller.rb | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index b09baac3f..e3f7aa26a 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -3,7 +3,7 @@ def index customers = Customer.all.order(:name) # render json: { ready_for_lunch: "yessss" }, status: :ok - render json: customers.as_json(only: [:id, :name, :register_at, :address, :city, :state, :postal_code, :phone, :videos_checked_out_count]), + render json: customers.as_json(only: [:id, :name, :registered_at, :postal_code, :phone, :videos_checked_out_count]), status: :ok end end diff --git a/app/controllers/videos_controller.rb b/app/controllers/videos_controller.rb index 60fb3537b..56edec925 100644 --- a/app/controllers/videos_controller.rb +++ b/app/controllers/videos_controller.rb @@ -3,9 +3,8 @@ def index videos = Video.all.order(:title) - render json: videos.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), + render json: videos.as_json(only: [:id, :title, :release_date, :available_inventory]), status: :ok - end def show @@ -13,21 +12,22 @@ def show if video.nil? render json: { - ok: false, - message: 'Not found', + errors:[ + "Not Found" + ] }, status: :not_found return end - render json: video.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), + render json: video.as_json(only: [:title, :overview, :release_date, :total_inventory, :available_inventory]), status: :ok end def create video = Video.new(video_params) if video.save - render json: video.as_json(only: [:id, :title, :overview, :release_date, :total_inventory, :available_inventory]), status: :created + render json: video.as_json(only: [:id]), status: :created else render json: {errors: video.errors.messages}, status: :bad_request end From d551bda35ebb944f1973d9ec9fb364344a54c027 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 28 May 2020 15:45:38 -0700 Subject: [PATCH 44/53] update to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 8a1b1134b..8abe6d725 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ # Ignore master key for decrypting credentials and more. /config/master.key + +.DS_store \ No newline at end of file From 5e44ab28ea5621238802bf839c4cbe9ed17a1991 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 28 May 2020 17:16:53 -0700 Subject: [PATCH 45/53] fixed rental route and index to pass test --- app/controllers/rentals_controller.rb | 8 ++++++++ config/routes.rb | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 65c5a436e..6c4fcabb4 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,7 +1,15 @@ require 'date' class RentalsController < ApplicationController + def index + rentals = Rental.all.order(:check_out) + # render json: { ready_for_lunch: "yessss" }, status: :ok + render json: rentals.as_json(), + status: :ok + end + + #decrease available_inventory #increase videos_checked_out_count #POST diff --git a/config/routes.rb b/config/routes.rb index b47bb76b7..fd02ee000 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Rails.application.routes.draw do - get 'rentals/index' + get '/rentals', to: 'rentals#index', as: 'rentals_index' # get 'videos/index' # get 'videos/show' # get 'videos/create' From 892929100a6279d8d5b9388ad22220996922bb04 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 18:00:38 -0700 Subject: [PATCH 46/53] fix tests --- test/controllers/customers_controller_test.rb | 3 +- test/controllers/videos_controller_test.rb | 41 ++++++++++--------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index dd54c6875..9dc6b0b71 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -26,4 +26,5 @@ expect(body.length).must_equal 0 end end -end \ No newline at end of file +end + diff --git a/test/controllers/videos_controller_test.rb b/test/controllers/videos_controller_test.rb index 5e7cacd55..0774d52ac 100644 --- a/test/controllers/videos_controller_test.rb +++ b/test/controllers/videos_controller_test.rb @@ -1,7 +1,8 @@ require "test_helper" describe VideosController do - VIDEO_FIELDS = ["id", "title", "overview", "release_date", "total_inventory", "available_inventory"].sort + VIDEO_FIELDS = ["available_inventory", "id", "release_date", "title"].sort + SHOW_FIELDS = ["available_inventory", "overview", "release_date", "title", "total_inventory"].sort it "must get index" do get videos_path @@ -37,9 +38,9 @@ describe "show" do # Nominal - it "for an existing video will return a hash with the proper fields" do + it "for an existing video will return a hash with the proper fields" do video = videos(:video1) - + get video_path(video.id) must_respond_with :success @@ -49,9 +50,9 @@ expect(response.header['Content-Type']).must_include 'json' expect(body).must_be_instance_of Hash - expect(body.keys.sort).must_equal VIDEO_FIELDS + expect(body.keys.sort).must_equal SHOW_FIELDS end - + # Edge Case it " for a non-existent video will return a 404 request with json" do get video_path(-1) @@ -59,34 +60,33 @@ must_respond_with :not_found body = JSON.parse(response.body) expect(body).must_be_instance_of Hash - expect(body['ok']).must_equal false - expect(body['message']).must_equal 'Not found' + expect(body["errors"]).must_equal ["Not Found"] end end describe "create" do let (:video_params){ - {video: { - title: "video1", - overview: "Somthing", - release_date: "1979-01-18", - total_inventory: 10, - available_inventory: 9, - } + { + title: "video1", + overview: "Somthing", + release_date: "1979-01-18", + total_inventory: 10, + available_inventory: 9, } } + it "can create new video" do - expect{ post videos_path, params: video_params}.must_differ "Video.count", 1 + expect{ post videos_path, params: video_params}.must_change "Video.count", 1 must_respond_with :created end it "gives bad_request status when user doesn't adding all the feeled" do - video_params[:video][:title] = nil - video_params[:video][:overview] = nil - video_params[:video][:release_date] = nil - video_params[:video][:total_inventory] = nil - video_params[:video][:available_inventory] = nil + video_params[:title] = nil + video_params[:overview] = nil + video_params[:release_date] = nil + video_params[:total_inventory] = nil + video_params[:available_inventory] = nil expect{ post videos_path, params: video_params}.wont_change "Video.count" must_respond_with :bad_request @@ -99,6 +99,7 @@ expect(body['errors'].keys).must_include "total_inventory" expect(body['errors'].keys).must_include "available_inventory" end + end end From c6b7fd9b406417c8e6a760a803df18cab158ab9c Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 18:26:08 -0700 Subject: [PATCH 47/53] Add fixtures for customers --- test/fixtures/customers.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/fixtures/customers.yml diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml new file mode 100644 index 000000000..816fef2fd --- /dev/null +++ b/test/fixtures/customers.yml @@ -0,0 +1,12 @@ +customer1: + name: Kate + registered_at: 2018-11-29T14:09:14.000Z + postal_code: 11374 + phone: (345) 222-8888 + videos_checked_out_count: 1 +customer2: + name: Keta + registered_at: 2018-09-29T14:90:14.000Z + postal_code: 89102 + phone: (222) 333-3333 + videos_checked_out_count: 1 \ No newline at end of file From 054468e9849cd305aa12342e6c571603615d260a Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 18:40:02 -0700 Subject: [PATCH 48/53] added test can check_out rental --- test/controllers/customers_controller_test.rb | 4 ++- test/controllers/rentals_controller_test.rb | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 9dc6b0b71..cfb3b94bd 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -2,7 +2,9 @@ describe CustomersController do describe "index" do - CUSTOMER_FIELDS = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone"].sort + CUSTOMER_FIELDS = ["id", "name", "registered_at", "postal_code", "phone", "videos_checked_out_count"].sort + + it "must get index" do get customers_path diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 4f6c21eb6..2f2ea11de 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -6,4 +6,34 @@ must_respond_with :success end + describe 'check_out' do + before do + @customer = customers(:customer2) + @video = videos(:video1) + end + let(:rental_params) { + { + customer_id: @customer.id, + video_id: @video.id, + due_date: Date.today + } + } + + it 'Can chech_out the rental' do + expect{ post check_out_path, params: rental_params }.must_differ "Rental.count", 1 + + must_respond_with :ok + expect(response.header['Content-Type']).must_include 'json' + + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + end + + + end + + + + + end From 063d40fd79ddb53b9e39fc848a2a7291b7beff13 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 18:45:55 -0700 Subject: [PATCH 49/53] added test Can not chech_out rental if video dosnt exist --- test/controllers/rentals_controller_test.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 2f2ea11de..49d75b2b8 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -29,6 +29,16 @@ expect(body).must_be_instance_of Hash end + it "Can not chech_out rental if video dosnt exist" do + rental_params[:video_id] = nil + expect{ post check_out_path, params: rental_params}.wont_change "Rental.count" + must_respond_with :not_found + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + expect(body["errors"]).must_equal ["Not Found"] + end + end From 584405d1ffe6efde2599d09495b0b893b1dacaf2 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 19:20:52 -0700 Subject: [PATCH 50/53] added more tests for checkout action --- test/controllers/rentals_controller_test.rb | 35 ++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 49d75b2b8..0124b4843 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -15,7 +15,7 @@ { customer_id: @customer.id, video_id: @video.id, - due_date: Date.today + due_date: DateTime.current.to_date } } @@ -29,7 +29,7 @@ expect(body).must_be_instance_of Hash end - it "Can not chech_out rental if video dosnt exist" do + it "responde with 404 if video dosnt exist" do rental_params[:video_id] = nil expect{ post check_out_path, params: rental_params}.wont_change "Rental.count" must_respond_with :not_found @@ -39,11 +39,38 @@ expect(body["errors"]).must_equal ["Not Found"] end + it "responde with 404 if customer dosnt exist" do + rental_params[:customer_id] = nil + expect{ post check_out_path, params: rental_params}.wont_change "Rental.count" + must_respond_with :not_found + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + expect(body["errors"]).must_equal ["Not Found"] + end - end - + it "videos_checked_out_count should get increase by one and available_inventory should get decrease if we have a check_out " do + post check_out_path, params: rental_params + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + customer = Customer.find_by(id: @customer.id) + expect(customer.videos_checked_out_count).must_equal 2 # 1 is in customer fixture + video = Video.find_by(id: @video.id) + expect(video.available_inventory).must_equal 8 #9 is in videos fixture + end + it 'rental should will create du_date' do + post check_out_path, params: rental_params + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + rental = Rental.first + expect(rental.due_date).must_equal DateTime.current.to_date + 7 + must_respond_with :ok + end + end end From 26f6a6cf90c0259dafd4c953017287ec9ab941b3 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 19:56:11 -0700 Subject: [PATCH 51/53] added more tests for check_in action --- test/controllers/rentals_controller_test.rb | 60 ++++++++++++++++++++- test/fixtures/videos.yml | 4 +- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 0124b4843..2d2a89987 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -8,7 +8,7 @@ describe 'check_out' do before do - @customer = customers(:customer2) + @customer = customers(:customer1) @video = videos(:video1) end let(:rental_params) { @@ -73,4 +73,62 @@ must_respond_with :ok end end + + describe 'check_in' do + before do + @customer = customers(:customer1) + @video = videos(:video1) + end + let(:rental_params) { + { + customer_id: @customer.id, + video_id: @video.id + } + } + + it 'Can chech_in the rental' do + expect{ post check_in_path, params: rental_params}.wont_change "Rental.count" + must_respond_with :not_found + + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + end + + it "videos_checked_out_count should get decrease by one and available_inventory should get increase if we have a check_in " do + post check_in_path, params: rental_params + + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + + customer = Customer.find_by(id: @customer.id) + expect(customer.videos_checked_out_count).must_equal 1 # 1 is in customer fixture + + video = Video.find_by(id: @video.id) + expect(video.available_inventory).must_equal 9 #9 is in videos fixture + end + + it "responde with 404 if video dosnt exist" do + rental_params[:video_id] = nil + expect{ post check_out_path, params: rental_params}.wont_change "Rental.count" + must_respond_with :not_found + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + expect(body["errors"]).must_equal ["Not Found"] + end + + it "responde with 404 if customer dosnt exist" do + rental_params[:customer_id] = nil + expect{ post check_in_path, params: rental_params}.wont_change "Rental.count" + must_respond_with :not_found + expect(response.header['Content-Type']).must_include 'json' + body = JSON.parse(response.body) + expect(body).must_be_instance_of Hash + expect(body["errors"]).must_equal ["Not Found"] + end + + + end end diff --git a/test/fixtures/videos.yml b/test/fixtures/videos.yml index e55acfc28..e5dd36cae 100644 --- a/test/fixtures/videos.yml +++ b/test/fixtures/videos.yml @@ -8,8 +8,8 @@ video2: title: Savior Of The Curse overview: The strange woman claims the boy has a DNA strain which very likely offers the key to cure several crippling diseases. Tests will have to be done, but the key to save millions of lives is within the grasp of science through this DNA strain. Unsure what to think of all this and of this strange woman, the boy hesitantly agrees to the proposal, there's something exciting about this whole situation, surely the right choice was made. release_date: 2010-11-05 - total_inventory: 1 - available_inventory: 1 + total_inventory: 10 + available_inventory: 9 video3: title: Women Of Destruction overview: But what if this strange woman is a con artist. Or what if everything told is completely true. How could an ordinary boy be relied upon in something this big. Time will tell. From 34635095e490fff12e0d701fca56493a3daf80c0 Mon Sep 17 00:00:00 2001 From: Jetmire Bajrami Date: Thu, 28 May 2020 19:58:38 -0700 Subject: [PATCH 52/53] added a comment --- test/controllers/rentals_controller_test.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 2d2a89987..897b07c06 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -94,7 +94,8 @@ body = JSON.parse(response.body) expect(body).must_be_instance_of Hash end - + + #This test i couldent make it work for som reasone.... it "videos_checked_out_count should get decrease by one and available_inventory should get increase if we have a check_in " do post check_in_path, params: rental_params @@ -103,10 +104,10 @@ expect(body).must_be_instance_of Hash customer = Customer.find_by(id: @customer.id) - expect(customer.videos_checked_out_count).must_equal 1 # 1 is in customer fixture + expect(customer.videos_checked_out_count).must_equal 1 video = Video.find_by(id: @video.id) - expect(video.available_inventory).must_equal 9 #9 is in videos fixture + expect(video.available_inventory).must_equal 9 end it "responde with 404 if video dosnt exist" do @@ -128,7 +129,5 @@ expect(body).must_be_instance_of Hash expect(body["errors"]).must_equal ["Not Found"] end - - end end From 6e0cff629e6271f93e703c17c9023c208a647003 Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 29 May 2020 11:12:27 -0700 Subject: [PATCH 53/53] answered some pr questions here --- .github/PULL_REQUEST_TEMPLATE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE index 0f708ae00..05c7ce786 100644 --- a/.github/PULL_REQUEST_TEMPLATE +++ b/.github/PULL_REQUEST_TEMPLATE @@ -14,5 +14,5 @@ What would be the Big-O time complexity of your `/customers` & `/videos` endpoin What is the Big-O time complexity of the `POST /rentals/check-in` endpoint? What does the time complexity depend on? Explain your reasoning. | Describe a specific set of positive and negative test cases you implemented for a model. | Describe a specific set of positive and negative test cases you implemented for a controller. | -Broadly, describe how an API should respond when it handles a request with invalid/erroneous parameters. | -Describe one of your custom model methods and why you chose to wrap that functionality into a method. | +Broadly, describe how an API should respond when it handles a request with invalid/erroneous parameters. | It should display the correct status code and a message. | +Describe one of your custom model methods and why you chose to wrap that functionality into a method. | We had two custom methods, one of which is a check_out method that lives in the rental controller. This method is used to decrease the amount of inventory available and decirease the number of videos checked out any time a customer rents a video. This method was created in this specific controller because it made sense, but since we set up relations between rental and customers and rentals and videos, they too had access to these custom methods. |