From 85e505ec211b5b9e7c9db35a32f42e48f484d67d Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 13:56:11 -0700 Subject: [PATCH 01/49] g models, set up db, g api, updated rails-template file on Lily's local --- .gitignore | 16 + Gemfile | 50 +++ Gemfile.lock | 154 +++++++++ README.md | 312 +----------------- Rakefile | 6 + app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/models/customer.rb | 2 + app/models/movie.rb | 2 + app/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 35 ++ bin/spring | 17 + bin/update | 29 ++ config.ru | 5 + config/application.rb | 40 +++ config/boot.rb | 3 + config/cable.yml | 10 + config/database.yml | 85 +++++ config/environment.rb | 5 + config/environments/development.rb | 47 +++ config/environments/production.rb | 83 +++++ config/environments/test.rb | 42 +++ .../application_controller_renderer.rb | 8 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/cors.rb | 16 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 + config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 33 ++ config/puma.rb | 56 ++++ config/routes.rb | 3 + config/secrets.yml | 32 ++ config/spring.rb | 6 + db/migrate/20180507205035_create_customers.rb | 14 + db/migrate/20180507205043_create_movies.rb | 12 + db/schema.rb | 38 +++ lib/tasks/.keep | 0 log/.keep | 0 public/robots.txt | 1 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/customers.yml | 17 + test/fixtures/files/.keep | 0 test/fixtures/movies.yml | 13 + test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/models/customer_test.rb | 9 + test/models/movie_test.rb | 9 + test/test_helper.rb | 26 ++ tmp/.keep | 0 vendor/.keep | 0 63 files changed, 1036 insertions(+), 299 deletions(-) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Rakefile create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/models/customer.rb create mode 100644 app/models/movie.rb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cors.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/secrets.yml create mode 100644 config/spring.rb create mode 100644 db/migrate/20180507205035_create_customers.rb create mode 100644 db/migrate/20180507205043_create_movies.rb create mode 100644 db/schema.rb create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 public/robots.txt create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/customers.yml create mode 100644 test/fixtures/files/.keep create mode 100644 test/fixtures/movies.yml create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/models/customer_test.rb create mode 100644 test/models/movie_test.rb create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..68ac019ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +.byebug_history diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..78bff8d26 --- /dev/null +++ b/Gemfile @@ -0,0 +1,50 @@ +source 'https://rubygems.org' + +git_source(:github) do |repo_name| + repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") + "https://github.com/#{repo_name}.git" +end + + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.1.6' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 3.7' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +# gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible +# gem 'rack-cors' + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +group :development, :test do + gem 'pry-rails' +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..e547d2449 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,154 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.1.6) + actionpack (= 5.1.6) + nio4r (~> 2.0) + websocket-driver (~> 0.6.1) + actionmailer (5.1.6) + actionpack (= 5.1.6) + actionview (= 5.1.6) + activejob (= 5.1.6) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.1.6) + actionview (= 5.1.6) + activesupport (= 5.1.6) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.1.6) + activesupport (= 5.1.6) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.1.6) + activesupport (= 5.1.6) + globalid (>= 0.3.6) + activemodel (5.1.6) + activesupport (= 5.1.6) + activerecord (5.1.6) + activemodel (= 5.1.6) + activesupport (= 5.1.6) + arel (~> 8.0) + activesupport (5.1.6) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + ansi (1.5.0) + arel (8.0.0) + builder (3.2.3) + byebug (10.0.2) + coderay (1.1.2) + concurrent-ruby (1.0.5) + crass (1.0.4) + erubi (1.7.1) + ffi (1.9.23) + globalid (0.4.1) + activesupport (>= 4.2.0) + i18n (1.0.1) + concurrent-ruby (~> 1.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.2.2) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + mail (2.7.0) + mini_mime (>= 0.1.1) + method_source (0.9.0) + mini_mime (1.0.0) + mini_portile2 (2.3.0) + minitest (5.11.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.2.0) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + nio4r (2.3.1) + nokogiri (1.8.2) + mini_portile2 (~> 2.3.0) + pg (1.0.0) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + puma (3.11.4) + rack (2.0.5) + rack-test (1.0.0) + rack (>= 1.0, < 3) + rails (5.1.6) + actioncable (= 5.1.6) + actionmailer (= 5.1.6) + actionpack (= 5.1.6) + actionview (= 5.1.6) + activejob (= 5.1.6) + activemodel (= 5.1.6) + activerecord (= 5.1.6) + activesupport (= 5.1.6) + bundler (>= 1.3.0) + railties (= 5.1.6) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.4) + loofah (~> 2.2, >= 2.2.2) + railties (5.1.6) + actionpack (= 5.1.6) + activesupport (= 5.1.6) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (12.3.1) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + ruby-progressbar (1.9.0) + ruby_dep (1.5.0) + spring (2.0.2) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.0) + thread_safe (0.3.6) + tzinfo (1.2.5) + thread_safe (~> 0.1) + websocket-driver (0.6.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.3) + +PLATFORMS + ruby + +DEPENDENCIES + byebug + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 3.7) + rails (~> 5.1.6) + spring + spring-watcher-listen (~> 2.0.0) + tzinfo-data + +BUNDLED WITH + 1.16.1 diff --git a/README.md b/README.md index 59f4e3757..7db80e4ca 100644 --- a/README.md +++ b/README.md @@ -1,310 +1,24 @@ -# Project: VideoStoreAPI +# README -**Due:** EOD Friday May 11 +This README would normally document whatever steps are necessary to get the +application up and running. -The goal of this project is to create a system that a video store (remember those?) could use to track their inventory of rental videos and their list of customers. +Things you may want to cover: -We will use Rails to construct a RESTful API. The purpose of this API is to quickly serve information about the store's video collection, customer information, and to update rental status. This repository provides two JSON datafiles to serve as the initial seeds for this system. +* Ruby version -This is a pair project. You and your partner should use all the techniques we've learned so far to keep yourselves organized and on track, and ensure that no requirements slip through the cracks. +* System dependencies -## Learning Goals -Upon completing this project, students should be able to: +* Configuration -- Build an ERD and set up ActiveRecord models for a given dataset / use-case -- Expose database contents through a web API -- Respond reasonably to bad user data in the context of an API -- Verify the correctness of an API using controller tests +* Database creation -This is a [stage 2](https://github.com/Ada-Developers-Academy/pedagogy/blob/master/rule-of-three.md) project. +* Database initialization -## Success Criteria -Your project will be evaluated against the following requirements: +* How to run the test suite -- API conformance - - The provided smoke tests should pass (see the subfolder) - - Bad data sent to the API should result in an appropriate status code and helpful error -- Test coverage - - Models: All relations, validations, and custom model methods should include at least one positive and one negative test case - - Controllers: Every API endpoint should include at least one positive and one negative test case -- Style and Organization - - Everything we've learned so far about how to design and build a Rails app still applies! +* Services (job queues, cache servers, search engines, etc.) -## Project Baseline -- Read the API Requirements below and create a pseudo-code "routes" file that specifies - - The _endpoints_ your API will need - - The _HTTP verbs_ each endpoint will use - - Any data that must be provided to the endpoint in order for it to do its work -- Read the Seed Data description below and, bearing in mind the API Requirements, create an ERD for your database that specifies - - The _models_ your database will require - - The _attributes_ for each model - - Any _relationships_ between models -- Create a new Rails app to serve as the API - - **Create the rails app with:** `$ rails new . --api` -- Create a route that responds to `/zomg` that serves a json-encoded "it works!" +* Deployment instructions -## Wave 1: Database Models, Tables, & Seeds -- Generate Rails models and associations to match your ERD -- Use the provided seed script `db/seeds.rb` to import the provided JSON data into your database - -In the past, many students have spent lots of time writing and testing validations for these models. Because project time is limited and validations are not an important learning objective this week, we do not recommend this. Instead, validate only those fields that, if they are absent, will break your API. - -### Seed Data -`movies.json` contains information about the videos available to rent at the store. The data is presented as an array of objects, with each object having the following key-value pairs: - -| Field | Datatype | Description -|----------------|----------|------------ -| `title` | string | The title of the film -| `overview` | string | A short plot synopsis -| `release_date` | date | `YYYY-MM-DD`, Day the film was originally released -| `inventory` | integer | How many copies of the film the video store owns - -`customers.json` contains information about the customers that have rented with the store in the past. The data is presented as, you guessed it, an array of objects, with each object have the following key-value pairs: - -| Field | Datatype | Description -|------------------|----------|------------ -| `name` | string | The customer's name -| `registered_at` | datetime | `Wed, 29 Apr 2015 07:54:14 -0700`, When the customer first visited the store -| `address` | string | Street address -| `city` | string |   -| `state` | string |   -| `postal_code` | string |   -| `phone` | string | Primary contact phone number - -### Testing -As with all Rails projects, model testing is a requirement. You should have _at least_ one positive and one negative test case for each relation, validation, and custom function you add to your models. - -Use good TDD practices, and test _before_ you code. Remember: red-green-refactor. - -## Waves 2 and 3: Coding The API -In this wave, you will implement the API described below. The endpoints are described more-or-less in order of complexity, and we recommend you build them in that order. Every endpoint must serve JSON data, and must use HTTP response codes to indicate the status of the request. - -The schema of your database and the structure of your rails app are completely up to you, so long as the API conforms to the description and provided script. - -### Error Handling -If something goes wrong, your API should return an appropriate [HTTP status code](http://billpatrianakos.me/blog/2013/10/13/list-of-rails-status-code-symbols/), as well as a list of errors. The list should be formatted like this: - -```json -{ - "errors": { - "title": ["Movie 'Revenge of the Gnomes' not found"] - } -} -``` - -All errors your API can return should be covered by at least one test case. - -### Testing -Because APIs are often open to the public, thorough testing is essential. For a Rails API, that means controller testing. - -For each API endpoint, you should have _at least_: -- A basic test with no parameters, if applicable -- Positive and negative tests for any URI parameters (user ID, movie title) -- Testing around any data in the request body - -Use good TDD practices, and test _before_ you code. Remember: red-green-refactor. - -#### Smoke Tests -Because this API will be used as the backend for a future project, there are strict requirements about how it should be structured. To this end, we have provided a set of [smoke tests](http://softwaretestingfundamentals.com/smoke-testing/) written in Postman to exercise all the endpoints. - -The smoke tests will verify that your API looks correct to the outside world, by sending actual HTTP requests to your running server and checking the results. They test things like: - -- Did I get a success response for a valid request? -- Did the API return JSON? -- Does the JSON contain the expected property names? - -**The smoke tests are not a substitute for writing your own tests!!!!!** They do **not** check that the content is _correct_, nor do they cover any negative or edge cases. Verifying correctness in these cases is **your** responsibility. - -The smoke tests live in the file [`test/VideoStoreAPI_smoke_tests.postman_collection.json`](test/VideoStoreAPI_smoke_tests.postman_collection.json). To run them: - -1. Open Postman -1. Click `Import` in the top left -1. Drag-and-drop the file into the box -1. In the left sidebar, click on the `Collections` tab -1. There should now be an entry for the smoke tests. Hover over it and click the `>` icon for a detail view. You will notice they are in the format `{{url}}/movies`. `{{url}}` is a key which you can give a value on your computer. -1. To do so go to the Gearbox in the top-right and select `Manage Environments` -![Manage Environments](images/manage-environment.png) -1. Then Select `Add` -![add button](images/add-btn.png) -1. Lastly add a key `url` and value `http://localhost:3000` -![Key & Value](images/key-value.png) -1. Click the blue `Run` button. This will launch the collection runner. -1. In the collection runner, scroll down in the center pane and click the blue `Start Test` button - -## API Description - -### Wave 2: Customers and Movies - -#### `GET /customers` -List all customers - -Fields to return: -- `id` -- `name` -- `registered_at` -- `postal_code` -- `phone` -- `movies_checked_out_count` - - This will be 0 unless you've completed optional requirements - -#### `GET /movies` -List all movies - -Fields to return: -- `id` -- `title` -- `release_date` - -#### `GET /movies/:id` -Look a movie up by `id` - -URI parameters: -- `id`: Movie identifier - -Fields to return: -- `title` -- `overview` -- `release_date` -- `inventory` (total) -- `available_inventory` (not currently checked-out to a customer) - - This will be the same as `inventory` unless you've completed the optional endpoints. - -#### `POST /movies` -Create a new movie in the video store inventory. - -Upon success, this request should return the `id` of the movie created. - -Request body: - -| Field | Datatype | Description -|---------------|---------------------|------------ -| `title` | string | Title of the movie -| `overview` | string | Descriptive summary of the movie -| `release_date` | string `YYYY-MM-DD` | Date the movie was released -| `inventory` | integer | Quantity available in the video store - -### Wave 3: Rentals - -Wave 2 focused on working with customers and movies. With these endpoints you can extend the functionality of your API to allow managing the rental process. - -#### `POST /rentals/check-out` -Check out one of the movie's inventory to the customer. The rental's check-out date should be set to today, and the due date should be set to a week from today. - -**Note:** Some of the fields from wave 2 should now have interesting values. Good thing you wrote tests for them, right... right? - -Request body: - -| Field | Datatype | Description -|---------------|---------------------|------------ -| `customer_id` | integer | ID of the customer checking out this film -| `movie_id` | integer | ID of the movie to be checked out - -#### `POST /rentals/check-in` -Check in one of a customer's rentals - -Request body: - -| Field | Datatype | Description -|---------------|----------|------------ -| `customer_id` | integer | ID of the customer checking in this film -| `movie_id` | integer | ID of the movie to be checked in - -## Optional Enhancements -These really are **optional** - if you've gotten here and you have time left, that means you're moving speedy fast! - -### Query Parameters -Any endpoint that returns a list should accept 3 _optional_ [query parameters](http://guides.rubyonrails.org/action_controller_overview.html#parameters): - -| Name | Value | Description -|--------|---------|------------ -| `sort` | string | Sort objects by this field, in ascending order -| `n` | integer | Number of responses to return per page -| `p` | integer | Page of responses to return - -So, for an API endpoint like `GET /customers`, the following requests should be valid: -- `GET /customers`: All customers, sorted by ID -- `GET /customers?sort=name`: All customers, sorted by name -- `GET /customers?n=10&p=2`: Customers 10-19, sorted by ID -- `GET /customers?sort=name&n=10&p=2`: Customers 10-19, sorted by name - -Of course, adding new features means you should be adding new controller tests to verify them. - -Things to note: -- Sorting by ID is the rails default -- Possible sort fields: - - Customers can be sorted by `name`, `registered_at` and `postal_code` - - Movies can be sorted by `title` and `release_date` - - Overdue rentals can be sorted by `title`, `name`, `checkout_date` and `due_date` -- If the client requests both sorting and pagination, pagination should be relative to the sorted order -- Check out the [will_paginate gem](https://github.com/mislav/will_paginate) - -### More Endpoints: Inventory Management -All these endpoints should support all 3 query parameters. All fields are sortable. - -#### `GET /rentals/overdue` -List all customers with overdue movies - -Fields to return: -- `movie_id` -- `title` -- `customer_id` -- `name` -- `postal_code` -- `checkout_date` -- `due_date` - -#### `GET /movies/:id/current` -List customers that have _currently_ checked out a copy of the film - -URI parameters: -- `id`: Movie identifier - -Fields to return: -- `customer_id` -- `name` -- `postal_code` -- `checkout_date` -- `due_date` - -#### `GET /movies/:id/history` -List customers that have checked out a copy of the film _in the past_ - -URI parameters: -- `id`: Movie identifier - -Fields to return: -- `customer_id` -- `name` -- `postal_code` -- `checkout_date` -- `due_date` - -#### `GET /customers/:id/current` -List the movies a customer _currently_ has checked out - -URI parameters: -- `id`: Customer ID - -Fields to return: -- `title` -- `checkout_date` -- `due_date` - -#### `GET /customers/:id/history` -List the movies a customer has checked out _in the past_ - -URI parameters: -- `id`: Customer ID - -Fields to return: -- `title` -- `checkout_date` -- `due_date` - - -## Reference -- [Postman on Environments](https://www.getpostman.com/docs/environments) - -## What We're Looking For - -Check the [feedback template](./feedback.md) to see how we will evaluate your project. +* ... diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..e85f91391 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 000000000..d67269728 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 000000000..0ff5442f4 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 000000000..4ac8823b0 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::API +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 000000000..a009ace51 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 000000000..286b2239d --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 000000000..10a4cba84 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/models/customer.rb b/app/models/customer.rb new file mode 100644 index 000000000..0b5277335 --- /dev/null +++ b/app/models/customer.rb @@ -0,0 +1,2 @@ +class Customer < ApplicationRecord +end diff --git a/app/models/movie.rb b/app/models/movie.rb new file mode 100644 index 000000000..dc614df15 --- /dev/null +++ b/app/models/movie.rb @@ -0,0 +1,2 @@ +class Movie < ApplicationRecord +end diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 000000000..cbd34d2e9 --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 000000000..37f0bddbd --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 000000000..66e9889e8 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 000000000..5badb2fde --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 000000000..d87d5f578 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 000000000..104e40c1c --- /dev/null +++ b/bin/setup @@ -0,0 +1,35 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 000000000..fb2ec2ebb --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == "spring" } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/bin/update new file mode 100755 index 000000000..a8e4462f2 --- /dev/null +++ b/bin/update @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/config.ru b/config.ru new file mode 100644 index 000000000..f7ba0b527 --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 000000000..2fe7718ea --- /dev/null +++ b/config/application.rb @@ -0,0 +1,40 @@ +require_relative 'boot' + +require "rails" +# Pick the frameworks you want: +require "active_model/railtie" +require "active_job/railtie" +require "active_record/railtie" +require "action_controller/railtie" +require "action_mailer/railtie" +require "action_view/railtie" +require "action_cable/engine" +# require "sprockets/railtie" +require "rails/test_unit/railtie" + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module VideoStoreAPI + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + + # Always use .js files, never .coffee + g.javascript_engine :js + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.1 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Only loads a smaller set of middleware suitable for API only apps. + # Middleware like session, flash, cookies can be added back manually. + # Skip views, helpers and assets when generating a new resource. + config.api_only = true + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 000000000..30f5120df --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,3 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..ad59bcd88 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: redis://localhost:6379/1 + channel_prefix: VideoStoreAPI_production diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 000000000..720570700 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: VideoStoreAPI_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: VideoStoreAPI + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: VideoStoreAPI_test + +# As with config/secrets.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: VideoStoreAPI_production + username: VideoStoreAPI + password: <%= ENV['VIDEOSTOREAPI_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 000000000..426333bb4 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 000000000..abc82221c --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,47 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + if Rails.root.join('tmp/caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 000000000..3bd8115ea --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,83 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Attempt to read encrypted secrets from `config/secrets.yml.enc`. + # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or + # `config/secrets.yml.key`. + config.read_encrypted_secrets = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "VideoStoreAPI_#{Rails.env}" + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 000000000..8e5cbde53 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,42 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.seconds.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 000000000..59385cdf3 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb new file mode 100644 index 000000000..3b1c1b5ed --- /dev/null +++ b/config/initializers/cors.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Avoid CORS issues when API is called from the frontend app. +# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. + +# Read more: https://github.com/cyu/rack-cors + +# Rails.application.config.middleware.insert_before 0, Rack::Cors do +# allow do +# origins 'example.com' +# +# resource '*', +# headers: :any, +# methods: [:get, :post, :put, :patch, :delete, :options, :head] +# end +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 000000000..4a994e1e7 --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 000000000..ac033bf9d --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 000000000..dc1899682 --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 000000000..bbfc3961b --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 000000000..decc5a857 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 000000000..1e19380dc --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,56 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. If you use this option +# you need to make sure to reconnect any threads in the `on_worker_boot` +# block. +# +# preload_app! + +# If you are preloading your application and using Active Record, it's +# recommended that you close any connections to the database before workers +# are forked to prevent connection leakage. +# +# before_fork do +# ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord) +# end + +# The code in the `on_worker_boot` will be called if you are using +# clustered mode by specifying a number of `workers`. After each worker +# process is booted, this block will be run. If you are using the `preload_app!` +# option, you will want to use this block to reconnect to any threads +# or connections that may have been created at application boot, as Ruby +# cannot share connections between processes. +# +# on_worker_boot do +# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) +# end +# + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 000000000..787824f88 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html +end diff --git a/config/secrets.yml b/config/secrets.yml new file mode 100644 index 000000000..c553ae628 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,32 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rails secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +# Shared secrets are available across all environments. + +# shared: +# api_key: a1B2c3D4e5F6 + +# Environmental secrets are only available for that specific environment. + +development: + secret_key_base: 86b748e874a0eaa5928aa13a3f261505879626c20018034794cf9534ef42779b68bb24f9e6c4832a0c5d2cffa5022d2123b131bae5335330f019e14734f0607d + +test: + secret_key_base: 5b30ef201fb4c1eadf1c940f869304093cbd01d4aa2d9b0bfe36b7cc2036b776479f440b7a390a2b5a9624da8ca8e56e1ba76857f33b5eea6b5703e04db42efa + +# Do not keep production secrets in the unencrypted secrets file. +# Instead, either read values from the environment. +# Or, use `bin/rails secrets:setup` to configure encrypted secrets +# and move the `production:` environment over there. + +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..c9119b40c --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w( + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +).each { |path| Spring.watch(path) } diff --git a/db/migrate/20180507205035_create_customers.rb b/db/migrate/20180507205035_create_customers.rb new file mode 100644 index 000000000..a656da1e1 --- /dev/null +++ b/db/migrate/20180507205035_create_customers.rb @@ -0,0 +1,14 @@ +class CreateCustomers < ActiveRecord::Migration[5.1] + def change + create_table :customers do |t| + t.string :name + t.string :address + t.string :city + t.string :state + t.string :zip + t.string :phone + + t.timestamps + end + end +end diff --git a/db/migrate/20180507205043_create_movies.rb b/db/migrate/20180507205043_create_movies.rb new file mode 100644 index 000000000..84782a1b7 --- /dev/null +++ b/db/migrate/20180507205043_create_movies.rb @@ -0,0 +1,12 @@ +class CreateMovies < ActiveRecord::Migration[5.1] + def change + create_table :movies do |t| + t.string :title + t.string :overview + t.string :release_date + t.integer :inventory + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..bcd786750 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,38 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20180507205043) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "customers", force: :cascade do |t| + t.string "name" + t.string "address" + t.string "city" + t.string "state" + t.string "zip" + t.string "phone" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "movies", force: :cascade do |t| + t.string "title" + t.string "overview" + t.string "release_date" + t.integer "inventory" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/log/.keep b/log/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..37b576a4a --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml new file mode 100644 index 000000000..88661796d --- /dev/null +++ b/test/fixtures/customers.yml @@ -0,0 +1,17 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + address: MyString + city: MyString + state: MyString + zip: MyString + phone: MyString + +two: + name: MyString + address: MyString + city: MyString + state: MyString + zip: MyString + phone: MyString diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml new file mode 100644 index 000000000..d774de5f1 --- /dev/null +++ b/test/fixtures/movies.yml @@ -0,0 +1,13 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + title: MyString + overview: MyString + release_date: MyString + inventory: 1 + +two: + title: MyString + overview: MyString + release_date: MyString + inventory: 1 diff --git a/test/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/models/customer_test.rb b/test/models/customer_test.rb new file mode 100644 index 000000000..5ebc5c850 --- /dev/null +++ b/test/models/customer_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Customer do + let(:customer) { Customer.new } + + it "must be valid" do + value(customer).must_be :valid? + end +end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb new file mode 100644 index 000000000..34d1d30a5 --- /dev/null +++ b/test/models/movie_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Movie do + let(:movie) { Movie.new } + + it "must be valid" do + value(movie).must_be :valid? + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 000000000..10594a324 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,26 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails" +require "minitest/reporters" # for Colorized output + +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 000000000..e69de29bb From a351df8baf0b1e080cb9369c23ac3ceb5fb68707 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 14:00:47 -0700 Subject: [PATCH 02/49] created routes for customer index and movies index, show and create --- config/routes.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 787824f88..6784b1e55 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,12 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + #customers_controller + resources :customers, only:[:index] + + #movies_controller + # index + # show + # create + resources :movies, only:[:index, :show, :create] + end From 55a5ab5085e20b2ac58abcb2f88284bbd4547991 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 14:04:34 -0700 Subject: [PATCH 03/49] created controller for movies and customers, rails reflect controller actions --- app/controllers/customers_controller.rb | 6 ++++++ app/controllers/movies_controller.rb | 10 ++++++++++ config/routes.rb | 4 +--- test/controllers/customers_controller_test.rb | 7 +++++++ test/controllers/movies_controller_test.rb | 19 +++++++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 app/controllers/customers_controller.rb create mode 100644 app/controllers/movies_controller.rb create mode 100644 test/controllers/customers_controller_test.rb create mode 100644 test/controllers/movies_controller_test.rb diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb new file mode 100644 index 000000000..00dad6539 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,6 @@ +class CustomersController < ApplicationController + + def index + + end +end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb new file mode 100644 index 000000000..b69241e5f --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,10 @@ +class MoviesController < ApplicationController + def index + end + + def show + end + + def create + end +end diff --git a/config/routes.rb b/config/routes.rb index 6784b1e55..464e84d3c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,12 +1,10 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + #customers_controller resources :customers, only:[:index] #movies_controller - # index - # show - # create resources :movies, only:[:index, :show, :create] end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb new file mode 100644 index 000000000..5e123f6cd --- /dev/null +++ b/test/controllers/customers_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe CustomersController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb new file mode 100644 index 000000000..53607f49d --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,19 @@ +require "test_helper" + +describe MoviesController do + it "should get index" do + get movies_index_url + value(response).must_be :success? + end + + it "should get show" do + get movies_show_url + value(response).must_be :success? + end + + it "should get create" do + get movies_create_url + value(response).must_be :success? + end + +end From 6f285df51cca09c79bbd21fb2bea7b0b96894309 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 14:10:28 -0700 Subject: [PATCH 04/49] validations for customers and movies --- app/models/customer.rb | 3 +++ app/models/movie.rb | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/app/models/customer.rb b/app/models/customer.rb index 0b5277335..42d556d16 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,2 +1,5 @@ class Customer < ApplicationRecord + + validates :name, :phone, presence: true + end diff --git a/app/models/movie.rb b/app/models/movie.rb index dc614df15..8e2036622 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,2 +1,6 @@ class Movie < ApplicationRecord + + validates :title, :inventory, presence: true + validates :inventory, numericality: true + end From 9cf126e5a786390477a7cee5a4aae312cc5db424 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 14:45:03 -0700 Subject: [PATCH 05/49] registered_at column added to customer --- app/models/customer.rb | 2 -- db/migrate/20180507212457_add_registered_at_to_customer.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20180507212457_add_registered_at_to_customer.rb diff --git a/app/models/customer.rb b/app/models/customer.rb index 42d556d16..8aece73c7 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,5 +1,3 @@ class Customer < ApplicationRecord - validates :name, :phone, presence: true - end diff --git a/db/migrate/20180507212457_add_registered_at_to_customer.rb b/db/migrate/20180507212457_add_registered_at_to_customer.rb new file mode 100644 index 000000000..9a858d284 --- /dev/null +++ b/db/migrate/20180507212457_add_registered_at_to_customer.rb @@ -0,0 +1,5 @@ +class AddRegisteredAtToCustomer < ActiveRecord::Migration[5.1] + def change + add_column :customers, :registered_at, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index bcd786750..74c3070b7 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: 20180507205043) do +ActiveRecord::Schema.define(version: 20180507212457) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -24,6 +24,7 @@ t.string "phone" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "registered_at" end create_table "movies", force: :cascade do |t| From 7995bfa24db349604a99e936eefa9e1fa3eba3ff Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 14:51:16 -0700 Subject: [PATCH 06/49] customer zip not postal_code --- .../20180507214957_change_customer_zip_to_postal_code.rb | 5 +++++ db/schema.rb | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20180507214957_change_customer_zip_to_postal_code.rb diff --git a/db/migrate/20180507214957_change_customer_zip_to_postal_code.rb b/db/migrate/20180507214957_change_customer_zip_to_postal_code.rb new file mode 100644 index 000000000..31c05ea8a --- /dev/null +++ b/db/migrate/20180507214957_change_customer_zip_to_postal_code.rb @@ -0,0 +1,5 @@ +class ChangeCustomerZipToPostalCode < ActiveRecord::Migration[5.1] + def change + rename_column :customers, :zip, :postal_code + end +end diff --git a/db/schema.rb b/db/schema.rb index 74c3070b7..3fbfc9900 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: 20180507212457) do +ActiveRecord::Schema.define(version: 20180507214957) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -20,7 +20,7 @@ t.string "address" t.string "city" t.string "state" - t.string "zip" + t.string "postal_code" t.string "phone" t.datetime "created_at", null: false t.datetime "updated_at", null: false From 529054d70240c883d46cc59231b4cfc4039f3edf Mon Sep 17 00:00:00 2001 From: Abiaina Date: Mon, 7 May 2018 16:18:07 -0700 Subject: [PATCH 07/49] created movies controller tests --- test/controllers/movies_controller_test.rb | 90 +++++++++++++++++++--- test/fixtures/movies.yml | 14 ++-- 2 files changed, 87 insertions(+), 17 deletions(-) diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 53607f49d..aa6a6dd58 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,19 +1,89 @@ require "test_helper" describe MoviesController do - it "should get index" do - get movies_index_url - value(response).must_be :success? - end - it "should get show" do - get movies_show_url - value(response).must_be :success? + describe "index" do + it "is a real working route" do + get movies_url + must_respond_with :success + end + + it "returns json" do + get movies_url + response.header['Content-Type'].must_include 'json' + end + + it "returns an Array" do + get movies_url + + body = JSON.parse(response.body) + body.must_be_kind_of Array + end + + it "returns all of the movies" do + get movies_url + + body = JSON.parse(response.body) + body.length.must_equal Movie.count + end + + it "returns movies with exactly the required fields" do + # unsure of order for keys...doesn't matter? + keys = %w(title overview release_date inventory id) + + get movies_url + body = JSON.parse(response.body) + body.each do |movie| + movie.keys.sort.must_equal keys.sort + end + end end - it "should get create" do - get movies_create_url - value(response).must_be :success? + describe "show" do + # This bit is up to you! + it "can get a movie" do + get movie_path(movies(:two).id) + must_respond_with :success + end + + it "responds with not_found if get a movie given invalid id" do + movie = movies(:two) + movie.destroy + get movie_path(movie.id) + must_respond_with :not_found + end end + describe "create" do + let(:movie_data) { + { + title: "Pirates of the Caribbean" + overview: "The ocean's black pearl saves and perishes" + release_date: 2000 + inventory: 3 + } + } + + it "Creates a new movie" do + + proc{ + post movies_url, params: { movie: movie_data } + }.must_change "Movie.count", 1 + must_respond_with :success + end + + it "returns a bad request for a bad params data" do + movie_data[:name] = nil + + proc{ + post movies_url, params: { movie: movie_data } + }.must_change "Movie.count", 0 + must_respond_with :bad_request + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body.must_include "errors" + body["errors"].must_include "title" + end + + end end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index d774de5f1..7a3c48280 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -1,13 +1,13 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - title: MyString - overview: MyString - release_date: MyString + title: Men In Black + overview: Save the world through the intergalactic + release_date: 1990 inventory: 1 two: - title: MyString - overview: MyString - release_date: MyString - inventory: 1 + title: Ready Player One + overview: Video game is life + release_date: 2018 + inventory: 2 From 47b028abd78ac99c919820f193605f3d8c7c806c Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 16:18:58 -0700 Subject: [PATCH 08/49] customer - controller tests, controller index, fixutres, model tests start --- app/controllers/customers_controller.rb | 3 ++ test/controllers/customers_controller_test.rb | 38 +++++++++++++++++-- test/fixtures/customers.yml | 24 ++++++------ test/models/customer_test.rb | 11 ++++-- 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 00dad6539..dd4f99569 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: customers.as_json(only: [:address, :city, :id, :name, :phone, :postal_code, :registered_at]) end + end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 5e123f6cd..3fca5a212 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -1,7 +1,39 @@ require "test_helper" describe CustomersController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "index" do + it "is a real working route" do + get customers_url + must_respond_with :success + end + + it "returns json" do + get customers_url + response.header['Content-Type'].must_include 'json' + end + + it "returns an Array" do + get customers_url + + body = JSON.parse(response.body) + body.must_be_kind_of Array + end + + it "returns all of the customers" do + get customers_url + + body = JSON.parse(response.body) + body.length.must_equal Customer.count + end + + it "customers must have names and phone nums" do + keys = %w(address city id name phone postal_code registered_at) + get customers_url + body = JSON.parse(response.body) + body.each do |customer| + customer.keys.sort.must_equal keys.sort + end + end + + end end diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index 88661796d..4c1867c84 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -1,17 +1,17 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - name: MyString - address: MyString - city: MyString - state: MyString - zip: MyString - phone: MyString + name: Molly + address: 123 Cool Street + city: Seattle + state: WA + postal_code: 98145 + phone: 123-123-1234 two: - name: MyString - address: MyString - city: MyString - state: MyString - zip: MyString - phone: MyString + name: Billy + address: 321 Nerd Street + city: San Francisio + state: CA + postal_code: 98245 + phone: 321-321-4321 diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 5ebc5c850..41de86770 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,9 +1,14 @@ require "test_helper" describe Customer do - let(:customer) { Customer.new } - it "must be valid" do - value(customer).must_be :valid? + value(customers(:one)).must_be :valid? + end + + it "must have a name" do + customer = customers(:one) + customer.name = nil + + customer.valid?.must_be false end end From e5305eaae0bb81f40b40e35d9fde8afe52f78451 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Mon, 7 May 2018 16:34:51 -0700 Subject: [PATCH 09/49] movie model testing validations written --- test/controllers/movies_controller_test.rb | 6 ++--- test/fixtures/customers.yml | 4 +-- test/models/movie_test.rb | 29 +++++++++++++++++++--- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index aa6a6dd58..924d97202 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -57,9 +57,9 @@ describe "create" do let(:movie_data) { { - title: "Pirates of the Caribbean" - overview: "The ocean's black pearl saves and perishes" - release_date: 2000 + title: "Pirates of the Caribbean", + overview: "The ocean's black pearl saves and perishes", + release_date: "2000", inventory: 3 } } diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index 88661796d..2823d1188 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -5,7 +5,7 @@ one: address: MyString city: MyString state: MyString - zip: MyString + postal_code: MyString phone: MyString two: @@ -13,5 +13,5 @@ two: address: MyString city: MyString state: MyString - zip: MyString + postal_code: MyString phone: MyString diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 34d1d30a5..5fe7f456d 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,9 +1,30 @@ require "test_helper" -describe Movie do - let(:movie) { Movie.new } +describe "Movie" do + describe "valid movies" do + it "must be valid if given valid movie info" do + movie = (movies(:one)) + value(movie).must_be :valid? + end + end + + describe "invalid movies" do + it "must return error if missing title" do + movie = movies(:one) + movie.title = nil + value(movie).valid?.must_equal false + end + + it "must return error if missing inventory" do + movie = movies(:one) + movie.inventory = nil + value(movie).valid?.must_equal false + end - it "must be valid" do - value(movie).must_be :valid? + it "must return error if inventory is not an integer" do + movie = movies(:one) + movie.inventory = "not a number" + value(movie).valid?.must_equal false + end end end From 8ff62f7355d356e5b18368a1eb2e3dff72df2f07 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 7 May 2018 16:35:04 -0700 Subject: [PATCH 10/49] customer model tests --- test/models/customer_test.rb | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 41de86770..ba9263ded 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,14 +1,24 @@ require "test_helper" describe Customer do - it "must be valid" do - value(customers(:one)).must_be :valid? - end + describe "validations" do + it "must be valid" do + value(customers(:one)).must_be :valid? + end + + it "must have a name" do + customer = customers(:one) + customer.name = nil - it "must have a name" do - customer = customers(:one) - customer.name = nil + customer.valid?.must_equal false + end - customer.valid?.must_be false + it "must have a phone num" do + customer = customers(:two) + customer.phone = nil + + customer.valid?.must_equal false + end end + end From c8e28d414f587e8ddd7e5ba1b4ab980138456402 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Tue, 8 May 2018 11:00:33 -0700 Subject: [PATCH 11/49] finished controller testing and writing code for customer and movie --- app/controllers/movies_controller.rb | 21 +++++++++++++++++++++ test/controllers/movies_controller_test.rb | 21 +++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index b69241e5f..05ebfd015 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,10 +1,31 @@ class MoviesController < ApplicationController def index + movies = Movie.all + render json:movies.as_json(only: [:title, :overview, :release_date, :inventory, :id]), status: :ok end def show + movie = Movie.find_by(id: params[:id]) + + if movie + render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :id]), status: :ok + else + render json: {ok: false}, status: :not_found + end end def create + movie = Movie.new(movie_params) + + if movie.save + render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :id]), status: :ok + else + render json: {ok: false, errors: movie.errors}, status: :bad_request + end end + + private + def movie_params + return params.require(:movie).permit(:title, :overview, :release_date, :inventory, :id) + end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 924d97202..087339a7c 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -4,10 +4,16 @@ describe "index" do it "is a real working route" do - get movies_url + get movies_path must_respond_with :success end + # what is response for invalid path + # it "if route is invalid/not working" do + # get moon_path + # must_respond_with :not_found + # end + it "returns json" do get movies_url response.header['Content-Type'].must_include 'json' @@ -27,6 +33,16 @@ body.length.must_equal Movie.count end + it "returns no movies if there are no movies, status :not_found" do + Movie.destroy_all + + get movies_url + must_respond_with :ok + body = JSON.parse(response.body) + body.length.must_equal Movie.count + + end + it "returns movies with exactly the required fields" do # unsure of order for keys...doesn't matter? keys = %w(title overview release_date inventory id) @@ -70,10 +86,11 @@ post movies_url, params: { movie: movie_data } }.must_change "Movie.count", 1 must_respond_with :success + end it "returns a bad request for a bad params data" do - movie_data[:name] = nil + movie_data[:title] = nil proc{ post movies_url, params: { movie: movie_data } From 54358d9bc32096e84ce58b65457b165037087404 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 8 May 2018 11:22:38 -0700 Subject: [PATCH 12/49] params fixed and wave 2 postman tests pass - fails related to optionals --- app/controllers/customers_controller.rb | 4 +++- app/controllers/movies_controller.rb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index dd4f99569..e42ffc019 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -3,7 +3,9 @@ class CustomersController < ApplicationController def index customers = Customer.all - render json: customers.as_json(only: [:address, :city, :id, :name, :phone, :postal_code, :registered_at]) + render json: customers.as_json(only: [:address, :city, :id, :name, :phone, :postal_code, :registered_at]), status: :ok + + # what if no customers end end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 05ebfd015..e2c17f048 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -26,6 +26,6 @@ def create private def movie_params - return params.require(:movie).permit(:title, :overview, :release_date, :inventory, :id) + return params.permit(:title, :overview, :release_date, :inventory) end end From 761945bb2ea5b337b62b16e165e639fe8482f8e8 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Tue, 8 May 2018 12:54:51 -0700 Subject: [PATCH 13/49] created rental model, validations and relationshps with customer and movie models --- app/models/customer.rb | 1 + app/models/movie.rb | 1 + app/models/rental.rb | 7 +++++++ db/migrate/20180508194230_rental.rb | 4 ++++ db/migrate/20180508194417_create_rentals.rb | 13 +++++++++++++ db/schema.rb | 12 +++++++++++- test/fixtures/rentals.yml | 15 +++++++++++++++ test/models/rental_test.rb | 9 +++++++++ 8 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 app/models/rental.rb create mode 100644 db/migrate/20180508194230_rental.rb create mode 100644 db/migrate/20180508194417_create_rentals.rb create mode 100644 test/fixtures/rentals.yml create mode 100644 test/models/rental_test.rb diff --git a/app/models/customer.rb b/app/models/customer.rb index 8aece73c7..7b564620f 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,3 +1,4 @@ class Customer < ApplicationRecord validates :name, :phone, presence: true + has_many :rentals end diff --git a/app/models/movie.rb b/app/models/movie.rb index 8e2036622..c15072815 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -2,5 +2,6 @@ class Movie < ApplicationRecord validates :title, :inventory, presence: true validates :inventory, numericality: true + has_many :rentals end diff --git a/app/models/rental.rb b/app/models/rental.rb new file mode 100644 index 000000000..94f88be09 --- /dev/null +++ b/app/models/rental.rb @@ -0,0 +1,7 @@ +class Rental < ApplicationRecord + + # validates :customer_id, :movie_id, presence: true + # validates :customer_id, :movie_id, numericality: true + + belongs_to :customer, :movie +end diff --git a/db/migrate/20180508194230_rental.rb b/db/migrate/20180508194230_rental.rb new file mode 100644 index 000000000..ed3df7c72 --- /dev/null +++ b/db/migrate/20180508194230_rental.rb @@ -0,0 +1,4 @@ +class Rental < ActiveRecord::Migration[5.1] + def change + end +end diff --git a/db/migrate/20180508194417_create_rentals.rb b/db/migrate/20180508194417_create_rentals.rb new file mode 100644 index 000000000..d7c917353 --- /dev/null +++ b/db/migrate/20180508194417_create_rentals.rb @@ -0,0 +1,13 @@ +class CreateRentals < ActiveRecord::Migration[5.1] + def change + create_table :rentals do |t| + t.integer :customer_id + t.integer :movie_id + t.string :check_out_date + t.string :due_date + t.string :check_in_date + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 3fbfc9900..7c72a3d36 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: 20180507214957) do +ActiveRecord::Schema.define(version: 20180508194417) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -36,4 +36,14 @@ t.datetime "updated_at", null: false end + create_table "rentals", force: :cascade do |t| + t.integer "customer_id" + t.integer "movie_id" + t.string "check_out_date" + t.string "due_date" + t.string "check_in_date" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml new file mode 100644 index 000000000..9342efb64 --- /dev/null +++ b/test/fixtures/rentals.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + customer_id: 1 + movie_id: 1 + checkout_date: MyString + due_date: MyString + check_out_date: MyString + +two: + customer_id: 1 + movie_id: 1 + checkout_date: MyString + due_date: MyString + check_out_date: MyString diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb new file mode 100644 index 000000000..6ea53d94f --- /dev/null +++ b/test/models/rental_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Rental do + let(:rental) { Rental.new } + + it "must be valid" do + value(rental).must_be :valid? + end +end From 750f104ddd4fa3ecca8c0d22a6a1627d3324396a Mon Sep 17 00:00:00 2001 From: Abiaina Date: Tue, 8 May 2018 13:53:28 -0700 Subject: [PATCH 14/49] uncommented out model validations --- app/models/rental.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index 94f88be09..2557354a1 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,7 +1,8 @@ class Rental < ApplicationRecord - # validates :customer_id, :movie_id, presence: true - # validates :customer_id, :movie_id, numericality: true + validates :customer_id, :movie_id, presence: true + + validates :customer_id, :movie_id, numericality: true belongs_to :customer, :movie end From fa833a288408d58c84eb6098090e3de1fc493c59 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 8 May 2018 15:35:18 -0700 Subject: [PATCH 15/49] rental controller generated; rental route futzed with; rental model validations added; tests need work --- app/controllers/movies_controller.rb | 3 ++ app/controllers/rentals_controller.rb | 44 +++++++++++++++++++++ app/models/rental.rb | 9 +++-- config/routes.rb | 5 +++ test/controllers/rentals_controller_test.rb | 14 +++++++ test/fixtures/rentals.yml | 10 ++--- test/models/rental_test.rb | 44 +++++++++++++++++++-- 7 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 app/controllers/rentals_controller.rb create mode 100644 test/controllers/rentals_controller_test.rb diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index e2c17f048..d62ef861c 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -24,6 +24,9 @@ def create end end + + + private def movie_params return params.permit(:title, :overview, :release_date, :inventory) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb new file mode 100644 index 000000000..eb2b72824 --- /dev/null +++ b/app/controllers/rentals_controller.rb @@ -0,0 +1,44 @@ +require 'date' + +class RentalsController < ApplicationController + def new + rental = rental.new + end + def create + today = Date.today + + cust_mov = { + customer_id: params[:customer_id], + movie_id: params[:movie_id], + check_in_date: today.to_s, + due_date: (today + 7).to_s + } + + rental = Rental.new(cust_mov) + # rental.check_out_date = today.to_s + # rental.due_date = (today + 7).to_s + + # rental_data = { + # customer_id: params[:customer_id], + # movie_id: params[:movie_id], + # check_out_date: Date.today.to_s, + # due_date: (Date.today + 7).to_s + # } + # rental = Rental.new(rental_data) + + if rental.save + render json: {id: rental.id}, status: :ok + else + render json: {ok: false, errors: rental.errors}, status: :bad_request + end + end + + def update + end + + private + + def rental_params + return params.permit(:movie_id, :customer_id) + end +end diff --git a/app/models/rental.rb b/app/models/rental.rb index 94f88be09..15c018463 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,7 +1,10 @@ class Rental < ApplicationRecord - # validates :customer_id, :movie_id, presence: true - # validates :customer_id, :movie_id, numericality: true + validates :customer_id, :movie_id, :check_out_date, :due_date, presence: true + + validates :customer_id, :movie_id, numericality: true + + belongs_to :customer + belongs_to :movie - belongs_to :customer, :movie end diff --git a/config/routes.rb b/config/routes.rb index 464e84d3c..0a50efb0f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,8 @@ Rails.application.routes.draw do + get 'rentals/new' + + get 'rentals/update' + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html #customers_controller @@ -7,4 +11,5 @@ #movies_controller resources :movies, only:[:index, :show, :create] + post 'rentals/check_out/:movie_id/:customer_id', to: 'movies#check_out' end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb new file mode 100644 index 000000000..336e5f212 --- /dev/null +++ b/test/controllers/rentals_controller_test.rb @@ -0,0 +1,14 @@ +require "test_helper" + +describe RentalsController do + it "should get new" do + get rentals_new_url + value(response).must_be :success? + end + + it "should get update" do + get rentals_update_url + value(response).must_be :success? + end + +end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index 9342efb64..06d2d6585 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -3,13 +3,13 @@ one: customer_id: 1 movie_id: 1 - checkout_date: MyString - due_date: MyString - check_out_date: MyString + check_out_date: nil + due_date: nil + check_in_date: nil two: customer_id: 1 movie_id: 1 - checkout_date: MyString - due_date: MyString + check_out_date: + due_date: check_out_date: MyString diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6ea53d94f..6e361ca37 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,9 +1,47 @@ require "test_helper" describe Rental do - let(:rental) { Rental.new } + describe "Valid?" do + # it "must create valid rental with valid data" do + # params = { + # customer_id: customers(:one).id, + # movie_id: movies(:two).id, + # } + # + # # rental_data = { + # # customer_id: params[:customer_id], + # # movie_id: params[:movie_id], + # # check_out_date: Date.today.to_s, + # # due_date: (Date.today + 7).to_s + # # } + # + # rental = Rental.create(params) + # binding.pry + # + # rental.valid?.must_equal true + # end - it "must be valid" do - value(rental).must_be :valid? + it "must be valid" do + rental = rentals(:one) + + date = Date.today + rental.check_in_date = date + rental.due_date = Date.today + 7 + rental.save + + rental.valid?.must_equal true + end + # + # it "must have check_out_date" do + # params = { + # customer_id: customers(:one).id, + # movie_id: movies(:two).id + # } + # + # rental = Rental.create(params) + # + # rental.valid?.must_equal true + # end end + end From 693ba8108b20e111615a3dcc251e6baece966636 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 8 May 2018 16:22:54 -0700 Subject: [PATCH 16/49] updated new rental route; fixed rental create typo --- app/controllers/rentals_controller.rb | 3 ++- config/routes.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index eb2b72824..ff0f66c90 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -4,13 +4,14 @@ class RentalsController < ApplicationController def new rental = rental.new end + def create today = Date.today cust_mov = { customer_id: params[:customer_id], movie_id: params[:movie_id], - check_in_date: today.to_s, + check_out_date: today.to_s, due_date: (today + 7).to_s } diff --git a/config/routes.rb b/config/routes.rb index 0a50efb0f..721b803ad 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,5 +11,5 @@ #movies_controller resources :movies, only:[:index, :show, :create] - post 'rentals/check_out/:movie_id/:customer_id', to: 'movies#check_out' + post 'rentals/check_out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental' end From ca24c2fc1cc392fb6294def871c8b334e0436a16 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Tue, 8 May 2018 16:24:18 -0700 Subject: [PATCH 17/49] model validations for rentals passing and created --- db/seeds.rb | 4 +- test/models/rental_test.rb | 80 +++++++++++++++++++++++++++++++------- 2 files changed, 68 insertions(+), 16 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 5322340ba..50b3a8f64 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -3,5 +3,7 @@ end JSON.parse(File.read('db/seeds/movies.json')).each do |movie| - Movie.create!(movie) + new_movie = Movie.create!(movie) + new_movie.available_inventory = new_movie.inventory + new_movie.save end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6e361ca37..239a52067 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -22,26 +22,76 @@ # end it "must be valid" do - rental = rentals(:one) - date = Date.today - rental.check_in_date = date - rental.due_date = Date.today + 7 + rental_data = { + customer_id: (customers(:one)).id, + movie_id: (movies(:one)).id, + check_out_date: Date.today.to_s, + due_date: (Date.today + 7).to_s + } + + rental = Rental.new(rental_data) + rental.save rental.valid?.must_equal true end - # - # it "must have check_out_date" do - # params = { - # customer_id: customers(:one).id, - # movie_id: movies(:two).id - # } - # - # rental = Rental.create(params) - # - # rental.valid?.must_equal true - # end + + it "must have check_out_date" do + + rental_data = { + customer_id: (customers(:one)).id, + movie_id: (movies(:one)).id, + check_out_date: nil, + due_date: (Date.today + 7).to_s + } + + rental = Rental.create(rental_data) + + rental.valid?.must_equal false + end + + it "must have movie_id" do + + rental_data = { + customer_id: (customers(:one)).id, + movie_id: nil, + check_out_date: Date.today.to_s, + due_date: (Date.today + 7).to_s + } + + rental = Rental.create(rental_data) + + rental.valid?.must_equal false + end + + it "must have customer_id" do + + rental_data = { + customer_id: nil, + movie_id: (movies(:one)).id, + check_out_date: Date.today.to_s, + due_date: (Date.today + 7).to_s + } + + rental = Rental.create(rental_data) + + rental.valid?.must_equal false + end + + it "must have due_date" do + + rental_data = { + customer_id: (customers(:one)).id, + movie_id: (movies(:one)).id, + check_out_date: Date.today.to_s, + due_date: nil + } + + rental = Rental.create(rental_data) + + rental.valid?.must_equal false + end end end From 4e90c9eb8afd98231bac05ec74adc9b7e83d61b2 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Tue, 8 May 2018 16:53:25 -0700 Subject: [PATCH 18/49] updated movie model tests and model ymls are still not working. movie model tests pass --- app/controllers/movies_controller.rb | 3 +- app/models/movie.rb | 2 + test/models/movie_test.rb | 60 +++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d62ef861c..dfacdec68 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,4 +1,5 @@ class MoviesController < ApplicationController + def index movies = Movie.all render json:movies.as_json(only: [:title, :overview, :release_date, :inventory, :id]), status: :ok @@ -25,8 +26,6 @@ def create end - - private def movie_params return params.permit(:title, :overview, :release_date, :inventory) diff --git a/app/models/movie.rb b/app/models/movie.rb index c15072815..458f78cf3 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,7 +1,9 @@ class Movie < ApplicationRecord validates :title, :inventory, presence: true + validates :inventory, numericality: true + has_many :rentals end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 5fe7f456d..a3aadcebe 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,30 +1,70 @@ require "test_helper" +require 'date' describe "Movie" do describe "valid movies" do it "must be valid if given valid movie info" do - movie = (movies(:one)) + + movie_data = { + title: "Not another movie" , + overview: "more of the same" , + release_date: 1993 , + inventory: 12, + } + + movie = Movie.create(movie_data) + value(movie).must_be :valid? end end describe "invalid movies" do it "must return error if missing title" do - movie = movies(:one) - movie.title = nil - value(movie).valid?.must_equal false + + movie_data = { + title: nil , + overview: "more of the same" , + release_date: 1993 , + inventory: 12, + } + + movie = Movie.new(movie_data) + + movie.save + + movie.valid?.must_equal false end it "must return error if missing inventory" do - movie = movies(:one) - movie.inventory = nil - value(movie).valid?.must_equal false + + movie_data = { + title: "not another movie" , + overview: "more of the same" , + release_date: 1993 , + inventory: nil, + } + + movie = Movie.new(movie_data) + + movie.save + + movie.valid?.must_equal false end it "must return error if inventory is not an integer" do - movie = movies(:one) - movie.inventory = "not a number" - value(movie).valid?.must_equal false + + movie_data = { + title: "friday night and lights are low" , + overview: "dancing queen" , + release_date: 1993 , + inventory: "abba", + } + + movie = Movie.new(movie_data) + + movie.save + + movie.valid?.must_equal false end end end From c9d72f1e0b7cad9c7f289f6969703d83b6034078 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 09:18:21 -0700 Subject: [PATCH 19/49] updated routes to be more RESTFUL --- config/routes.rb | 7 ++++--- test/models/movie_test.rb | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 721b803ad..8d02c6d8d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,5 @@ Rails.application.routes.draw do - get 'rentals/new' - get 'rentals/update' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html @@ -11,5 +9,8 @@ #movies_controller resources :movies, only:[:index, :show, :create] - post 'rentals/check_out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental' + post 'rentals/check_out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental_create' + + patch 'rentals/update', to: 'rentals#update' as 'rental_update' + end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index a3aadcebe..a0cac942e 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -48,7 +48,7 @@ movie.save - movie.valid?.must_equal false + movie.valid?.must_equal falsegi end it "must return error if inventory is not an integer" do From 0430c9b0e09a094f6dcb9563c7c01d9f6eedb709 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 09:52:31 -0700 Subject: [PATCH 20/49] updated routes, test now pass for controller rental create path with valid info from yml --- app/controllers/rentals_controller.rb | 6 ++--- config/routes.rb | 4 +-- test/controllers/movies_controller_test.rb | 2 +- test/controllers/rentals_controller_test.rb | 28 ++++++++++++++------- test/models/movie_test.rb | 2 +- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index ff0f66c90..6e2027678 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,9 +1,9 @@ require 'date' class RentalsController < ApplicationController - def new - rental = rental.new - end + # def new + # rental = rental.new + # end def create today = Date.today diff --git a/config/routes.rb b/config/routes.rb index 8d02c6d8d..d36242bba 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,8 +9,8 @@ #movies_controller resources :movies, only:[:index, :show, :create] - post 'rentals/check_out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental_create' + post 'rentals/check_out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental' - patch 'rentals/update', to: 'rentals#update' as 'rental_update' + patch 'rentals/update', to: 'rentals#update' end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 087339a7c..9f4f94f31 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -83,7 +83,7 @@ it "Creates a new movie" do proc{ - post movies_url, params: { movie: movie_data } + post movies_path, params: { movie: movie_data } }.must_change "Movie.count", 1 must_respond_with :success diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 336e5f212..a2ed943c9 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,14 +1,24 @@ require "test_helper" +require 'pry' -describe RentalsController do - it "should get new" do - get rentals_new_url - value(response).must_be :success? - end +describe "RentalsController" do + + it "can create new rental" do + + rental_count = Rental.all.count + + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } - it "should get update" do - get rentals_update_url - value(response).must_be :success? + post rental_path(customer_movie_info) + + Rental.all.count.must_equal (rental_count + 1) end -end + it "should be able update a rental" do + + end + + end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index a0cac942e..a3aadcebe 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -48,7 +48,7 @@ movie.save - movie.valid?.must_equal falsegi + movie.valid?.must_equal false end it "must return error if inventory is not an integer" do From 718ec59d9a2fdd612f16cc1e8e328d66dde182e1 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 09:54:38 -0700 Subject: [PATCH 21/49] movies have column tracking available inventory as integer --- .../20180509165325_add_available_inventory_to_movie.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180509165325_add_available_inventory_to_movie.rb diff --git a/db/migrate/20180509165325_add_available_inventory_to_movie.rb b/db/migrate/20180509165325_add_available_inventory_to_movie.rb new file mode 100644 index 000000000..8243819ec --- /dev/null +++ b/db/migrate/20180509165325_add_available_inventory_to_movie.rb @@ -0,0 +1,5 @@ +class AddAvailableInventoryToMovie < ActiveRecord::Migration[5.1] + def change + add_column :movies, :available_inventory, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 7c72a3d36..7a03b4e44 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: 20180508194417) do +ActiveRecord::Schema.define(version: 20180509165325) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -34,6 +34,7 @@ t.integer "inventory" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "available_inventory" end create_table "rentals", force: :cascade do |t| From 345aa170697c829546ca7c301310c2796473fe10 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 10:31:31 -0700 Subject: [PATCH 22/49] added model test for decrement available inventory method created in movie model...test failed then passing --- app/models/movie.rb | 9 +++++++++ test/fixtures/movies.yml | 6 ++++-- test/models/movie_test.rb | 28 ++++++++++++++++++++++++---- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index 458f78cf3..89e0041b7 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -6,4 +6,13 @@ class Movie < ApplicationRecord has_many :rentals + def self.decrement(movie) + + if movie && movie.available_inventory > 0 + movie.available_inventory -= 1 + else + # figure out how we will process invalid requests + end + end + end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index 7a3c48280..abb9c99fa 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -4,10 +4,12 @@ one: title: Men In Black overview: Save the world through the intergalactic release_date: 1990 - inventory: 1 + inventory: 15 + available_inventory: 15 two: title: Ready Player One overview: Video game is life release_date: 2018 - inventory: 2 + inventory: 15 + available_inventory: 7 diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index a3aadcebe..f2845671b 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -9,7 +9,7 @@ title: "Not another movie" , overview: "more of the same" , release_date: 1993 , - inventory: 12, + inventory: 12 } movie = Movie.create(movie_data) @@ -25,7 +25,7 @@ title: nil , overview: "more of the same" , release_date: 1993 , - inventory: 12, + inventory: 12 } movie = Movie.new(movie_data) @@ -41,7 +41,7 @@ title: "not another movie" , overview: "more of the same" , release_date: 1993 , - inventory: nil, + inventory: nil } movie = Movie.new(movie_data) @@ -57,7 +57,7 @@ title: "friday night and lights are low" , overview: "dancing queen" , release_date: 1993 , - inventory: "abba", + inventory: "abba" } movie = Movie.new(movie_data) @@ -67,4 +67,24 @@ movie.valid?.must_equal false end end + + describe "Movie.decrement method" do + it "decrements available_inventory of a movie when given valid data" do + movie_data = { + title: "Not another movie" , + overview: "more of the same" , + release_date: 1993 , + inventory: 12, + available_inventory: 10 + } + + movie = Movie.create(movie_data) + + available = movie.available_inventory + + Movie.decrement(movie) + + movie.available_inventory.must_equal (available -1) + end + end end From db2eb302cc68b902562687733031d1495b8599e5 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 9 May 2018 11:14:01 -0700 Subject: [PATCH 23/49] movie yml working; validations for movie updated to include avail_inventory; available_inventory works --- app/controllers/movies_controller.rb | 8 +-- app/controllers/rentals_controller.rb | 10 ---- app/models/movie.rb | 18 +++++- test/fixtures/movies.yml | 20 +++---- test/models/movie_test.rb | 85 ++++++++++----------------- test/models/rental_test.rb | 2 + 6 files changed, 61 insertions(+), 82 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index dfacdec68..1abb4951c 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,15 +1,15 @@ class MoviesController < ApplicationController - + def index movies = Movie.all - render json:movies.as_json(only: [:title, :overview, :release_date, :inventory, :id]), status: :ok + render json:movies.as_json(only: [:title, :overview, :release_date, :inventory, :id, :available_inventory]), status: :ok end def show movie = Movie.find_by(id: params[:id]) if movie - render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :id]), status: :ok + render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :id, :available_inventory]), status: :ok else render json: {ok: false}, status: :not_found end @@ -28,6 +28,6 @@ def create private def movie_params - return params.permit(:title, :overview, :release_date, :inventory) + return params.permit(:title, :overview, :release_date, :inventory, :available_inventory) end end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 6e2027678..679d0d242 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -16,16 +16,6 @@ def create } rental = Rental.new(cust_mov) - # rental.check_out_date = today.to_s - # rental.due_date = (today + 7).to_s - - # rental_data = { - # customer_id: params[:customer_id], - # movie_id: params[:movie_id], - # check_out_date: Date.today.to_s, - # due_date: (Date.today + 7).to_s - # } - # rental = Rental.new(rental_data) if rental.save render json: {id: rental.id}, status: :ok diff --git a/app/models/movie.rb b/app/models/movie.rb index 89e0041b7..3dd70b44d 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,10 +1,22 @@ class Movie < ApplicationRecord - validates :title, :inventory, presence: true + has_many :rentals - validates :inventory, numericality: true + validates :title, :inventory, :available_inventory, presence: true - has_many :rentals + validates :inventory, numericality: {only_integer: true, greater_than: 0} + + validates :available_inventory, numericality: { only_integer: true, greater_than: 0} + + validate :available_inventory_cannot_exceed_inventory + + def available_inventory_cannot_exceed_inventory + if inventory + if inventory < available_inventory + errors.add(:available_inventory, "Cannot exceed inventory") + end + end + end def self.decrement(movie) diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index abb9c99fa..688f1aa7a 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -1,15 +1,15 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - title: Men In Black - overview: Save the world through the intergalactic - release_date: 1990 - inventory: 15 - available_inventory: 15 + title: Men in black + overview: will smithy + release_date: "2005-08-08" + inventory: 3 + available_inventory: 3 two: - title: Ready Player One - overview: Video game is life - release_date: 2018 - inventory: 15 - available_inventory: 7 + title: Men in black II + overview: will smithy II + release_date: "2015-08-08" + inventory: 5 + available_inventory: 5 diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index f2845671b..d48275ee3 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,68 +1,51 @@ require "test_helper" -require 'date' -describe "Movie" do +describe Movie do describe "valid movies" do - it "must be valid if given valid movie info" do - - movie_data = { - title: "Not another movie" , - overview: "more of the same" , - release_date: 1993 , - inventory: 12 - } - - movie = Movie.create(movie_data) - - value(movie).must_be :valid? + it "must be valid movie" do + movie = movies(:one) + movie.valid?.must_equal true end end describe "invalid movies" do - it "must return error if missing title" do - - movie_data = { - title: nil , - overview: "more of the same" , - release_date: 1993 , - inventory: 12 - } - - movie = Movie.new(movie_data) - - movie.save + it "title must be valid" do + movie = movies(:one) + movie.title = nil movie.valid?.must_equal false end - it "must return error if missing inventory" do + it "inventory must be valid" do + movie = movies(:one) + movie.inventory = nil - movie_data = { - title: "not another movie" , - overview: "more of the same" , - release_date: 1993 , - inventory: nil - } - - movie = Movie.new(movie_data) + movie.valid?.must_equal false + end - movie.save + it "inventory cannot be a string" do + movie = movies(:one) + movie.inventory = "cat" movie.valid?.must_equal false end - it "must return error if inventory is not an integer" do + it "cannot have string for available_inventory" do + movie = movies(:one) + movie.available_inventory = "cat" + movie.valid?.must_equal false + end - movie_data = { - title: "friday night and lights are low" , - overview: "dancing queen" , - release_date: 1993 , - inventory: "abba" - } + it "must have available_inventory between 0 and total inventory" do + movie = movies(:one) + movie.available_inventory = -1 - movie = Movie.new(movie_data) + movie.valid?.must_equal false + end - movie.save + it "must have available_inventory between 0 and total inventory" do + movie = movies(:one) + movie.available_inventory = 6 movie.valid?.must_equal false end @@ -70,16 +53,7 @@ describe "Movie.decrement method" do it "decrements available_inventory of a movie when given valid data" do - movie_data = { - title: "Not another movie" , - overview: "more of the same" , - release_date: 1993 , - inventory: 12, - available_inventory: 10 - } - - movie = Movie.create(movie_data) - + movie = movies(:two) available = movie.available_inventory Movie.decrement(movie) @@ -87,4 +61,5 @@ movie.available_inventory.must_equal (available -1) end end + end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 239a52067..32ab4af3e 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -23,6 +23,8 @@ it "must be valid" do + binding.pry + rental_data = { customer_id: (customers(:one)).id, movie_id: (movies(:one)).id, From c6453f410ee0551823feb813aa452505ad9fbb89 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 9 May 2018 15:13:05 -0700 Subject: [PATCH 24/49] model and controller tests; work on checkin-out and check-in --- app/controllers/rentals_controller.rb | 50 +++-- app/models/movie.rb | 24 +++ config/routes.rb | 4 +- test/controllers/movies_controller_test.rb | 20 +- test/controllers/rentals_controller_test.rb | 101 +++++++++- test/fixtures/movies.yml | 2 +- test/fixtures/rentals.yml | 14 +- test/models/movie_test.rb | 20 ++ test/models/rental_test.rb | 194 ++++++++++++-------- 9 files changed, 296 insertions(+), 133 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 679d0d242..b1c15ca35 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,30 +1,42 @@ require 'date' class RentalsController < ApplicationController - # def new - # rental = rental.new - # end def create - today = Date.today - - cust_mov = { - customer_id: params[:customer_id], - movie_id: params[:movie_id], - check_out_date: today.to_s, - due_date: (today + 7).to_s - } - - rental = Rental.new(cust_mov) - - if rental.save - render json: {id: rental.id}, status: :ok - else - render json: {ok: false, errors: rental.errors}, status: :bad_request - end + chosen_movie = Movie.find_by(id: params[:movie_id]) + today = Date.today + + rental_data = { + movie_id: params[:movie_id], + customer_id: params[:customer_id], + check_out_date: today.to_s, + due_date: (today + 7).to_s + } + + rental = Rental.new(rental_data) + + if rental.save + Movie.decrement(chosen_movie) + + render json: {id: rental.id}, status: :ok + else + render json: {ok: false, errors: rental.errors}, status: :bad_request + end + end def update + rental = Rental.find_by(id: params[:rental_id]) + + today = Date.today.to_s + + rental.check_in_date = today + + rental.save + + Movie.increment(rental.movie) + + render json: {id: rental.id}, status: :ok end private diff --git a/app/models/movie.rb b/app/models/movie.rb index 3dd70b44d..d6c2816a2 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -27,4 +27,28 @@ def self.decrement(movie) end end + def self.increment(movie) + + if movie && movie.available_inventory < movie.inventory + movie.available_inventory += 1 + else + # return movie.errors.messages + end + end + + def self.available_movie?(id) + movie = false + + if Movie.find_by(id: id) + + movie = Movie.find_by(id: id) + + if movie.available_inventory <= 0 + movie = false + end + end + + return movie + end + end diff --git a/config/routes.rb b/config/routes.rb index d36242bba..53aa92a6d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,8 +9,8 @@ #movies_controller resources :movies, only:[:index, :show, :create] - post 'rentals/check_out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental' + post 'rentals/check-out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental' - patch 'rentals/update', to: 'rentals#update' + post 'rentals/check-in/:rental_id', to: 'rentals#update', as: 'rental_update' end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 9f4f94f31..3b6b4a14c 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,19 +1,12 @@ require "test_helper" describe MoviesController do - describe "index" do it "is a real working route" do get movies_path must_respond_with :success end - # what is response for invalid path - # it "if route is invalid/not working" do - # get moon_path - # must_respond_with :not_found - # end - it "returns json" do get movies_url response.header['Content-Type'].must_include 'json' @@ -44,8 +37,8 @@ end it "returns movies with exactly the required fields" do - # unsure of order for keys...doesn't matter? - keys = %w(title overview release_date inventory id) + + keys = %w(title overview release_date inventory id available_inventory) get movies_url body = JSON.parse(response.body) @@ -56,7 +49,6 @@ end describe "show" do - # This bit is up to you! it "can get a movie" do get movie_path(movies(:two).id) must_respond_with :success @@ -76,14 +68,14 @@ title: "Pirates of the Caribbean", overview: "The ocean's black pearl saves and perishes", release_date: "2000", - inventory: 3 + inventory: 3, + available_inventory: 3 } } it "Creates a new movie" do - proc{ - post movies_path, params: { movie: movie_data } + post movies_path, params: movie_data }.must_change "Movie.count", 1 must_respond_with :success @@ -93,7 +85,7 @@ movie_data[:title] = nil proc{ - post movies_url, params: { movie: movie_data } + post movies_url, params: movie_data }.must_change "Movie.count", 0 must_respond_with :bad_request body = JSON.parse(response.body) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index a2ed943c9..0a71c2e9f 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,24 +1,105 @@ require "test_helper" require 'pry' -describe "RentalsController" do +describe RentalsController do + describe "create" do + it "it is a real, working route" do + rental_count = Rental.all.count - it "can create new rental" do + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } + post rental_path(customer_movie_info) - rental_count = Rental.all.count + must_respond_with :success + Rental.all.count.must_equal (rental_count + 1) + end + + it "returns json" do + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } + post rental_path(customer_movie_info) - customer_movie_info = { - customer_id: customers(:one).id, - movie_id: movies(:one).id - } + response.header['Content-Type'].must_include 'json' + end - post rental_path(customer_movie_info) + it "returns the correct rental" do + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } + post rental_path(customer_movie_info) - Rental.all.count.must_equal (rental_count + 1) + body = JSON.parse(response.body) + body.length.must_equal 1 + body["id"].must_equal Rental.last.id + end + + # it "decrements the movie's available_inventory" do + # test_movie = movies(:one) + # initial_inventory = test_movie.available_inventory + # + # customer_movie_info = { + # customer_id: (customers(:one)).id, + # movie_id: test_movie.id + # } + # + # post rental_path(customer_movie_info) + # # movie2 = Movie.find_by(id: movies(:one).id) + # # binding.pry + # + # test_movie.available_inventory.must_equal (initial_inventory - 1) + # end end - it "should be able update a rental" do + describe "update" do + it "it is a real, working route" do + rental_count = Rental.all.count + rental = rentals(:one) + + post rental_update_path(rental.id) + + must_respond_with :success + Rental.all.count.must_equal rental_count + end + + it "returns json" do + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } + post rental_path(customer_movie_info) + + response.header['Content-Type'].must_include 'json' + end + it "returns the correct rental" do + # customer_movie_info = { + # customer_id: customers(:two).id, + # movie_id: movies(:one).id + # } + # post rental_path(customer_movie_info) + # + # body = JSON.parse(response.body) + # body.length.must_equal 1 + # body["id"].must_equal Rental.last.id end + it "increments the movie's available_inventory" do + movie = movies(:two) + starting_available_inventory = movie.available_inventory + + # customer_movie_info = { + # customer_id: customers(:one).id, + # movie_id: movie.id + # } + # post rental_path(customer_movie_info) + # + # movie.available_inventory.must_equal (starting_available_inventory + 1) + end end + +end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index 688f1aa7a..b6785ca27 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -12,4 +12,4 @@ two: overview: will smithy II release_date: "2015-08-08" inventory: 5 - available_inventory: 5 + available_inventory: 4 diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index 06d2d6585..d893e5bc4 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -1,15 +1,5 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - customer_id: 1 - movie_id: 1 - check_out_date: nil - due_date: nil - check_in_date: nil - -two: - customer_id: 1 - movie_id: 1 - check_out_date: - due_date: - check_out_date: MyString + customer: one + movie: one diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index d48275ee3..d5d7ac944 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -62,4 +62,24 @@ end end + describe "Movie.increment method" do + it "increment available_inventory of a movie when given valid data" do + movie = movies(:two) + available = movie.available_inventory + + Movie.increment(movie) + + movie.available_inventory.must_equal (available +1) + end + + it "cannot increment available if available is inventory" do + movie = movies(:one) + available = movie.available_inventory + + Movie.increment(movie) + binding.pry + movie.available_inventory.must_equal (available) + end + end + end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 32ab4af3e..240689bf4 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,99 +1,143 @@ require "test_helper" describe Rental do - describe "Valid?" do - # it "must create valid rental with valid data" do - # params = { - # customer_id: customers(:one).id, - # movie_id: movies(:two).id, - # } - # - # # rental_data = { - # # customer_id: params[:customer_id], - # # movie_id: params[:movie_id], - # # check_out_date: Date.today.to_s, - # # due_date: (Date.today + 7).to_s - # # } - # - # rental = Rental.create(params) - # binding.pry - # - # rental.valid?.must_equal true - # end - - it "must be valid" do - - binding.pry - - rental_data = { - customer_id: (customers(:one)).id, - movie_id: (movies(:one)).id, - check_out_date: Date.today.to_s, - due_date: (Date.today + 7).to_s - } - - rental = Rental.new(rental_data) - + describe "valid" do + before do + rental = rentals(:one) + rental.check_out_date = Date.today.to_s + rental.due_date = (Date.today + 7).to_s rental.save - - rental.valid?.must_equal true end - it "must have check_out_date" do - - rental_data = { - customer_id: (customers(:one)).id, - movie_id: (movies(:one)).id, - check_out_date: nil, - due_date: (Date.today + 7).to_s - } - - rental = Rental.create(rental_data) + it "is a valid rental" do + rentals(:one).valid?.must_equal true + end - rental.valid?.must_equal false + it "must have customer_id" do + rentals(:one).customer_id = nil + rentals(:one).valid?.must_equal false end it "must have movie_id" do + rentals(:one).movie_id = nil + rentals(:one).valid?.must_equal false + end - rental_data = { - customer_id: (customers(:one)).id, - movie_id: nil, - check_out_date: Date.today.to_s, - due_date: (Date.today + 7).to_s - } - - rental = Rental.create(rental_data) + it "must have numerical customer_id" do + rentals(:one).customer_id = "cat" + rentals(:one).valid?.must_equal false + end - rental.valid?.must_equal false + it "must have numerical movie_id" do + rentals(:one).customer_id = "dog" + rentals(:one).valid?.must_equal false end - it "must have customer_id" do + it "must have check_out_date" do + rentals(:one).check_out_date = nil + rentals(:one).valid?.must_equal false + end - rental_data = { - customer_id: nil, - movie_id: (movies(:one)).id, - check_out_date: Date.today.to_s, - due_date: (Date.today + 7).to_s - } + it "must have due_date" do + rentals(:one).due_date = nil + rentals(:one).valid?.must_equal false + end + end - rental = Rental.create(rental_data) + describe "relations" do + before do + rental = rentals(:one) + rental.check_out_date = Date.today.to_s + rental.due_date = (Date.today + 7).to_s + rental.save + end + + it "must respond to movie" do + rental = rentals(:one) + rental.movie.must_equal movies(:one) + end - rental.valid?.must_equal false + it "must respond to cusomer" do + rental = rentals(:one) + rental.customer.must_equal customers(:one) end + end - it "must have due_date" do - rental_data = { - customer_id: (customers(:one)).id, - movie_id: (movies(:one)).id, - check_out_date: Date.today.to_s, - due_date: nil - } - rental = Rental.create(rental_data) - rental.valid?.must_equal false - end - end + # describe "Valid?" do + # it "must be valid" do + # + # rental_data = { + # customer_id: (customers(:one)).id, + # movie_id: (movies(:one)).id, + # check_out_date: Date.today.to_s, + # due_date: (Date.today + 7).to_s + # } + # + # rental = Rental.new(rental_data) + # + # rental.save + # + # rental.valid?.must_equal true + # end + # + # it "must have check_out_date" do + # + # rental_data = { + # customer_id: (customers(:one)).id, + # movie_id: (movies(:one)).id, + # check_out_date: nil, + # due_date: (Date.today + 7).to_s + # } + # + # rental = Rental.create(rental_data) + # + # rental.valid?.must_equal false + # end + # + # it "must have movie_id" do + # + # rental_data = { + # customer_id: (customers(:one)).id, + # movie_id: nil, + # check_out_date: Date.today.to_s, + # due_date: (Date.today + 7).to_s + # } + # + # rental = Rental.create(rental_data) + # + # rental.valid?.must_equal false + # end + # + # it "must have customer_id" do + # + # rental_data = { + # customer_id: nil, + # movie_id: (movies(:one)).id, + # check_out_date: Date.today.to_s, + # due_date: (Date.today + 7).to_s + # } + # + # rental = Rental.create(rental_data) + # + # rental.valid?.must_equal false + # end + # + # it "must have due_date" do + # + # rental_data = { + # customer_id: (customers(:one)).id, + # movie_id: (movies(:one)).id, + # check_out_date: Date.today.to_s, + # due_date: nil + # } + # + # rental = Rental.create(rental_data) + # + # rental.valid?.must_equal false + # end + # end end From 0455297c216b20bfead7eb3908a148cb703463d5 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 9 May 2018 15:29:33 -0700 Subject: [PATCH 25/49] tests updated after conversation with Chris --- app/controllers/rentals_controller.rb | 18 ++++++------- app/models/movie.rb | 3 ++- test/controllers/rentals_controller_test.rb | 30 ++++++++++----------- test/models/movie_test.rb | 2 +- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index b1c15ca35..88ed59027 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -17,7 +17,6 @@ def create if rental.save Movie.decrement(chosen_movie) - render json: {id: rental.id}, status: :ok else render json: {ok: false, errors: rental.errors}, status: :bad_request @@ -28,15 +27,16 @@ def create def update rental = Rental.find_by(id: params[:rental_id]) - today = Date.today.to_s - - rental.check_in_date = today - - rental.save - - Movie.increment(rental.movie) + if rental + today = Date.today.to_s + rental.check_in_date = today + rental.save - render json: {id: rental.id}, status: :ok + Movie.increment(rental.movie) + render json: {id: rental.id}, status: :ok + else + render json: {ok: false, errors: rental.errors}, status: :bad_request + end end private diff --git a/app/models/movie.rb b/app/models/movie.rb index d6c2816a2..daf4cb5c7 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -13,7 +13,7 @@ class Movie < ApplicationRecord def available_inventory_cannot_exceed_inventory if inventory if inventory < available_inventory - errors.add(:available_inventory, "Cannot exceed inventory") + errors.add(:available_inventory, "Cannot exceed inventory") end end end @@ -22,6 +22,7 @@ def self.decrement(movie) if movie && movie.available_inventory > 0 movie.available_inventory -= 1 + movie.save else # figure out how we will process invalid requests end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 0a71c2e9f..7625af5a3 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -38,21 +38,21 @@ body["id"].must_equal Rental.last.id end - # it "decrements the movie's available_inventory" do - # test_movie = movies(:one) - # initial_inventory = test_movie.available_inventory - # - # customer_movie_info = { - # customer_id: (customers(:one)).id, - # movie_id: test_movie.id - # } - # - # post rental_path(customer_movie_info) - # # movie2 = Movie.find_by(id: movies(:one).id) - # # binding.pry - # - # test_movie.available_inventory.must_equal (initial_inventory - 1) - # end + it "decrements the movie's available_inventory" do + test_movie = movies(:one) + initial_inventory = test_movie.available_inventory + + customer_movie_info = { + customer_id: (customers(:one)).id, + movie_id: test_movie.id + } + + post rental_path(customer_movie_info) + # movie2 = Movie.find_by(id: movies(:one).id) + # binding.pry + + Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) + end end describe "update" do diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index d5d7ac944..3eba040e8 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -48,6 +48,7 @@ movie.available_inventory = 6 movie.valid?.must_equal false + movie.errors.messages.must_include :available_inventory end end @@ -77,7 +78,6 @@ available = movie.available_inventory Movie.increment(movie) - binding.pry movie.available_inventory.must_equal (available) end end From 406466b799ac3bad5fac1f7e66e8ea9263007439 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 9 May 2018 15:50:06 -0700 Subject: [PATCH 26/49] many nominal tests passing --- app/models/movie.rb | 1 + test/controllers/rentals_controller_test.rb | 42 ++++++++------------- test/fixtures/rentals.yml | 4 ++ 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index daf4cb5c7..cb5af71d3 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -32,6 +32,7 @@ def self.increment(movie) if movie && movie.available_inventory < movie.inventory movie.available_inventory += 1 + movie.save else # return movie.errors.messages end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 7625af5a3..5a61df067 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -48,9 +48,6 @@ } post rental_path(customer_movie_info) - # movie2 = Movie.find_by(id: movies(:one).id) - # binding.pry - Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) end end @@ -67,38 +64,29 @@ end it "returns json" do - customer_movie_info = { - customer_id: customers(:one).id, - movie_id: movies(:one).id - } - post rental_path(customer_movie_info) + rental = rentals(:one) + post rental_update_path(rental.id) response.header['Content-Type'].must_include 'json' end it "returns the correct rental" do - # customer_movie_info = { - # customer_id: customers(:two).id, - # movie_id: movies(:one).id - # } - # post rental_path(customer_movie_info) - # - # body = JSON.parse(response.body) - # body.length.must_equal 1 - # body["id"].must_equal Rental.last.id + rental = rentals(:one) + post rental_update_path(rental.id) + + body = JSON.parse(response.body) + body.length.must_equal 1 + body["id"].must_equal rental.id end it "increments the movie's available_inventory" do - movie = movies(:two) - starting_available_inventory = movie.available_inventory - - # customer_movie_info = { - # customer_id: customers(:one).id, - # movie_id: movie.id - # } - # post rental_path(customer_movie_info) - # - # movie.available_inventory.must_equal (starting_available_inventory + 1) + test_movie = movies(:two) + starting_available_inventory = test_movie.available_inventory + + rental = rentals(:two) + + post rental_update_path(rental.id) + Movie.find(test_movie.id).available_inventory.must_equal (starting_available_inventory + 1) end end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index d893e5bc4..ad14e69aa 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -3,3 +3,7 @@ one: customer: one movie: one + +two: + customer: one + movie: two From 8ec5286de2d8929a074c6c9e1f0f3702527a989d Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 15:56:45 -0700 Subject: [PATCH 27/49] added column to customers tracking movie rental count, reseeded data, with new column set to 0 --- ...180509225420_add_movies_checked_out_count_to_customer.rb | 5 +++++ db/schema.rb | 3 ++- db/seeds.rb | 6 ++++-- 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20180509225420_add_movies_checked_out_count_to_customer.rb diff --git a/db/migrate/20180509225420_add_movies_checked_out_count_to_customer.rb b/db/migrate/20180509225420_add_movies_checked_out_count_to_customer.rb new file mode 100644 index 000000000..2386cebe0 --- /dev/null +++ b/db/migrate/20180509225420_add_movies_checked_out_count_to_customer.rb @@ -0,0 +1,5 @@ +class AddMoviesCheckedOutCountToCustomer < ActiveRecord::Migration[5.1] + def change + add_column :customers, :movies_checked_out_count, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 7a03b4e44..65dab880a 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: 20180509165325) do +ActiveRecord::Schema.define(version: 20180509225420) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -25,6 +25,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "registered_at" + t.integer "movies_checked_out_count" end create_table "movies", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index 50b3a8f64..d0f2949b7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,9 +1,11 @@ JSON.parse(File.read('db/seeds/customers.json')).each do |customer| - Customer.create!(customer) + new_customer = Customer.create!(customer) + new_customer.movies_checked_out_count = 0 + new_customer.save end JSON.parse(File.read('db/seeds/movies.json')).each do |movie| new_movie = Movie.create!(movie) new_movie.available_inventory = new_movie.inventory - new_movie.save + new_movie.save end From 2e826d4de95b1911bd7d480363033e81c58bf133 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 16:09:58 -0700 Subject: [PATCH 28/49] updated movie show and index api outputs in code and tests --- app/controllers/movies_controller.rb | 4 ++-- test/controllers/movies_controller_test.rb | 11 ++++++++++- test/fixtures/customers.yml | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 1abb4951c..5eedc8ae5 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -2,14 +2,14 @@ class MoviesController < ApplicationController def index movies = Movie.all - render json:movies.as_json(only: [:title, :overview, :release_date, :inventory, :id, :available_inventory]), status: :ok + render json:movies.as_json(only: [:title, :release_date, :id]), status: :ok end def show movie = Movie.find_by(id: params[:id]) if movie - render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :id, :available_inventory]), status: :ok + render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok else render json: {ok: false}, status: :not_found end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 3b6b4a14c..e0dc859fc 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -38,7 +38,7 @@ it "returns movies with exactly the required fields" do - keys = %w(title overview release_date inventory id available_inventory) + keys = %w(title release_date id) get movies_url body = JSON.parse(response.body) @@ -54,6 +54,15 @@ must_respond_with :success end + it "returns movies with exactly the required fields" do + + keys = %w(title overview release_date inventory available_inventory) + get movie_path(movies(:two).id) + + body = JSON.parse(response.body) + body.keys.sort.must_equal keys.sort + end + it "responds with not_found if get a movie given invalid id" do movie = movies(:two) movie.destroy diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index 4c1867c84..3a188ced8 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -7,6 +7,7 @@ one: state: WA postal_code: 98145 phone: 123-123-1234 + movies_checked_out_count: 0 two: name: Billy @@ -15,3 +16,4 @@ two: state: CA postal_code: 98245 phone: 321-321-4321 + movies_checked_out_count: 0 From e5ae520df6460ec469699b0132cbb85390e943c0 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 16:15:04 -0700 Subject: [PATCH 29/49] updated api show json for customers to reflect wave requirements, updated tests failed then passing --- app/controllers/customers_controller.rb | 2 +- test/controllers/customers_controller_test.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index e42ffc019..67072f82d 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -3,7 +3,7 @@ class CustomersController < ApplicationController def index customers = Customer.all - render json: customers.as_json(only: [:address, :city, :id, :name, :phone, :postal_code, :registered_at]), status: :ok + render json: customers.as_json(only: [ :id, :name, :phone, :postal_code, :registered_at, :movies_checked_out_count]), status: :ok # what if no customers end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 3fca5a212..72c35a07e 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -26,8 +26,8 @@ body.length.must_equal Customer.count end - it "customers must have names and phone nums" do - keys = %w(address city id name phone postal_code registered_at) + it "customers must have requisite info" do + keys = %w(id name phone postal_code registered_at movies_checked_out_count) get customers_url body = JSON.parse(response.body) body.each do |customer| From 19f7e183bada9e7f23bb354842d2d9c6a6e7b1a4 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 9 May 2018 16:20:23 -0700 Subject: [PATCH 30/49] updated body response for creating a movie in api and testing --- app/controllers/movies_controller.rb | 2 +- test/controllers/movies_controller_test.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 5eedc8ae5..725c40c21 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -19,7 +19,7 @@ def create movie = Movie.new(movie_params) if movie.save - render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :id]), status: :ok + render json:movie.as_json(only: [:id]), status: :ok else render json: {ok: false, errors: movie.errors}, status: :bad_request end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index e0dc859fc..143ab9873 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -88,6 +88,10 @@ }.must_change "Movie.count", 1 must_respond_with :success + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body["id"].must_equal Movie.last.id + end it "returns a bad request for a bad params data" do From 1fbcdbfb379285bf6cc1a3d95175fc448de73e44 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 9 May 2018 16:26:13 -0700 Subject: [PATCH 31/49] post checkout route updated --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 53aa92a6d..0510821ef 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,7 @@ #movies_controller resources :movies, only:[:index, :show, :create] - post 'rentals/check-out/:movie_id/:customer_id', to: 'rentals#create', as: 'rental' + post 'rentals/check-out', to: 'rentals#create', as: 'rental' post 'rentals/check-in/:rental_id', to: 'rentals#update', as: 'rental_update' From 31051b97157c642e6c2c849dfaace4f4a4e86f8f Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 9 May 2018 17:13:06 -0700 Subject: [PATCH 32/49] all postman tests pass but one --- app/controllers/rentals_controller.rb | 28 ++++++++++++++++++--------- app/models/movie.rb | 2 +- config/routes.rb | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 88ed59027..6027ff15e 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -25,20 +25,30 @@ def create end def update - rental = Rental.find_by(id: params[:rental_id]) + rental_movie = Movie.find_by(id: params[:movie_id]) - if rental - today = Date.today.to_s - rental.check_in_date = today - rental.save - - Movie.increment(rental.movie) - render json: {id: rental.id}, status: :ok + if rental_movie + Movie.increment(rental_movie) + render json: {id: rental_movie.id}, status: :ok else - render json: {ok: false, errors: rental.errors}, status: :bad_request + render json: {ok: false, errors: rental_movie.errors}, status: :bad_request end end + # rental = Rental.find_by(id: params[:rental_id]) + # + # if rental + # today = Date.today.to_s + # rental.check_in_date = today + # rental.save + # + # Movie.increment(rental.movie) + # render json: {id: rental.id}, status: :ok + # else + # render json: {ok: false, errors: rental.errors}, status: :bad_request + # end + + private def rental_params diff --git a/app/models/movie.rb b/app/models/movie.rb index cb5af71d3..dfbdf5b77 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -4,7 +4,7 @@ class Movie < ApplicationRecord validates :title, :inventory, :available_inventory, presence: true - validates :inventory, numericality: {only_integer: true, greater_than: 0} + validates :inventory, numericality: {only_integer: true, greater_than_or_equal_to: 0} validates :available_inventory, numericality: { only_integer: true, greater_than: 0} diff --git a/config/routes.rb b/config/routes.rb index 0510821ef..30276cbee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,6 @@ post 'rentals/check-out', to: 'rentals#create', as: 'rental' - post 'rentals/check-in/:rental_id', to: 'rentals#update', as: 'rental_update' + post 'rentals/check-in', to: 'rentals#update', as: 'rental_update' end From 157a2ea7e95ff6da378646841f278d9da6f0a92a Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 9 May 2018 17:30:09 -0700 Subject: [PATCH 33/49] rental controller tests updated and passing --- test/controllers/rentals_controller_test.rb | 35 +++++++++++++++------ 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 5a61df067..17690a046 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -57,22 +57,35 @@ rental_count = Rental.all.count rental = rentals(:one) - post rental_update_path(rental.id) + data = { + customer_id: rental.customer.id, + movie_id: rental.movie.id} + + post rental_update_path(data) must_respond_with :success - Rental.all.count.must_equal rental_count + Rental.count.must_equal rental_count end it "returns json" do rental = rentals(:one) - post rental_update_path(rental.id) + post rental_update_path( + { + customer_id: rental.customer.id, + movie_id: rental.movie.id} + ) response.header['Content-Type'].must_include 'json' end it "returns the correct rental" do rental = rentals(:one) - post rental_update_path(rental.id) + + post rental_update_path( + { + customer_id: rental.customer.id, + movie_id: rental.movie.id} + ) body = JSON.parse(response.body) body.length.must_equal 1 @@ -80,13 +93,17 @@ end it "increments the movie's available_inventory" do - test_movie = movies(:two) - starting_available_inventory = test_movie.available_inventory - rental = rentals(:two) - post rental_update_path(rental.id) - Movie.find(test_movie.id).available_inventory.must_equal (starting_available_inventory + 1) + starting_available_inventory = rental.movie.available_inventory + + post rental_update_path( + { + customer_id: rental.customer.id, + movie_id: rental.movie.id} + ) + + Movie.find(rental.movie.id).available_inventory.must_equal (starting_available_inventory + 1) end end From 0d9e083fd59b87e8a8fc77a4e5a0e0cdfcfdd38f Mon Sep 17 00:00:00 2001 From: Abiaina Date: Thu, 10 May 2018 20:38:44 -0700 Subject: [PATCH 34/49] created and passed edge cases for rental controller create action --- .DS_Store | Bin 0 -> 6148 bytes test/controllers/rentals_controller_test.rb | 40 ++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c3ac046f6c51a2cd4bc2df32c603e493458c382e GIT binary patch literal 6148 zcmeH~F^{dt=u>Bl;zddfqZjB=JE!l7EiIwCR znHYd=e=Zwf1hAw#vGy=AV?N-4FWm9?zTD5J+wJN_+D8XGrH`2G=e8gPq<|EV0#ZN< z%t(Pe#+RQndL})J6p#Y*P{6+rh3>4$))}7;h8O|Jf#oo+W0oL`7s#4yovhF-rw7Yc zi!sFO(N31Ut|nV&Z-?dZVR>isDTZdf9afmotOgXMfE1W0u;}^d=l`Dm-~2ymQ7Q$b zz?&&x!|t%#@}=@@{quTWKW5d}jZVhp3{O7+O#CQb(Zjf3d_mS^>tuzdAAyiTK?=N7 FfnTX=61e~X literal 0 HcmV?d00001 diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 17690a046..83fc8b2fc 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -50,6 +50,46 @@ post rental_path(customer_movie_info) Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) end + + describe "Invalid rental responses" do + + it "create rental returns a status of bad_request for invalid movie id" do + test_movie = movies(:one) + + customer_movie_info = { + customer_id: nil, + movie_id: test_movie.id + } + + post rental_path(customer_movie_info) + must_respond_with :bad_request + end + + it "create rental returns a status of bad_request for invalid customer id" do + + customer_movie_info = { + customer_id: (customers(:one)).id, + movie_id: nil + } + + post rental_path(customer_movie_info) + must_respond_with :bad_request + end + + it "create rental for invalid customer id does not decrement available_inventory" do + test_movie = movies(:one) + + initial_inventory = test_movie.available_inventory + + customer_movie_info = { + customer_id: nil, + movie_id: test_movie.id + } + + post rental_path(customer_movie_info) + Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory) + end + end end describe "update" do From 8c19caf65e0bcdef9e2e897067e3816c176f1dd0 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Thu, 10 May 2018 21:34:50 -0700 Subject: [PATCH 35/49] added more tests in rentals controller and updated rental controller to send more requests for invalid rentals and confirm movie can be rented --- app/controllers/rentals_controller.rb | 72 +++++++++++++-------- test/controllers/rentals_controller_test.rb | 16 +++++ test/fixtures/movies.yml | 7 ++ 3 files changed, 67 insertions(+), 28 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 6027ff15e..8cb99f93f 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -3,31 +3,47 @@ class RentalsController < ApplicationController def create - chosen_movie = Movie.find_by(id: params[:movie_id]) - today = Date.today + movie_id_params = params[:movie_id] + customer_id_params = params[:customer_id] - rental_data = { - movie_id: params[:movie_id], - customer_id: params[:customer_id], - check_out_date: today.to_s, - due_date: (today + 7).to_s - } + chosen_movie = Movie.find_by(id: movie_id_params) + today = Date.today - rental = Rental.new(rental_data) + rental_data = { + movie_id: movie_id_params, + customer_id: customer_id_params, + check_out_date: today.to_s, + due_date: (today + 7).to_s + } - if rental.save - Movie.decrement(chosen_movie) - render json: {id: rental.id}, status: :ok - else - render json: {ok: false, errors: rental.errors}, status: :bad_request - end + rental = Rental.new(rental_data) + + # I added this check to confirm that the movie is available to save before we make a new rental + # called the movie.available_movie? to + + if movie_id_params.nil? || customer_id_params.nil? + # this renders multiple times so I commented it out + # I'm unsure why its rendering multiple times + # I set this up to send a bad request/not_found for nil values for ids in params and also test if movie can be rented + + # render json: {ok: false }, status: :not_found + else + chosen_movie = Movie.available_movie?(chosen_movie.id) + end + + if chosen_movie && rental.save + Movie.decrement(chosen_movie) + render json: {id: rental.id}, status: :ok + else + render json: {ok: false, errors: rental.errors}, status: :bad_request + end end def update rental_movie = Movie.find_by(id: params[:movie_id]) - if rental_movie + if rental_movie Movie.increment(rental_movie) render json: {id: rental_movie.id}, status: :ok else @@ -35,18 +51,18 @@ def update end end - # rental = Rental.find_by(id: params[:rental_id]) - # - # if rental - # today = Date.today.to_s - # rental.check_in_date = today - # rental.save - # - # Movie.increment(rental.movie) - # render json: {id: rental.id}, status: :ok - # else - # render json: {ok: false, errors: rental.errors}, status: :bad_request - # end + # rental = Rental.find_by(id: params[:rental_id]) + # + # if rental + # today = Date.today.to_s + # rental.check_in_date = today + # rental.save + # + # Movie.increment(rental.movie) + # render json: {id: rental.id}, status: :ok + # else + # render json: {ok: false, errors: rental.errors}, status: :bad_request + # end private diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 83fc8b2fc..9ce4870b7 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -51,6 +51,7 @@ Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) end + # should we also add the json response for a bad request as well? describe "Invalid rental responses" do it "create rental returns a status of bad_request for invalid movie id" do @@ -89,6 +90,21 @@ post rental_path(customer_movie_info) Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory) end + + it "cannot rent movie with available_inventory of 0, :bad_request response, does not decrement available_inventory" do + test_movie = movies(:three) + + test_movie.available_inventory.must_equal 0 + + customer_movie_info = { + customer_id: (customers(:one)).id, + movie_id: test_movie.id + } + + post rental_path(customer_movie_info) + must_respond_with :bad_request + Movie.find(test_movie.id).available_inventory.must_equal 0 + end end end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index b6785ca27..ec28896a8 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -13,3 +13,10 @@ two: release_date: "2015-08-08" inventory: 5 available_inventory: 4 + +three: + title: Men in black more popular + overview: willenium + release_date: "2005-08-08" + inventory: 3 + available_inventory: 0 From cb3ef1f70ad99510f7b99683e4b942d64c62b0f2 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Thu, 10 May 2018 21:51:07 -0700 Subject: [PATCH 36/49] removed update controller test line passing customer id in params, this code does not test anything in update action --- test/controllers/rentals_controller_test.rb | 44 +++++++++++++++------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 9ce4870b7..71f7ed444 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -113,9 +113,7 @@ rental_count = Rental.all.count rental = rentals(:one) - data = { - customer_id: rental.customer.id, - movie_id: rental.movie.id} + data = {movie_id: rental.movie.id} post rental_update_path(data) @@ -127,9 +125,7 @@ rental = rentals(:one) post rental_update_path( - { - customer_id: rental.customer.id, - movie_id: rental.movie.id} + {movie_id: rental.movie.id} ) response.header['Content-Type'].must_include 'json' end @@ -138,9 +134,7 @@ rental = rentals(:one) post rental_update_path( - { - customer_id: rental.customer.id, - movie_id: rental.movie.id} + {movie_id: rental.movie.id} ) body = JSON.parse(response.body) @@ -154,13 +148,39 @@ starting_available_inventory = rental.movie.available_inventory post rental_update_path( - { - customer_id: rental.customer.id, - movie_id: rental.movie.id} + {movie_id: rental.movie.id} ) Movie.find(rental.movie.id).available_inventory.must_equal (starting_available_inventory + 1) end + + describe "Invalid update requests" do + + it "update rental returns a status of bad_request for invalid movie id" do + # rental_count = Rental.all.count + # rental = rentals(:one) + # + # data = { + # movie_id: nil} + # + # post rental_update_path(data) + # + # must_respond_with :success + # Rental.count.must_equal rental_count + end + + it "update rental returns a status of bad_request for invalid customer id" do + + end + + it "update rental for invalid customer id does not decrement available_inventory" do + + end + + it "cannot update rental movie with available_inventory == inventory, responds :bad_request response, does not increment available_inventory" do + + end + end end end From 402fc539862a41d0e6788b00b10d8a5ed2ab8f3c Mon Sep 17 00:00:00 2001 From: Abiaina Date: Thu, 10 May 2018 22:19:19 -0700 Subject: [PATCH 37/49] added edge case testing upate action, need to update update controller method for rental to pass new test --- app/controllers/rentals_controller.rb | 13 +++++- test/controllers/rentals_controller_test.rb | 52 +++++++++++++++------ test/fixtures/movies.yml | 7 +++ 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 8cb99f93f..6fe18a0fe 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -25,7 +25,7 @@ def create # this renders multiple times so I commented it out # I'm unsure why its rendering multiple times # I set this up to send a bad request/not_found for nil values for ids in params and also test if movie can be rented - + # render json: {ok: false }, status: :not_found else chosen_movie = Movie.available_movie?(chosen_movie.id) @@ -41,11 +41,20 @@ def create end def update - rental_movie = Movie.find_by(id: params[:movie_id]) + # changed the test to return not_found and account for nil passed in params and invalid id passed in params + + if params[:movie_id].nil? + # accounts for nil value and only sends a single bad render status + rental_movie = nil + else + rental_movie = Movie.find_by(id: params[:movie_id]) + end if rental_movie Movie.increment(rental_movie) render json: {id: rental_movie.id}, status: :ok + elsif rental_movie.nil? + render json: {ok: false}, status: :bad_request else render json: {ok: false, errors: rental_movie.errors}, status: :bad_request end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 71f7ed444..e8b1b5c59 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -156,29 +156,51 @@ describe "Invalid update requests" do - it "update rental returns a status of bad_request for invalid movie id" do - # rental_count = Rental.all.count - # rental = rentals(:one) - # - # data = { - # movie_id: nil} - # - # post rental_update_path(data) - # - # must_respond_with :success - # Rental.count.must_equal rental_count - end + it "update rental returns a status of bad_request for nil movie id value" do + rental_count = Rental.all.count + rental = rentals(:one) + + data = { + movie_id: nil} - it "update rental returns a status of bad_request for invalid customer id" do + post rental_update_path(data) + must_respond_with :bad_request + Rental.count.must_equal rental_count end - it "update rental for invalid customer id does not decrement available_inventory" do + it "update rental returns a status of bad_request for invalid movie id value" do + rental_count = Rental.all.count + rental = rentals(:one) + + data = { + movie_id: -999} + post rental_update_path(data) + + must_respond_with :bad_request + Rental.count.must_equal rental_count end - it "cannot update rental movie with available_inventory == inventory, responds :bad_request response, does not increment available_inventory" do + it "cannot update rental movie with available_inventory == inventory" do + + rental_count = Rental.all.count + rental = rentals(:one) + movie = movies(:four) + movie.available_inventory.must_equal movie.inventory + + initial_inventory = movie.available_inventory + + data = { + movie_id: movie.id + } + + post rental_update_path(data) + + must_respond_with :bad_request + Rental.count.must_equal rental_count + movie.available_inventory.must_equal initial_inventory end end end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index ec28896a8..a5baf3c2b 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -20,3 +20,10 @@ three: release_date: "2005-08-08" inventory: 3 available_inventory: 0 + +four: + title: Fresher Princess + overview: Willenium Independence + release_date: "2005-08-08" + inventory: 3 + available_inventory: 3 From 41e18c2aed1827e1252163a23c0588fa337c00ca Mon Sep 17 00:00:00 2001 From: Abiaina Date: Thu, 10 May 2018 23:51:27 -0700 Subject: [PATCH 38/49] attempted to pass update edge case with nil movie , make model method to confirm video can be renturned --- app/controllers/rentals_controller.rb | 10 ++++-- app/models/movie.rb | 17 +++++++++- test/controllers/rentals_controller_test.rb | 37 +++++++++++---------- test/fixtures/rentals.yml | 1 + 4 files changed, 44 insertions(+), 21 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 6fe18a0fe..d53079052 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -19,7 +19,7 @@ def create rental = Rental.new(rental_data) # I added this check to confirm that the movie is available to save before we make a new rental - # called the movie.available_movie? to + # called the movie.rentable_movie? to if movie_id_params.nil? || customer_id_params.nil? # this renders multiple times so I commented it out @@ -28,7 +28,7 @@ def create # render json: {ok: false }, status: :not_found else - chosen_movie = Movie.available_movie?(chosen_movie.id) + chosen_movie = Movie.rentable_movie?(chosen_movie.id) end if chosen_movie && rental.save @@ -47,7 +47,9 @@ def update # accounts for nil value and only sends a single bad render status rental_movie = nil else - rental_movie = Movie.find_by(id: params[:movie_id]) + rental_movie = Movie.returnable_movie?(params[:movie_id]) + + # rental_movie = Movie.find_by(id: params[:movie_id]) end if rental_movie @@ -56,6 +58,8 @@ def update elsif rental_movie.nil? render json: {ok: false}, status: :bad_request else + rental_movie = Movie.find_by(id: params[:movie_id]) + render json: {ok: false, errors: rental_movie.errors}, status: :bad_request end end diff --git a/app/models/movie.rb b/app/models/movie.rb index dfbdf5b77..4ee2afbc4 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -38,7 +38,7 @@ def self.increment(movie) end end - def self.available_movie?(id) + def self.rentable_movie?(id) movie = false if Movie.find_by(id: id) @@ -53,4 +53,19 @@ def self.available_movie?(id) return movie end + def self.returnable_movie?(id) + movie = false + + if Movie.find_by(id: id) + + movie = Movie.find_by(id: id) + + if movie.available_inventory == movie.inventory + movie = false + end + end + + return movie + end + end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index e8b1b5c59..292165c87 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -111,9 +111,12 @@ describe "update" do it "it is a real, working route" do rental_count = Rental.all.count - rental = rentals(:one) - data = {movie_id: rental.movie.id} + # removed rental because it is not used in the code we are testing + # used movie :two b/c movie :one is invalid rental update (cant return fully stocked movie) + movie = movies(:two) + + data = {movie_id: movie.id} post rental_update_path(data) @@ -122,43 +125,45 @@ end it "returns json" do - rental = rentals(:one) + movie = movies(:two) post rental_update_path( - {movie_id: rental.movie.id} + {movie_id: movie.id} ) response.header['Content-Type'].must_include 'json' end it "returns the correct rental" do - rental = rentals(:one) + movie = movies(:two) post rental_update_path( - {movie_id: rental.movie.id} + {movie_id: movie.id} ) body = JSON.parse(response.body) - body.length.must_equal 1 - body["id"].must_equal rental.id + # is this necessary? + # should we return the rental? + # current code returns the movie by movie id not rental id + # body.length.must_equal 1 + # body["id"].must_equal rental.id end it "increments the movie's available_inventory" do - rental = rentals(:two) + movie = movies(:two) - starting_available_inventory = rental.movie.available_inventory + starting_available_inventory = movie.available_inventory post rental_update_path( - {movie_id: rental.movie.id} + {movie_id: movie.id} ) - Movie.find(rental.movie.id).available_inventory.must_equal (starting_available_inventory + 1) + Movie.find(movie.id).available_inventory.must_equal (starting_available_inventory + 1) end describe "Invalid update requests" do it "update rental returns a status of bad_request for nil movie id value" do rental_count = Rental.all.count - rental = rentals(:one) data = { movie_id: nil} @@ -171,7 +176,6 @@ it "update rental returns a status of bad_request for invalid movie id value" do rental_count = Rental.all.count - rental = rentals(:one) data = { movie_id: -999} @@ -179,13 +183,12 @@ post rental_update_path(data) must_respond_with :bad_request - Rental.count.must_equal rental_count + Rental.all.count.must_equal rental_count end it "cannot update rental movie with available_inventory == inventory" do rental_count = Rental.all.count - rental = rentals(:one) movie = movies(:four) movie.available_inventory.must_equal movie.inventory @@ -199,7 +202,7 @@ post rental_update_path(data) must_respond_with :bad_request - Rental.count.must_equal rental_count + Rental.all.count.must_equal rental_count movie.available_inventory.must_equal initial_inventory end end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index ad14e69aa..eb5858ff1 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -7,3 +7,4 @@ one: two: customer: one movie: two + From b668b00a3abdb097df543eae5158d2c6eb446ec3 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Fri, 11 May 2018 11:24:39 -0700 Subject: [PATCH 39/49] code to account for postman test that doesn't have available_inventory data --- app/controllers/movies_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 725c40c21..a0a7f1c50 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -18,6 +18,11 @@ def show def create movie = Movie.new(movie_params) + #adding this for movie create smoketest - because smoketest doesn't have :available_inventory + if movie[:available_inventory].nil? + movie[:available_inventory] = movie[:inventory] + end + if movie.save render json:movie.as_json(only: [:id]), status: :ok else From ddd08d17e75d2bf2ba468f29120dbbe4f6ee9648 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Fri, 11 May 2018 13:02:33 -0700 Subject: [PATCH 40/49] rental code adjustments - invalid create tests need attention --- app/controllers/rentals_controller.rb | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index d53079052..69ebb18f8 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -3,15 +3,25 @@ class RentalsController < ApplicationController def create - movie_id_params = params[:movie_id] - customer_id_params = params[:customer_id] + if params[:movie_id].nil? || params[:customer_id].nil? + # this renders multiple times so I commented it out + # I'm unsure why its rendering multiple times + # I set this up to send a bad request/not_found for nil values for ids in params and also test if movie can be rented + + render json: {ok: false }, status: :not_found + else + found_movie = Movie.find_by(id: params[:movie_id]) + chosen_movie = Movie.rentable_movie?(found_movie.id) + end - chosen_movie = Movie.find_by(id: movie_id_params) + # movie_id_params = params[:movie_id] + # customer_id_params = params[:customer_id] + # chosen_movie = Movie.find_by(id: movie_id_params) today = Date.today rental_data = { - movie_id: movie_id_params, - customer_id: customer_id_params, + movie_id: chosen_movie.id, + customer_id: params[:customer_id], check_out_date: today.to_s, due_date: (today + 7).to_s } @@ -21,15 +31,7 @@ def create # I added this check to confirm that the movie is available to save before we make a new rental # called the movie.rentable_movie? to - if movie_id_params.nil? || customer_id_params.nil? - # this renders multiple times so I commented it out - # I'm unsure why its rendering multiple times - # I set this up to send a bad request/not_found for nil values for ids in params and also test if movie can be rented - # render json: {ok: false }, status: :not_found - else - chosen_movie = Movie.rentable_movie?(chosen_movie.id) - end if chosen_movie && rental.save Movie.decrement(chosen_movie) From c045ad24d6c4795f8b23bcb4b579087e27ad154b Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Fri, 11 May 2018 13:28:21 -0700 Subject: [PATCH 41/49] customer add and remove movie functionaltiy and model tests --- app/controllers/rentals_controller.rb | 4 +++ app/models/customer.rb | 10 +++++++ test/models/customer_test.rb | 39 +++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 69ebb18f8..9a8f60d74 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -35,6 +35,8 @@ def create if chosen_movie && rental.save Movie.decrement(chosen_movie) + customer = Customer.find_by(id: params[:customer_id]) + customer.add_movie render json: {id: rental.id}, status: :ok else render json: {ok: false, errors: rental.errors}, status: :bad_request @@ -56,6 +58,8 @@ def update if rental_movie Movie.increment(rental_movie) + customer = Customer.find_by(id: params[:customer_id]) + customer.remove_movie render json: {id: rental_movie.id}, status: :ok elsif rental_movie.nil? render json: {ok: false}, status: :bad_request diff --git a/app/models/customer.rb b/app/models/customer.rb index 7b564620f..cbc240bbc 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,4 +1,14 @@ class Customer < ApplicationRecord validates :name, :phone, presence: true has_many :rentals + + def add_movie + self.movies_checked_out_count += 1 + self.save + end + + def remove_movie + self.movies_checked_out_count -= 1 + self.save + end end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index ba9263ded..bcad077e5 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -21,4 +21,43 @@ end end + describe "relations" do + it "must return an array" do + customer = customers(:one) + customer.rentals.count.must_equal 2 + end + + it "must return empty array if no rentals" do + customer = customers(:two) + customer.rentals.must_equal [] + end + + it "must respond when new rental created" do + #TODO + end + end + + describe "add_movie" do + it "increments movie count" do + customer = customers(:one) + customer.movies_checked_out_count.must_equal 0 + + customer.add_movie + customer.movies_checked_out_count.must_equal 1 + end + end + + describe "remove_movie" do + it "decrements movie count" do + customer = customers(:one) + customer.movies_checked_out_count.must_equal 0 + + customer.add_movie + customer.movies_checked_out_count.must_equal 1 + + customer.remove_movie + customer.movies_checked_out_count.must_equal 0 + end + end + end From 09cf8dab243caeee97183b09ec8e43ab52357e69 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Fri, 11 May 2018 13:35:57 -0700 Subject: [PATCH 42/49] rental controller tests passing, fixed errors in update and create actions --- app/controllers/rentals_controller.rb | 96 +++++++-------------- test/controllers/rentals_controller_test.rb | 24 +++--- 2 files changed, 41 insertions(+), 79 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 69ebb18f8..df21b5c9b 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -3,83 +3,45 @@ class RentalsController < ApplicationController def create - if params[:movie_id].nil? || params[:customer_id].nil? - # this renders multiple times so I commented it out - # I'm unsure why its rendering multiple times - # I set this up to send a bad request/not_found for nil values for ids in params and also test if movie can be rented - - render json: {ok: false }, status: :not_found - else - found_movie = Movie.find_by(id: params[:movie_id]) - chosen_movie = Movie.rentable_movie?(found_movie.id) - end - - # movie_id_params = params[:movie_id] - # customer_id_params = params[:customer_id] - # chosen_movie = Movie.find_by(id: movie_id_params) - today = Date.today - - rental_data = { - movie_id: chosen_movie.id, - customer_id: params[:customer_id], - check_out_date: today.to_s, - due_date: (today + 7).to_s - } - - rental = Rental.new(rental_data) - - # I added this check to confirm that the movie is available to save before we make a new rental - # called the movie.rentable_movie? to - - - - if chosen_movie && rental.save - Movie.decrement(chosen_movie) - render json: {id: rental.id}, status: :ok + if params[:movie_id].nil? || params[:customer_id].nil? || (Movie.find_by(id: params[:movie_id])).nil? + render json: {ok: false}, status: :not_found else - render json: {ok: false, errors: rental.errors}, status: :bad_request + movie = Movie.rentable_movie?(params[:movie_id]) + today = Date.today + + rental_data = { + movie_id: (params[:movie_id]), + customer_id: (params[:customer_id]), + check_out_date: today.to_s, + due_date: (today + 7).to_s + } + + rental = Rental.new(rental_data) + + if movie && rental.save + Movie.decrement(movie) + render json: {id: rental.id}, status: :ok + else + render json: {ok: false, errors: rental.errors}, status: :bad_request + end end - end def update - # changed the test to return not_found and account for nil passed in params and invalid id passed in params - - if params[:movie_id].nil? - # accounts for nil value and only sends a single bad render status - rental_movie = nil - else - rental_movie = Movie.returnable_movie?(params[:movie_id]) - - # rental_movie = Movie.find_by(id: params[:movie_id]) - end - - if rental_movie - Movie.increment(rental_movie) - render json: {id: rental_movie.id}, status: :ok - elsif rental_movie.nil? + if params[:movie_id].nil? || (Movie.find_by(id: params[:movie_id])).nil? render json: {ok: false}, status: :bad_request else - rental_movie = Movie.find_by(id: params[:movie_id]) - - render json: {ok: false, errors: rental_movie.errors}, status: :bad_request + rental_movie = Movie.returnable_movie?(Movie.find_by(id: params[:movie_id])) + + if rental_movie + Movie.increment(rental_movie) + render json: {id: rental_movie.id}, status: :ok + else + render json: {ok: false}, status: :bad_request + end end end - # rental = Rental.find_by(id: params[:rental_id]) - # - # if rental - # today = Date.today.to_s - # rental.check_in_date = today - # rental.save - # - # Movie.increment(rental.movie) - # render json: {id: rental.id}, status: :ok - # else - # render json: {ok: false, errors: rental.errors}, status: :bad_request - # end - - private def rental_params diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 292165c87..fef01139b 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -4,7 +4,7 @@ describe RentalsController do describe "create" do it "it is a real, working route" do - rental_count = Rental.all.count + rental_count = Rental.count customer_movie_info = { customer_id: customers(:one).id, @@ -13,7 +13,7 @@ post rental_path(customer_movie_info) must_respond_with :success - Rental.all.count.must_equal (rental_count + 1) + Rental.count.must_equal (rental_count + 1) end it "returns json" do @@ -54,7 +54,7 @@ # should we also add the json response for a bad request as well? describe "Invalid rental responses" do - it "create rental returns a status of bad_request for invalid movie id" do + it "create rental returns a status of not_found for invalid movie id" do test_movie = movies(:one) customer_movie_info = { @@ -63,10 +63,10 @@ } post rental_path(customer_movie_info) - must_respond_with :bad_request + must_respond_with :not_found end - it "create rental returns a status of bad_request for invalid customer id" do + it "create rental returns a status of not_found for invalid customer id" do customer_movie_info = { customer_id: (customers(:one)).id, @@ -74,7 +74,7 @@ } post rental_path(customer_movie_info) - must_respond_with :bad_request + must_respond_with :not_found end it "create rental for invalid customer id does not decrement available_inventory" do @@ -110,7 +110,7 @@ describe "update" do it "it is a real, working route" do - rental_count = Rental.all.count + rental_count = Rental.count # removed rental because it is not used in the code we are testing # used movie :two b/c movie :one is invalid rental update (cant return fully stocked movie) @@ -163,7 +163,7 @@ describe "Invalid update requests" do it "update rental returns a status of bad_request for nil movie id value" do - rental_count = Rental.all.count + rental_count = Rental.count data = { movie_id: nil} @@ -175,7 +175,7 @@ end it "update rental returns a status of bad_request for invalid movie id value" do - rental_count = Rental.all.count + rental_count = Rental.count data = { movie_id: -999} @@ -183,12 +183,12 @@ post rental_update_path(data) must_respond_with :bad_request - Rental.all.count.must_equal rental_count + Rental.count.must_equal rental_count end it "cannot update rental movie with available_inventory == inventory" do - rental_count = Rental.all.count + rental_count = Rental.count movie = movies(:four) movie.available_inventory.must_equal movie.inventory @@ -202,7 +202,7 @@ post rental_update_path(data) must_respond_with :bad_request - Rental.all.count.must_equal rental_count + Rental.count.must_equal rental_count movie.available_inventory.must_equal initial_inventory end end From d60f25e627e7fe0888ade6a729247d8cf668eed4 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Fri, 11 May 2018 13:43:31 -0700 Subject: [PATCH 43/49] added merge conflict missing info in customer update removie movie method --- app/controllers/rentals_controller.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index db4deae46..fc1bf0fee 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -34,10 +34,13 @@ def update render json: {ok: false}, status: :bad_request else rental_movie = Movie.returnable_movie?(Movie.find_by(id: params[:movie_id])) + customer = Customer.find_by(id: params[:customer_id]) if rental_movie Movie.increment(rental_movie) + customer.remove_movie render json: {id: rental_movie.id}, status: :ok + else render json: {ok: false}, status: :bad_request end From aee83b235c805b4e376351839af0e381aac18eeb Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Fri, 11 May 2018 15:03:07 -0700 Subject: [PATCH 44/49] tests fixed with charles; thank you; postman all pass --- app/controllers/rentals_controller.rb | 13 +++-- app/models/customer.rb | 12 ++--- app/models/movie.rb | 24 ++++----- test/controllers/rentals_controller_test.rb | 60 ++++++++++++++++----- test/fixtures/movies.yml | 7 +++ test/models/customer_test.rb | 6 +-- 6 files changed, 80 insertions(+), 42 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index fc1bf0fee..e69e16e47 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -7,6 +7,7 @@ def create render json: {ok: false}, status: :not_found else movie = Movie.rentable_movie?(params[:movie_id]) + customer = Customer.find_by(id: params[:customer_id]) today = Date.today rental_data = { @@ -16,12 +17,14 @@ def create due_date: (today + 7).to_s } - rental = Rental.new(rental_data) + if movie + rental = Rental.new(rental_data) + end if movie && rental.save Movie.decrement(movie) - customer = Customer.find_by(id: params[:customer_id]) - customer.add_movie + Customer.add_movie(customer) + render json: {id: rental.id}, status: :ok else render json: {ok: false, errors: rental.errors}, status: :bad_request @@ -29,6 +32,7 @@ def create end end + def update if params[:movie_id].nil? || (Movie.find_by(id: params[:movie_id])).nil? || params[:customer_id].nil? || (Customer.find_by(id: params[:customer_id])).nil? render json: {ok: false}, status: :bad_request @@ -38,9 +42,8 @@ def update if rental_movie Movie.increment(rental_movie) - customer.remove_movie + Customer.remove_movie(customer) render json: {id: rental_movie.id}, status: :ok - else render json: {ok: false}, status: :bad_request end diff --git a/app/models/customer.rb b/app/models/customer.rb index cbc240bbc..9e4c9213d 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -2,13 +2,13 @@ class Customer < ApplicationRecord validates :name, :phone, presence: true has_many :rentals - def add_movie - self.movies_checked_out_count += 1 - self.save + def self.add_movie(customer) + customer.movies_checked_out_count += 1 + customer.save end - def remove_movie - self.movies_checked_out_count -= 1 - self.save + def self.remove_movie(customer) + customer.movies_checked_out_count -= 1 + customer.save end end diff --git a/app/models/movie.rb b/app/models/movie.rb index 4ee2afbc4..54c6cdaed 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -6,7 +6,7 @@ class Movie < ApplicationRecord validates :inventory, numericality: {only_integer: true, greater_than_or_equal_to: 0} - validates :available_inventory, numericality: { only_integer: true, greater_than: 0} + validates :available_inventory, numericality: { only_integer: true, greater_than_or_equal_to: 0} validate :available_inventory_cannot_exceed_inventory @@ -19,36 +19,30 @@ def available_inventory_cannot_exceed_inventory end def self.decrement(movie) - - if movie && movie.available_inventory > 0 + if movie.available_inventory > 0 movie.available_inventory -= 1 movie.save - else - # figure out how we will process invalid requests end end def self.increment(movie) - - if movie && movie.available_inventory < movie.inventory + if movie.available_inventory < movie.inventory movie.available_inventory += 1 movie.save - else - # return movie.errors.messages end end def self.rentable_movie?(id) - movie = false - - if Movie.find_by(id: id) - + # movie = false + # + # if Movie.find_by(id: id) + # movie = Movie.find_by(id: id) - if movie.available_inventory <= 0 + if movie.available_inventory < 1 movie = false end - end + # end return movie end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index fef01139b..d70af56d6 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require 'pry' describe RentalsController do describe "create" do @@ -51,6 +50,19 @@ Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) end + it "decrements the movie's available_inventory when available_inventory is 1" do + test_movie = movies(:five) + initial_inventory = test_movie.available_inventory + + customer_movie_info = { + customer_id: (customers(:one)).id, + movie_id: test_movie.id + } + + post rental_path(customer_movie_info) + Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) + end + # should we also add the json response for a bad request as well? describe "Invalid rental responses" do @@ -105,6 +117,17 @@ must_respond_with :bad_request Movie.find(test_movie.id).available_inventory.must_equal 0 end + + it "increments customer's checked out count" do + movie = movies(:two) + customer = customers(:one) + customer.movies_checked_out_count.must_equal 0 + data = {movie_id: movie.id, customer_id: customer.id} + + post rental_path(data) + customer.reload + customer.movies_checked_out_count.must_equal 1 + end end end @@ -115,8 +138,9 @@ # removed rental because it is not used in the code we are testing # used movie :two b/c movie :one is invalid rental update (cant return fully stocked movie) movie = movies(:two) + customer = customers(:two) - data = {movie_id: movie.id} + data = {movie_id: movie.id, customer_id: customer.id} post rental_update_path(data) @@ -135,31 +159,41 @@ it "returns the correct rental" do movie = movies(:two) + customer = customers(:two) + data = {movie_id: movie.id, customer_id: customer.id} - post rental_update_path( - {movie_id: movie.id} - ) + post rental_update_path(data) body = JSON.parse(response.body) - # is this necessary? - # should we return the rental? - # current code returns the movie by movie id not rental id - # body.length.must_equal 1 - # body["id"].must_equal rental.id end it "increments the movie's available_inventory" do movie = movies(:two) + customer = customers(:two) + data = {movie_id: movie.id, customer_id: customer.id} starting_available_inventory = movie.available_inventory - post rental_update_path( - {movie_id: movie.id} - ) + post rental_update_path(data) Movie.find(movie.id).available_inventory.must_equal (starting_available_inventory + 1) end + it "decrement customer's checked out count" do + movie = movies(:two) + customer = customers(:one) + customer.movies_checked_out_count.must_equal 0 + data = {movie_id: movie.id, customer_id: customer.id} + + post rental_path(data) + customer.reload + customer.movies_checked_out_count.must_equal 1 + + post rental_update_path(data) + customer.reload + customer.movies_checked_out_count.must_equal 0 + end + describe "Invalid update requests" do it "update rental returns a status of bad_request for nil movie id value" do diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index a5baf3c2b..2ab3864e1 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -27,3 +27,10 @@ four: release_date: "2005-08-08" inventory: 3 available_inventory: 3 + +five: + title: Fresher Princess + overview: Willenium Independence + release_date: "2005-08-08" + inventory: 1 + available_inventory: 1 diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index bcad077e5..5dbb99b4d 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -42,7 +42,7 @@ customer = customers(:one) customer.movies_checked_out_count.must_equal 0 - customer.add_movie + Customer.add_movie(customer) customer.movies_checked_out_count.must_equal 1 end end @@ -52,10 +52,10 @@ customer = customers(:one) customer.movies_checked_out_count.must_equal 0 - customer.add_movie + Customer.add_movie(customer) customer.movies_checked_out_count.must_equal 1 - customer.remove_movie + Customer.remove_movie(customer) customer.movies_checked_out_count.must_equal 0 end end From a88dc650a92e02e59b5e8766046bce5b3e3855f0 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Fri, 11 May 2018 15:20:04 -0700 Subject: [PATCH 45/49] reworded update rental test --- app/controllers/movies_controller.rb | 2 +- test/controllers/rentals_controller_test.rb | 93 ++++++++++----------- test/models/rental_test.rb | 79 +---------------- 3 files changed, 48 insertions(+), 126 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index a0a7f1c50..97156eea4 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -9,7 +9,7 @@ def show movie = Movie.find_by(id: params[:id]) if movie - render json:movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok + render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok else render json: {ok: false}, status: :not_found end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index d70af56d6..f5bba5690 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -105,11 +105,10 @@ it "cannot rent movie with available_inventory of 0, :bad_request response, does not decrement available_inventory" do test_movie = movies(:three) - test_movie.available_inventory.must_equal 0 customer_movie_info = { - customer_id: (customers(:one)).id, + customer_id: customers(:one).id, movie_id: test_movie.id } @@ -132,70 +131,70 @@ end describe "update" do - it "it is a real, working route" do - rental_count = Rental.count + describe "valid update requests" do + it "it is a real, working route" do + rental_count = Rental.count - # removed rental because it is not used in the code we are testing - # used movie :two b/c movie :one is invalid rental update (cant return fully stocked movie) - movie = movies(:two) - customer = customers(:two) + movie = movies(:two) + customer = customers(:two) - data = {movie_id: movie.id, customer_id: customer.id} + data = {movie_id: movie.id, customer_id: customer.id} - post rental_update_path(data) + post rental_update_path(data) - must_respond_with :success - Rental.count.must_equal rental_count - end + must_respond_with :success + Rental.count.must_equal rental_count + end - it "returns json" do - movie = movies(:two) + it "returns json" do + movie = movies(:two) - post rental_update_path( - {movie_id: movie.id} - ) - response.header['Content-Type'].must_include 'json' - end + post rental_update_path( + {movie_id: movie.id} + ) + response.header['Content-Type'].must_include 'json' + end - it "returns the correct rental" do - movie = movies(:two) - customer = customers(:two) - data = {movie_id: movie.id, customer_id: customer.id} + it "returns the correct rental's movie id" do + movie = movies(:two) + customer = customers(:two) + data = {movie_id: movie.id, customer_id: customer.id} - post rental_update_path(data) + post rental_update_path(data) - body = JSON.parse(response.body) - end + body = JSON.parse(response.body) + body["id"].must_equal movie.id + end - it "increments the movie's available_inventory" do - movie = movies(:two) - customer = customers(:two) - data = {movie_id: movie.id, customer_id: customer.id} + it "increments the movie's available_inventory" do + movie = movies(:two) + customer = customers(:two) + data = {movie_id: movie.id, customer_id: customer.id} - starting_available_inventory = movie.available_inventory + starting_available_inventory = movie.available_inventory - post rental_update_path(data) + post rental_update_path(data) - Movie.find(movie.id).available_inventory.must_equal (starting_available_inventory + 1) - end + Movie.find(movie.id).available_inventory.must_equal (starting_available_inventory + 1) + end - it "decrement customer's checked out count" do - movie = movies(:two) - customer = customers(:one) - customer.movies_checked_out_count.must_equal 0 - data = {movie_id: movie.id, customer_id: customer.id} + it "decrement customer's checked out count" do + movie = movies(:two) + customer = customers(:one) + customer.movies_checked_out_count.must_equal 0 + data = {movie_id: movie.id, customer_id: customer.id} - post rental_path(data) - customer.reload - customer.movies_checked_out_count.must_equal 1 + post rental_path(data) + customer.reload + customer.movies_checked_out_count.must_equal 1 - post rental_update_path(data) - customer.reload - customer.movies_checked_out_count.must_equal 0 + post rental_update_path(data) + customer.reload + customer.movies_checked_out_count.must_equal 0 + end end describe "Invalid update requests" do - it "update rental returns a status of bad_request for nil movie id value" do rental_count = Rental.count diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 240689bf4..1aaa34cca 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -51,7 +51,7 @@ rental.due_date = (Date.today + 7).to_s rental.save end - + it "must respond to movie" do rental = rentals(:one) rental.movie.must_equal movies(:one) @@ -63,81 +63,4 @@ end end - - - - # describe "Valid?" do - # it "must be valid" do - # - # rental_data = { - # customer_id: (customers(:one)).id, - # movie_id: (movies(:one)).id, - # check_out_date: Date.today.to_s, - # due_date: (Date.today + 7).to_s - # } - # - # rental = Rental.new(rental_data) - # - # rental.save - # - # rental.valid?.must_equal true - # end - # - # it "must have check_out_date" do - # - # rental_data = { - # customer_id: (customers(:one)).id, - # movie_id: (movies(:one)).id, - # check_out_date: nil, - # due_date: (Date.today + 7).to_s - # } - # - # rental = Rental.create(rental_data) - # - # rental.valid?.must_equal false - # end - # - # it "must have movie_id" do - # - # rental_data = { - # customer_id: (customers(:one)).id, - # movie_id: nil, - # check_out_date: Date.today.to_s, - # due_date: (Date.today + 7).to_s - # } - # - # rental = Rental.create(rental_data) - # - # rental.valid?.must_equal false - # end - # - # it "must have customer_id" do - # - # rental_data = { - # customer_id: nil, - # movie_id: (movies(:one)).id, - # check_out_date: Date.today.to_s, - # due_date: (Date.today + 7).to_s - # } - # - # rental = Rental.create(rental_data) - # - # rental.valid?.must_equal false - # end - # - # it "must have due_date" do - # - # rental_data = { - # customer_id: (customers(:one)).id, - # movie_id: (movies(:one)).id, - # check_out_date: Date.today.to_s, - # due_date: nil - # } - # - # rental = Rental.create(rental_data) - # - # rental.valid?.must_equal false - # end - # end - end From 7fe18cb5d5bdad59116a1ae8099cc329e16748c1 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Fri, 11 May 2018 15:39:27 -0700 Subject: [PATCH 46/49] cleaned up tests --- app/controllers/movies_controller.rb | 5 +- app/models/movie.rb | 5 - test/controllers/customers_controller_test.rb | 7 ++ test/controllers/movies_controller_test.rb | 5 +- test/controllers/rentals_controller_test.rb | 109 ++++++++++-------- 5 files changed, 71 insertions(+), 60 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 97156eea4..3c1817195 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -2,7 +2,7 @@ class MoviesController < ApplicationController def index movies = Movie.all - render json:movies.as_json(only: [:title, :release_date, :id]), status: :ok + render json: movies.as_json(only: [:title, :release_date, :id]), status: :ok end def show @@ -18,13 +18,12 @@ def show def create movie = Movie.new(movie_params) - #adding this for movie create smoketest - because smoketest doesn't have :available_inventory if movie[:available_inventory].nil? movie[:available_inventory] = movie[:inventory] end if movie.save - render json:movie.as_json(only: [:id]), status: :ok + render json: movie.as_json(only: [:id]), status: :ok else render json: {ok: false, errors: movie.errors}, status: :bad_request end diff --git a/app/models/movie.rb b/app/models/movie.rb index 54c6cdaed..c5e65c734 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -33,16 +33,11 @@ def self.increment(movie) end def self.rentable_movie?(id) - # movie = false - # - # if Movie.find_by(id: id) - # movie = Movie.find_by(id: id) if movie.available_inventory < 1 movie = false end - # end return movie end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 72c35a07e..36034776a 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -35,5 +35,12 @@ end end + it "works with no customers" do + Customer.destroy_all + + get customers_url + must_respond_with :success + end + end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 143ab9873..0522d1951 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -26,18 +26,16 @@ body.length.must_equal Movie.count end - it "returns no movies if there are no movies, status :not_found" do + it "returns no movies if there are no movies, status :ok" do Movie.destroy_all get movies_url must_respond_with :ok body = JSON.parse(response.body) body.length.must_equal Movie.count - end it "returns movies with exactly the required fields" do - keys = %w(title release_date id) get movies_url @@ -55,7 +53,6 @@ end it "returns movies with exactly the required fields" do - keys = %w(title overview release_date inventory available_inventory) get movie_path(movies(:two).id) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index f5bba5690..e4d33f0bb 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -2,69 +2,82 @@ describe RentalsController do describe "create" do - it "it is a real, working route" do - rental_count = Rental.count + describe "valid rental requests" do + it "it is a real, working route" do + rental_count = Rental.count - customer_movie_info = { - customer_id: customers(:one).id, - movie_id: movies(:one).id - } - post rental_path(customer_movie_info) + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } + post rental_path(customer_movie_info) - must_respond_with :success - Rental.count.must_equal (rental_count + 1) - end + must_respond_with :success + Rental.count.must_equal (rental_count + 1) + end - it "returns json" do - customer_movie_info = { - customer_id: customers(:one).id, - movie_id: movies(:one).id - } - post rental_path(customer_movie_info) + it "returns json" do + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } + post rental_path(customer_movie_info) - response.header['Content-Type'].must_include 'json' - end + response.header['Content-Type'].must_include 'json' + end - it "returns the correct rental" do - customer_movie_info = { - customer_id: customers(:one).id, - movie_id: movies(:one).id - } - post rental_path(customer_movie_info) + it "returns the correct rental" do + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:one).id + } + post rental_path(customer_movie_info) - body = JSON.parse(response.body) - body.length.must_equal 1 - body["id"].must_equal Rental.last.id - end + body = JSON.parse(response.body) + body.length.must_equal 1 + body["id"].must_equal Rental.last.id + end - it "decrements the movie's available_inventory" do - test_movie = movies(:one) - initial_inventory = test_movie.available_inventory + it "decrements the movie's available_inventory" do + test_movie = movies(:one) + initial_inventory = test_movie.available_inventory - customer_movie_info = { - customer_id: (customers(:one)).id, - movie_id: test_movie.id - } + customer_movie_info = { + customer_id: (customers(:one)).id, + movie_id: test_movie.id + } - post rental_path(customer_movie_info) - Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) - end + post rental_path(customer_movie_info) + Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) + end - it "decrements the movie's available_inventory when available_inventory is 1" do - test_movie = movies(:five) - initial_inventory = test_movie.available_inventory + it "decrements the movie's available_inventory when available_inventory is 1" do + test_movie = movies(:five) + initial_inventory = test_movie.available_inventory - customer_movie_info = { - customer_id: (customers(:one)).id, - movie_id: test_movie.id - } + customer_movie_info = { + customer_id: (customers(:one)).id, + movie_id: test_movie.id + } - post rental_path(customer_movie_info) - Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) + post rental_path(customer_movie_info) + Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) + end end - # should we also add the json response for a bad request as well? describe "Invalid rental responses" do + it "catches rental requests for unavailable movies" do + rental_count = Rental.count + + customer_movie_info = { + customer_id: customers(:one).id, + movie_id: movies(:three) + } + post rental_path(customer_movie_info) + + must_respond_with :bad_request + Rental.count.must_equal rental_count + end it "create rental returns a status of not_found for invalid movie id" do test_movie = movies(:one) From 7a937cffa684349db864e7732f9acaa020ca3f92 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Fri, 11 May 2018 15:40:46 -0700 Subject: [PATCH 47/49] fixed error messages for failing tests in rentals controller --- app/controllers/rentals_controller.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index e69e16e47..c380a284f 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -27,7 +27,14 @@ def create render json: {id: rental.id}, status: :ok else - render json: {ok: false, errors: rental.errors}, status: :bad_request + if rental.nil? + "no available_inventory for movie" + elsif rental.errors.nil? + error_messages = "cannot specify" + else + error_messages = rental.errors + end + render json: {ok: false, errors: error_messages}, status: :bad_request end end end From 6caca68865f2e9d2cc0d9e338f626f943493cc3e Mon Sep 17 00:00:00 2001 From: Abiaina Date: Fri, 11 May 2018 15:44:51 -0700 Subject: [PATCH 48/49] removed comments and tests still pass --- app/controllers/customers_controller.rb | 1 - app/models/movie.rb | 5 ----- 2 files changed, 6 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 67072f82d..465e4c86b 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -5,7 +5,6 @@ def index render json: customers.as_json(only: [ :id, :name, :phone, :postal_code, :registered_at, :movies_checked_out_count]), status: :ok - # what if no customers end end diff --git a/app/models/movie.rb b/app/models/movie.rb index c5e65c734..942c45dc3 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -34,11 +34,9 @@ def self.increment(movie) def self.rentable_movie?(id) movie = Movie.find_by(id: id) - if movie.available_inventory < 1 movie = false end - return movie end @@ -46,14 +44,11 @@ def self.returnable_movie?(id) movie = false if Movie.find_by(id: id) - movie = Movie.find_by(id: id) - if movie.available_inventory == movie.inventory movie = false end end - return movie end From 418cf785df66d8de8d2b0ae62c8d278bf9987808 Mon Sep 17 00:00:00 2001 From: Abiaina Date: Wed, 23 May 2018 17:52:28 -0700 Subject: [PATCH 49/49] went over the testing again with Mariano notes in tests for tests to be updated, also update fixtures with more specific names --- app/controllers/Reese_track | 0 test/controllers/customers_controller_test.rb | 1 + test/controllers/movies_controller_test.rb | 24 ++++- test/controllers/rentals_controller_test.rb | 97 +++++++++---------- 4 files changed, 67 insertions(+), 55 deletions(-) create mode 100644 app/controllers/Reese_track diff --git a/app/controllers/Reese_track b/app/controllers/Reese_track new file mode 100644 index 000000000..e69de29bb diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 36034776a..d276a3a16 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -26,6 +26,7 @@ body.length.must_equal Customer.count end + # not needed to check individual keys/attributes just confirm it is an instance of customer..ie .must be kind of customer it "customers must have requisite info" do keys = %w(id name phone postal_code registered_at movies_checked_out_count) get customers_url diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 0522d1951..0f13a9b3e 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -52,12 +52,18 @@ must_respond_with :success end + #This test was wrong, needs to be more specific and confirm based on added notes below: it "returns movies with exactly the required fields" do keys = %w(title overview release_date inventory available_inventory) get movie_path(movies(:two).id) - body = JSON.parse(response.body) - body.keys.sort.must_equal keys.sort + movie_object = JSON.parse(response.body) + movie_object.keys.sort.must_equal keys.sort + + # should also show that is the same movie by confirming its a movie with the same id and movie name + + movie_object.title.must_equal movies(:two).title + end it "responds with not_found if get a movie given invalid id" do @@ -104,5 +110,19 @@ body["errors"].must_include "title" end +# update tests to make sure defaults available inventory to inventory if avaialable inventory is input as nil. + it "" do + movie_data[:title] = nil + + proc{ + post movies_url, params: movie_data + }.must_change "Movie.count", 0 + must_respond_with :bad_request + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body.must_include "errors" + body["errors"].must_include "title" + end + end end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index e4d33f0bb..4e16cebc8 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -3,7 +3,7 @@ describe RentalsController do describe "create" do describe "valid rental requests" do - it "it is a real, working route" do + it "it creates a rental record" do rental_count = Rental.count customer_movie_info = { @@ -52,6 +52,7 @@ end it "decrements the movie's available_inventory when available_inventory is 1" do + # update the fixture to include that it must have its inventory of 1 for testing this edge case test_movie = movies(:five) initial_inventory = test_movie.available_inventory @@ -62,7 +63,18 @@ post rental_path(customer_movie_info) Movie.find(test_movie.id).available_inventory.must_equal (initial_inventory - 1) - end + end + + it "increments customer's checked out count" do + movie = movies(:two) + customer = customers(:one) + customer.movies_checked_out_count.must_equal 0 + data = {movie_id: movie.id, customer_id: customer.id} + + post rental_path(data) + customer.reload + customer.movies_checked_out_count.must_equal 1 + end end describe "Invalid rental responses" do @@ -129,35 +141,11 @@ must_respond_with :bad_request Movie.find(test_movie.id).available_inventory.must_equal 0 end - - it "increments customer's checked out count" do - movie = movies(:two) - customer = customers(:one) - customer.movies_checked_out_count.must_equal 0 - data = {movie_id: movie.id, customer_id: customer.id} - - post rental_path(data) - customer.reload - customer.movies_checked_out_count.must_equal 1 - end end end describe "update" do describe "valid update requests" do - it "it is a real, working route" do - rental_count = Rental.count - - movie = movies(:two) - customer = customers(:two) - - data = {movie_id: movie.id, customer_id: customer.id} - - post rental_update_path(data) - - must_respond_with :success - Rental.count.must_equal rental_count - end it "returns json" do movie = movies(:two) @@ -214,44 +202,47 @@ data = { movie_id: nil} - post rental_update_path(data) + post rental_update_path(data) - must_respond_with :bad_request - Rental.count.must_equal rental_count - end + must_respond_with :bad_request + Rental.count.must_equal rental_count + end - it "update rental returns a status of bad_request for invalid movie id value" do - rental_count = Rental.count + it "update rental returns a status of bad_request for invalid movie id value" do + rental_count = Rental.count - data = { - movie_id: -999} + data = { + movie_id: -999} - post rental_update_path(data) + post rental_update_path(data) - must_respond_with :bad_request - Rental.count.must_equal rental_count - end + must_respond_with :bad_request + Rental.count.must_equal rental_count + end +# write a test that allows anyone to return a checkedout movie ...doesn't have to be returned with a customer id in the params +it " " do - it "cannot update rental movie with available_inventory == inventory" do +end + it "cannot update rental movie with available_inventory == inventory" do - rental_count = Rental.count + rental_count = Rental.count - movie = movies(:four) - movie.available_inventory.must_equal movie.inventory + movie = movies(:four) + movie.available_inventory.must_equal movie.inventory - initial_inventory = movie.available_inventory + initial_inventory = movie.available_inventory - data = { - movie_id: movie.id - } + data = { + movie_id: movie.id + } - post rental_update_path(data) + post rental_update_path(data) - must_respond_with :bad_request - Rental.count.must_equal rental_count - movie.available_inventory.must_equal initial_inventory + must_respond_with :bad_request + Rental.count.must_equal rental_count + movie.available_inventory.must_equal initial_inventory + end + end end - end - end -end + end