Skip to content
Open
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -205,6 +208,7 @@ DEPENDENCIES
jbuilder (~> 2.5)
jquery-rails
listen (~> 3.0.5)
minitest-rails
minitest-reporters
minitest-spec-rails
pry-rails
Expand Down
33 changes: 27 additions & 6 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 6 additions & 1 deletion app/models/movie.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
2 changes: 1 addition & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
7 changes: 6 additions & 1 deletion lib/movie_wrapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
71 changes: 71 additions & 0 deletions test/controllers/movies_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 7 additions & 1 deletion test/test_helper.rb
Original file line number Diff line number Diff line change
@@ -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