diff --git a/Gemfile b/Gemfile index d837ba0e..6143c31c 100644 --- a/Gemfile +++ b/Gemfile @@ -60,9 +60,11 @@ group :development do gem 'pry-rails' gem 'dotenv-rails' + # added token to .env end group :test do + gem 'minitest-rails' gem 'minitest-spec-rails' gem 'minitest-reporters' end diff --git a/Gemfile.lock b/Gemfile.lock index f80bcea9..51f122f3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,6 +98,9 @@ GEM mime-types-data (3.2016.0521) mini_portile2 (2.1.0) minitest (5.10.1) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) minitest-reporters (1.1.12) ansi builder @@ -205,6 +208,7 @@ DEPENDENCIES jbuilder (~> 2.5) jquery-rails listen (~> 3.0.5) + minitest-rails minitest-reporters minitest-spec-rails pry-rails diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 362e2791..e619e145 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -13,16 +13,37 @@ def index def show render( - status: :ok, - json: @movie.as_json( - only: [:title, :overview, :release_date, :inventory], - methods: [:available_inventory] - ) - ) + status: :ok, + json: @movie.as_json( + only: [:title, :overview, :release_date, :inventory], + methods: [:available_inventory] + ) + ) + end + + def create + existing_movie = Movie.find_by(overview: movie_params[:overview]) + + if existing_movie + render json: {errors: {movie: ["#{params[:title]} is already in Video Store"]}} + else + movie = Movie.new(movie_params) + movie.inventory = 1; + if movie.save + render json: movie.as_json, status: :ok + else + render status: :bad_request, json: {errors: movie.errors.messages} + end + end + end private + def movie_params + params.require(:movie).permit(:title, :overview, :release_date, :inventory, :image_url, :external_id) + end + def require_movie @movie = Movie.find_by(title: params[:title]) unless @movie diff --git a/app/models/movie.rb b/app/models/movie.rb index 0327a4d6..8ef764e5 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -4,6 +4,10 @@ class Movie < ApplicationRecord has_many :rentals has_many :customers, through: :rentals + validates :title, presence: true + # validates :inventory, presence: true, numericality: { only_integer: true } + # validates :external_id, uniqueness: true, allow_nil: true + def available_inventory self.inventory - Rental.where(movie: self, returned: false).length end @@ -13,7 +17,8 @@ def image_url if !orig_value MovieWrapper::DEFAULT_IMG_URL else - MovieWrapper.construct_image_url(orig_value) + return orig_value + # MovieWrapper.construct_image_url(orig_value) end end end diff --git a/config/routes.rb b/config/routes.rb index 54bf033e..8eff1ff6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,7 +3,7 @@ resources :customers, only: [:index] - resources :movies, only: [:index, :show], param: :title + resources :movies, only: [:index, :show, :create], param: :title post "/rentals/:title/check-out", to: "rentals#check_out", as: "check_out" post "/rentals/:title/return", to: "rentals#check_in", as: "check_in" diff --git a/lib/movie_wrapper.rb b/lib/movie_wrapper.rb index 7bd05c0e..3774ccb4 100644 --- a/lib/movie_wrapper.rb +++ b/lib/movie_wrapper.rb @@ -27,12 +27,17 @@ def self.construct_movie(api_result) title: api_result["title"], overview: api_result["overview"], release_date: api_result["release_date"], - image_url: api_result["poster_path"], #(api_result["poster_path"] ? self.construct_image_url(api_result["poster_path"]) : nil), + image_url: + # api_result["poster_path"] + (api_result["poster_path"] ? self.construct_image_url(api_result["poster_path"]) : nil), external_id: api_result["id"]) end def self.construct_image_url(img_name) + puts "this is " + img_name return BASE_IMG_URL + DEFAULT_IMG_SIZE + img_name + + end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 9172cf6e..31e424b6 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -75,4 +75,75 @@ class MoviesControllerTest < ActionDispatch::IntegrationTest end end + + describe "create" do + + it "affects the model when creating a new movie" do + proc { + post movies_url, params: { movie: + { title: "Spongebob", + overview: "Square Pants", + release_date: "2001", + inventory: 5, + image_url: ""} + } + }.must_change 'Movie.count', 1 + must_respond_with :ok + end + + it "won't create with missing title" do + proc { + post movies_url, params: { movie: + { + overview: "Square Pants", + release_date: "2001", + inventory: 5, + image_url: ""} + } + }.must_change 'Movie.count', 0 + must_respond_with :bad_request + + body = JSON.parse(response.body) + body.must_equal "errors" => { + "title" => ["can't be blank" ] + } + + end + + it "won't create a movie with missing inventory count" do + + proc { + post movies_url, params: { movie: + { title: "Movie!", + overview: "Square Pants", + release_date: "2001", + image_url: ""} + } + }.must_change 'Movie.count', 0 + must_respond_with :bad_request + + body = JSON.parse(response.body) + body.must_equal "errors" => {"inventory"=>["can't be blank", "is not a number"] + } + end + + it "won't create a movie that already exists" do + proc { + post movies_url, params: { + movie: + { + title: movies(:one).title, + overview: movies(:one).overview, + release_date: movies(:one).release_date, + image_url: movies(:one).image_url, + inventory: movies(:one).inventory + } + } + }.must_change 'Movie.count', 0 + + body = JSON.parse(response.body) + body.must_equal "errors" => {"movie"=>[" is already in Video Store"] + } + end + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 499d175c..48477987 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,13 +1,19 @@ ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' +require "minitest/rails" +require "minitest/reporters" class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all # Use Minitest Reporters for colored output. - Minitest::Reporters.use! + Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter + ) # Add more helper methods to be used by all tests here... end