From 402f19410a6738e86d598eb2ff995dffc87e95a0 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Mon, 7 May 2018 14:32:51 -0700 Subject: [PATCH 01/55] new rails api run --- .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/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 35 ++ bin/spring | 17 + bin/update | 29 ++ config.ru | 5 + config/application.rb | 40 +++ config/boot.rb | 3 + config/cable.yml | 10 + config/database.yml | 85 +++++ config/environment.rb | 5 + config/environments/development.rb | 47 +++ config/environments/production.rb | 83 +++++ config/environments/test.rb | 42 +++ .../application_controller_renderer.rb | 8 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/cors.rb | 16 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 + config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 33 ++ config/puma.rb | 56 ++++ config/routes.rb | 3 + config/secrets.yml | 32 ++ config/spring.rb | 6 + db/seeds.rb | 8 + lib/tasks/.keep | 0 log/.keep | 0 public/robots.txt | 1 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/test_helper.rb | 26 ++ tmp/.keep | 0 vendor/.keep | 0 55 files changed, 928 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/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cors.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/secrets.yml create mode 100644 config/spring.rb create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 public/robots.txt create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..68ac019ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +.byebug_history diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..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/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..67747dee6 --- /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: 51515240bbc4859b5f6a9c44ac7a3d0765217872567fad289d20bc762e22e40ab79bc7cd410abe645bba9a9a82e79ebed17f978e3ee8a0d12c3bda42b0b59e71 + +test: + secret_key_base: 427eb0301f226767815b8c5b7a7ae61c5e2f5b9ebc17d36effacbcbaaca7fad52016c40adfb7c7092de14a4c3f0f5b5342751078c45dd3d707e3ec12b1f86afc + +# Do not keep production secrets in the unencrypted secrets file. +# Instead, either read values from the environment. +# Or, use `bin/rails secrets:setup` to configure encrypted secrets +# and move the `production:` environment over there. + +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..c9119b40c --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w( + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +).each { |path| Spring.watch(path) } diff --git a/db/seeds.rb b/db/seeds.rb index 5322340ba..0e8274fca 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,3 +1,11 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) + JSON.parse(File.read('db/seeds/customers.json')).each do |customer| Customer.create!(customer) 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/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 000000000..10594a324 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,26 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails" +require "minitest/reporters" # for Colorized output + +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 000000000..e69de29bb From c21e04ae0c965ac0de5c045f709248b90830e8ab Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Mon, 7 May 2018 15:24:07 -0700 Subject: [PATCH 02/55] zomg it works --- app/controllers/customers_controller.rb | 2 ++ app/controllers/movies_controller.rb | 8 ++++++++ config/routes.rb | 2 ++ db/schema.rb | 18 ++++++++++++++++++ test/controllers/customers_controller_test.rb | 7 +++++++ test/controllers/movies_controller_test.rb | 7 +++++++ 6 files changed, 44 insertions(+) create mode 100644 app/controllers/customers_controller.rb create mode 100644 app/controllers/movies_controller.rb create mode 100644 db/schema.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..ca3b6e024 --- /dev/null +++ b/app/controllers/customers_controller.rb @@ -0,0 +1,2 @@ +class CustomersController < ApplicationController +end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb new file mode 100644 index 000000000..067bca585 --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,8 @@ +class MoviesController < ApplicationController + + def index + movie = "it works!" + render json: movie.as_json + end + +end diff --git a/config/routes.rb b/config/routes.rb index 787824f88..ceabbf906 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,5 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + + get '/zomg', to: 'movies#index' end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..2611543b3 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,18 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# 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: 0) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + +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..67fabbcfb --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MoviesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From bcb0b77534d3f0c5c6f794857ff4cad5807f441e Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Mon, 7 May 2018 15:37:22 -0700 Subject: [PATCH 03/55] create movie model --- app/models/movie.rb | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/models/movie.rb 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 From 5007ca2693601644e91a8d66095996a13b37cf36 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Mon, 7 May 2018 15:37:49 -0700 Subject: [PATCH 04/55] create migration - movie --- db/migrate/20180507223454_create_movies.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 db/migrate/20180507223454_create_movies.rb diff --git a/db/migrate/20180507223454_create_movies.rb b/db/migrate/20180507223454_create_movies.rb new file mode 100644 index 000000000..089a884a3 --- /dev/null +++ b/db/migrate/20180507223454_create_movies.rb @@ -0,0 +1,13 @@ +class CreateMovies < ActiveRecord::Migration[5.1] + def change + create_table :movies do |t| + t.string :title + t.string :overview + t.date :release_date + t.integer :inventory + t.integer :available_inventory + + t.timestamps + end + end +end From d5cd62cb74659e0f1c28bd34a181d1878bc26946 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Mon, 7 May 2018 15:38:24 -0700 Subject: [PATCH 05/55] create movies yml and movie_test --- test/fixtures/movies.yml | 15 +++++++++++++++ test/models/movie_test.rb | 9 +++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/fixtures/movies.yml create mode 100644 test/models/movie_test.rb diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml new file mode 100644 index 000000000..b997d3e77 --- /dev/null +++ b/test/fixtures/movies.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + title: MyString + overview: MyString + release_date: 2018-05-07 + inventory: 1 + available_inventory: 1 + +two: + title: MyString + overview: MyString + release_date: 2018-05-07 + inventory: 1 + available_inventory: 1 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 From 01aafa48b22d12c73bb550f111521bc307473cd5 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Mon, 7 May 2018 15:38:38 -0700 Subject: [PATCH 06/55] update schema --- db/schema.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 2611543b3..668917904 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,9 +10,19 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 0) do +ActiveRecord::Schema.define(version: 20180507223454) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "movies", force: :cascade do |t| + t.string "title" + t.string "overview" + t.date "release_date" + t.integer "inventory" + t.integer "available_inventory" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end From 7b0fee9d2ad4238abb7ae2193c6ca6a81a7322ee Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Mon, 7 May 2018 15:45:23 -0700 Subject: [PATCH 07/55] created customer model --- app/models/customer.rb | 2 ++ db/migrate/20180507224416_create_customers.rb | 15 +++++++++++++++ db/schema.rb | 14 +++++++++++++- test/fixtures/customers.yml | 19 +++++++++++++++++++ test/models/customer_test.rb | 9 +++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 app/models/customer.rb create mode 100644 db/migrate/20180507224416_create_customers.rb create mode 100644 test/fixtures/customers.yml create mode 100644 test/models/customer_test.rb diff --git a/app/models/customer.rb b/app/models/customer.rb new file mode 100644 index 000000000..0b5277335 --- /dev/null +++ b/app/models/customer.rb @@ -0,0 +1,2 @@ +class Customer < ApplicationRecord +end diff --git a/db/migrate/20180507224416_create_customers.rb b/db/migrate/20180507224416_create_customers.rb new file mode 100644 index 000000000..788fadd57 --- /dev/null +++ b/db/migrate/20180507224416_create_customers.rb @@ -0,0 +1,15 @@ +class CreateCustomers < ActiveRecord::Migration[5.1] + def change + create_table :customers do |t| + t.string :name + t.string :address + t.string :city + t.string :state + t.string :postal_code + t.string :phone + t.integer :movies_checked_out_count + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 668917904..65a83cf8c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,23 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180507223454) do +ActiveRecord::Schema.define(version: 20180507224416) 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 "postal_code" + t.string "phone" + t.integer "movies_checked_out_count" + 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" diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml new file mode 100644 index 000000000..73d1b3bd8 --- /dev/null +++ b/test/fixtures/customers.yml @@ -0,0 +1,19 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + address: MyString + city: MyString + state: MyString + postal_code: MyString + phone: MyString + movies_checked_out_count: 1 + +two: + name: MyString + address: MyString + city: MyString + state: MyString + postal_code: MyString + phone: MyString + movies_checked_out_count: 1 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 From 2a5406cef08e0c10a90243a9de34276aa96e0b3b Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Mon, 7 May 2018 15:59:43 -0700 Subject: [PATCH 08/55] added registered date and seeded --- db/migrate/20180507225557_add_registered_at_column.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180507225557_add_registered_at_column.rb diff --git a/db/migrate/20180507225557_add_registered_at_column.rb b/db/migrate/20180507225557_add_registered_at_column.rb new file mode 100644 index 000000000..6484d32bb --- /dev/null +++ b/db/migrate/20180507225557_add_registered_at_column.rb @@ -0,0 +1,5 @@ +class AddRegisteredAtColumn < ActiveRecord::Migration[5.1] + def change + add_column :customers, :registered_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 65a83cf8c..f675a1f9d 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: 20180507224416) do +ActiveRecord::Schema.define(version: 20180507225557) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -25,6 +25,7 @@ t.integer "movies_checked_out_count" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.datetime "registered_at" end create_table "movies", force: :cascade do |t| From 631b8133582c494357969848d5f0d5129ef54252 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Mon, 7 May 2018 16:25:36 -0700 Subject: [PATCH 09/55] create join table customersmovies; update schema; update relations --- app/models/customer.rb | 2 ++ app/models/movie.rb | 1 + .../20180507231810_create_customers_movies_join.rb | 8 ++++++++ db/schema.rb | 9 ++++++++- 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180507231810_create_customers_movies_join.rb diff --git a/app/models/customer.rb b/app/models/customer.rb index 0b5277335..c42e47c33 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,2 +1,4 @@ class Customer < ApplicationRecord + + has_and_belongs_to_many :movies end diff --git a/app/models/movie.rb b/app/models/movie.rb index dc614df15..ea8abd0d9 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,2 +1,3 @@ class Movie < ApplicationRecord + has_and_belongs_to_many :customers end diff --git a/db/migrate/20180507231810_create_customers_movies_join.rb b/db/migrate/20180507231810_create_customers_movies_join.rb new file mode 100644 index 000000000..f145ce613 --- /dev/null +++ b/db/migrate/20180507231810_create_customers_movies_join.rb @@ -0,0 +1,8 @@ +class CreateCustomersMoviesJoin < ActiveRecord::Migration[5.1] + def change + create_table :customers_movies_joins do |t| + t.belongs_to :customer, index: true + t.belongs_to :movie, index: true + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f675a1f9d..99325abf4 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: 20180507225557) do +ActiveRecord::Schema.define(version: 20180507231810) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -28,6 +28,13 @@ t.datetime "registered_at" end + create_table "customers_movies_joins", force: :cascade do |t| + t.bigint "customer_id" + t.bigint "movie_id" + t.index ["customer_id"], name: "index_customers_movies_joins_on_customer_id" + t.index ["movie_id"], name: "index_customers_movies_joins_on_movie_id" + end + create_table "movies", force: :cascade do |t| t.string "title" t.string "overview" From ded7ff1c75bfd307f33493c555ffe21040da2b9e Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Mon, 7 May 2018 17:02:00 -0700 Subject: [PATCH 10/55] added movies model relation test and renamed join table --- app/models/customer.rb | 2 ++ app/models/movie.rb | 3 +++ db/migrate/20180508000000_rename_join_table.rb | 5 +++++ db/schema.rb | 8 ++++---- test/models/movie_test.rb | 14 +++++++++++--- 5 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20180508000000_rename_join_table.rb diff --git a/app/models/customer.rb b/app/models/customer.rb index c42e47c33..0436462cd 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,4 +1,6 @@ class Customer < ApplicationRecord has_and_belongs_to_many :movies + validates :name, presence: true, uniqueness: true + end diff --git a/app/models/movie.rb b/app/models/movie.rb index ea8abd0d9..ca98f692a 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,3 +1,6 @@ class Movie < ApplicationRecord has_and_belongs_to_many :customers + + validates :title, presence: true + end diff --git a/db/migrate/20180508000000_rename_join_table.rb b/db/migrate/20180508000000_rename_join_table.rb new file mode 100644 index 000000000..399f5efa5 --- /dev/null +++ b/db/migrate/20180508000000_rename_join_table.rb @@ -0,0 +1,5 @@ +class RenameJoinTable < ActiveRecord::Migration[5.1] + def change + rename_table :customers_movies_joins, :customers_movies + end +end diff --git a/db/schema.rb b/db/schema.rb index 99325abf4..8d8ef0dff 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: 20180507231810) do +ActiveRecord::Schema.define(version: 20180508000000) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -28,11 +28,11 @@ t.datetime "registered_at" end - create_table "customers_movies_joins", force: :cascade do |t| + create_table "customers_movies", force: :cascade do |t| t.bigint "customer_id" t.bigint "movie_id" - t.index ["customer_id"], name: "index_customers_movies_joins_on_customer_id" - t.index ["movie_id"], name: "index_customers_movies_joins_on_movie_id" + t.index ["customer_id"], name: "index_customers_movies_on_customer_id" + t.index ["movie_id"], name: "index_customers_movies_on_movie_id" end create_table "movies", force: :cascade do |t| diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 34d1d30a5..fb01bb7c0 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -1,9 +1,17 @@ require "test_helper" describe Movie do - let(:movie) { Movie.new } + describe 'relations' do - it "must be valid" do - value(movie).must_be :valid? + it 'can connect movie to customer_id' do + customer = Customer.create!(name: "test customer") + movie = Movie.new(title: "test movie") + movie.customers << customer + movie.customers.last.id.must_equal customer.id + end + + it "must be valid" do + value(movie).must_be :valid? + end end end From b6bddae2fdb8d6fce565eee685df112b2019a88a Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Mon, 7 May 2018 19:26:45 -0700 Subject: [PATCH 11/55] finished movie model relations testing --- test/models/movie_test.rb | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index fb01bb7c0..c546d40e4 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -2,14 +2,28 @@ describe Movie do describe 'relations' do + before do + @customer = Customer.create!(name: "test customer") + @movie = Movie.new(title: "test movie") + @movie.customers << @customer + end - it 'can connect movie to customer_id' do - customer = Customer.create!(name: "test customer") - movie = Movie.new(title: "test movie") - movie.customers << customer - movie.customers.last.id.must_equal customer.id + it 'can connect customer to customer_id' do + @movie.customers.last.id.must_equal @customer.id end + it 'has a list of customers' do + @movie.must_respond_to :customers + second_cust = Customer.create!(title: "next title") + @movie.customers << second_cust + + @movie.customers.each do |customer| + customer.must_be_kind_of Customer + end + end + end + + describe 'validations' do it "must be valid" do value(movie).must_be :valid? end From 92ace8c30339c65b9d85f2c02bab95e8e0f20ca0 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Mon, 7 May 2018 19:36:57 -0700 Subject: [PATCH 12/55] movie model validation tests --- test/models/movie_test.rb | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index c546d40e4..f87d555b0 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -14,7 +14,7 @@ it 'has a list of customers' do @movie.must_respond_to :customers - second_cust = Customer.create!(title: "next title") + second_cust = Customer.create!(name: "fake name") @movie.customers << second_cust @movie.customers.each do |customer| @@ -24,8 +24,21 @@ end describe 'validations' do - it "must be valid" do - value(movie).must_be :valid? + + it "can be created with all valid fields" do + movie = Movie.new(title: "test movie") + + result = movie.valid? + + result.must_equal true + end + + it 'is invalid without a title' do + movie = Movie.new + + result = movie.valid? + + result.must_equal false end end end From 953621c31d32d5376afbe7c7caa7a909ded90fe6 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 09:49:51 -0700 Subject: [PATCH 13/55] update yml --- test/fixtures/customers.yml | 41 ++++++++++++++++++++++--------------- test/fixtures/movies.yml | 25 +++++++++++----------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index 73d1b3bd8..c668a6bd8 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -1,19 +1,28 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString - address: MyString - city: MyString - state: MyString - postal_code: MyString - phone: MyString - movies_checked_out_count: 1 +jane: + name: Jane Campion + address: 123 Main St + city: New York + state: NY + postal_code: 10463 + phone: (212) 555-5555 + movies_checked_out_count: 4 -two: - name: MyString - address: MyString - city: MyString - state: MyString - postal_code: MyString - phone: MyString - movies_checked_out_count: 1 +ava: + name: Ava DuVernay + address: 456 Main Str + city: New York + state: NY + postal_code: 10462 + phone: (212) 555-5556 + movies_checked_out_count: 3 + +no_name: + name: + address: 455 Main Dr + city: New York + state: NY + postal_code: 12462 + phone: (212) 595-5556 + movies_checked_out_count: 2 diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index b997d3e77..5f37d7579 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -1,15 +1,16 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - title: MyString - overview: MyString - release_date: 2018-05-07 - inventory: 1 - available_inventory: 1 +beautiful: + title: She's Beautiful When She's Angry + overview: A documentary film about the birth of the women's liberation movement in the 1960s. + release_date: 2014-12-05 + inventory: 5 + available_inventory: 5 -two: - title: MyString - overview: MyString - release_date: 2018-05-07 - inventory: 1 - available_inventory: 1 +gijane: + title: G.I. Jane + overview: In response to political pressure from Senator Lillian DeHaven (Anne Bancroft), the U.S. Navy begins a program that would allow for the eventual integration of women into its services. + + release_date: 1997-08-22 + inventory: 3 + available_inventory: 3 From e1dce6a2cd1d9090b2c18a667e8d9292c180e1db Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Tue, 8 May 2018 10:13:24 -0700 Subject: [PATCH 14/55] created routes --- config/routes.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index ceabbf906..cd4be249f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - get '/zomg', to: 'movies#index' + resources :movies, only: [:index, :show, :create] + + get '/customers', to: 'customers#index', as: 'customers' end From 8ad2a079e777b5796ac29c90f065eff3ed752d36 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 10:20:57 -0700 Subject: [PATCH 15/55] update ymls again --- app/controllers/customers_controller.rb | 5 +++ app/models/customer.rb | 4 +-- test/fixtures/movies.yml | 1 - test/models/customer_test.rb | 41 ++++++++++++++++++++++++- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index ca3b6e024..a37ee7773 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,2 +1,7 @@ class CustomersController < ApplicationController + + def index + customers = Customer.all + render(json: customers.as_json) + end end diff --git a/app/models/customer.rb b/app/models/customer.rb index 0436462cd..1b0db1061 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,6 +1,6 @@ class Customer < ApplicationRecord has_and_belongs_to_many :movies - validates :name, presence: true, uniqueness: true - + validates :name, presence: true + validates :phone, presence: true, uniqueness: end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index 5f37d7579..dbed6c30e 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -10,7 +10,6 @@ beautiful: gijane: title: G.I. Jane overview: In response to political pressure from Senator Lillian DeHaven (Anne Bancroft), the U.S. Navy begins a program that would allow for the eventual integration of women into its services. - release_date: 1997-08-22 inventory: 3 available_inventory: 3 diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 5ebc5c850..b46b735f3 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -4,6 +4,45 @@ let(:customer) { Customer.new } it "must be valid" do - value(customer).must_be :valid? + jane = customers(:jane) + value(jane).must_be :valid? end + + it 'nameless customers are invalid' do + no_name = customers(:no_name) + value(no_name).must_be :invalid? + end + + # Test example: no phone number at all + + # Test example if we have phone number validation: + # duplicate phone number - same as Jane, for example, but with her same phone number + + + describe 'relations' do + # use YML - customer that already exists + it 'checks that a customer already exists' do + ava = customers(:ava) + value(ava).must_be :valid? + end + + # it 'checks that a customer has rented a movie' do + # ava = customers(:ava) + # beautiful = movie(:beautiful) + # + # old_rental_count + # + # value(ava).must + # end + + # use YML for movies + + # use YML movie, see if customer has rented movie, try to rent it again + + # use YML movie, see if customer has rented movie (.rent method, for example) - make new entry in customermovies + + # starts out with no rentals + # jane.movies.length = 0 + + end From f808d1cafa13d97101606e8e88f498a775223a5d Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 10:37:17 -0700 Subject: [PATCH 16/55] create index tests for customers controller --- app/controllers/customers_controller.rb | 2 +- app/models/customer.rb | 1 - test/controllers/customers_controller_test.rb | 28 +++++++++++++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index a37ee7773..9ffd15dcf 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -2,6 +2,6 @@ class CustomersController < ApplicationController def index customers = Customer.all - render(json: customers.as_json) + render(json: customers.as_json(except: [:created_at, :updated_at, :movies_checked_out_count])) end end diff --git a/app/models/customer.rb b/app/models/customer.rb index 1b0db1061..1a60fa4a5 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -2,5 +2,4 @@ class Customer < ApplicationRecord has_and_belongs_to_many :movies validates :name, presence: true - validates :phone, presence: true, uniqueness: end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 5e123f6cd..d9190bdd5 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -1,7 +1,29 @@ require "test_helper" describe CustomersController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe 'index' do + it 'can list all customers' do + get customers_path + must_respond_with :success + + response.header['Content-Type'].must_include 'json' + + body = JSON.parse(response.body) + body.must_be_kind_of Array + body.length.must_equal Customer.count + end + + it 'returns customers with exactly the required fields' do + keys = %w(id name address city state postal_code phone registered_at) + keys = keys.sort + get customers_path + body = JSON.parse(response.body) + body.each do |customer| + customer.keys.sort.must_equal keys + end + end + + end + + end From e2546ffe6607cf9aba457bd0e0ba449bcd8f4528 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 10:56:37 -0700 Subject: [PATCH 17/55] add movies controller tests for index method --- app/controllers/customers_controller.rb | 3 +++ app/controllers/movies_controller.rb | 5 ++-- test/controllers/customers_controller_test.rb | 15 +++++++++++ test/controllers/movies_controller_test.rb | 27 ++++++++++++++++--- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 9ffd15dcf..4736132f5 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -4,4 +4,7 @@ def index customers = Customer.all render(json: customers.as_json(except: [:created_at, :updated_at, :movies_checked_out_count])) end + + + end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 067bca585..98e999f15 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,8 +1,9 @@ class MoviesController < ApplicationController def index - movie = "it works!" - render json: movie.as_json + movies = Movie.all + render json: movies.as_json(only: [:id, :title, :release_date]) end + end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index d9190bdd5..a242308d3 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -22,7 +22,22 @@ customer.keys.sort.must_equal keys end end + end + # describe 'show' do + # it 'can get one customer' do + # keys = %w(id name address city state postal_code phone registered_at) + # + # get customer_path + # must_respond_with :success + # + # response.header['Content-Type'].must_include 'json' + # + # body = JSON.parse(response.body) + # body.must_be_kind_of Hash + # body.keys.sort.must_equal keys + # body["id"].must_equal customer.id + # end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 67fabbcfb..27f425fd3 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,7 +1,28 @@ require "test_helper" describe MoviesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe 'index' do + it 'can get list of movies' do + keys = %w(id title release_date) + + get movies_path + + must_respond_with :success + response.header['Content-Type'].must_include 'json' + + body = JSON.parse(response.body) + body.must_be_kind_of Array + body.length.must_equal Movie.count + end + + it 'returns movies with exactly the required fields' do + keys = %w(id title release_date).sort + get movies_path + body = JSON.parse(response.body) + body.each do |movie| + movie.keys.sort.must_equal keys + end + end + + end end From c07387999e0ddbeae6ebcb5227ddd65780f001a2 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Tue, 8 May 2018 11:34:53 -0700 Subject: [PATCH 18/55] wrote and tested movie show action --- app/controllers/movies_controller.rb | 14 ++++++++++++++ test/controllers/customers_controller_test.rb | 2 +- test/controllers/movies_controller_test.rb | 16 ++++++++++++++++ test/models/customer_test.rb | 2 +- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 98e999f15..c9189bdcd 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -5,5 +5,19 @@ def index render json: movies.as_json(only: [:id, :title, :release_date]) end + def show + @movie = Movie.find_by(id: params[:id]) + + if @movie.nil? + render json: { + errors: { + id: ["No movie with ID #{params[:id]}"] + } + }, status: :not_found + else + render json: @movie.as_json(only: [:id, :title, :release_date]) + end + end + end diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index a242308d3..0b66ebc37 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -38,7 +38,7 @@ # body.keys.sort.must_equal keys # body["id"].must_equal customer.id # end - end + # end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 27f425fd3..de4a654b7 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -23,6 +23,22 @@ movie.keys.sort.must_equal keys end end + end + + describe 'show' do + it 'can get one movie' do + movie = movies(:beautiful) + keys = %w(id title release_date).sort + + get movie_path(movie.id) + must_respond_with :success + response.header['Content-Type'].must_include 'json' + + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body.keys.sort.must_equal keys + body["id"].must_equal movie.id + end end end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index b46b735f3..ad7abbf87 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -44,5 +44,5 @@ # starts out with no rentals # jane.movies.length = 0 - + end end From 69696290736c052a01ba496e0f783226de7ccf67 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Tue, 8 May 2018 11:52:58 -0700 Subject: [PATCH 19/55] wrote and tested show method for movies controller --- test/controllers/movies_controller_test.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index de4a654b7..9411daf06 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -40,5 +40,25 @@ body.keys.sort.must_equal keys body["id"].must_equal movie.id end + + it 'returns movie with exactly the required fields' do + movie = Movie.first + keys = %w(id title release_date).sort + get movie_path(movie) + body = JSON.parse(response.body) + + body.keys.sort.must_equal keys + end + + it "yields a not_found status if the movie DNE and returns an error" do + movie_id = Movie.last.id + 1 + get movie_path(movie_id) + + must_respond_with :not_found + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body.must_include "errors" + body["errors"].must_include "id" + end end end From 481ee1b218cff4045a79f73615ed144dc19c3256 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 12:15:28 -0700 Subject: [PATCH 20/55] add create and movie_params method to movies controller and their tests --- app/controllers/movies_controller.rb | 19 +++++++++- test/controllers/movies_controller_test.rb | 44 +++++++++++++++++++++- test/models/movie_test.rb | 4 +- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index c9189bdcd..2c6af1fac 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -15,9 +15,26 @@ def show } }, status: :not_found else - render json: @movie.as_json(only: [:id, :title, :release_date]) + render json: @movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]) end end + def create + movie = Movie.new(movie_params) + if movie.save + # Success + render json: { id: movie.id }, status: :created + else + # Failure + render json: { errors: movie.errors.messages }, status: :bad_request + end + + end + +private + + def movie_params + return params.require(:movie).permit(:id, :title, :overview, :release_date, :inventory, :available_inventory) + end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 9411daf06..f6edb6877 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -28,7 +28,7 @@ describe 'show' do it 'can get one movie' do movie = movies(:beautiful) - keys = %w(id title release_date).sort + keys = %w(id title release_date inventory overview).sort get movie_path(movie.id) must_respond_with :success @@ -43,7 +43,7 @@ it 'returns movie with exactly the required fields' do movie = Movie.first - keys = %w(id title release_date).sort + keys = %w(id title release_date inventory overview).sort get movie_path(movie) body = JSON.parse(response.body) @@ -60,5 +60,45 @@ body.must_include "errors" body["errors"].must_include "id" end + + describe 'create' do + let(:movie_data) { + { + title: "Secret Life of Walter Mitty", + overview: "An employee at Life Mag that daydreams a lot", + release_date: 2013-12-25, inventory: 5, + available_inventory: 0 + } + } + it "Creates a new movie" do + before_movie_count = Movie.count + + post movies_path, params: { movie: movie_data } + assert_response :success + + Movie.count.must_equal before_movie_count + 1 + + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body.must_include "id" + + # Check that the ID matches + Movie.find(body["id"]).title.must_equal movie_data[:title] + end + + it "Returns an error for an invalid movie" do + bad_data = movie_data.clone() + bad_data.delete(:title) + assert_no_difference "Movie.count" do + post movies_path, params: { movie: bad_data } + assert_response :bad_request + end + + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body.must_include "errors" + body["errors"].must_include "title" + end + end end end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index f87d555b0..da50e2996 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -3,7 +3,9 @@ describe Movie do describe 'relations' do before do - @customer = Customer.create!(name: "test customer") + # @customer = Customer.create!(name: "test customer") + @customer = Customer.first + puts @customer.name @movie = Movie.new(title: "test movie") @movie.customers << @customer end From 0b2d4ecb68290f247564a184c4814454209f9244 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 15:22:21 -0700 Subject: [PATCH 21/55] generate rentals controller and model; add check_in check_out to routes --- app/controllers/rentals_controller.rb | 16 +++++++++ app/models/rental.rb | 2 ++ config/routes.rb | 4 +++ db/migrate/20180508221622_create_rentals.rb | 12 +++++++ db/schema.rb | 14 +++++++- test/controllers/rentals_controller_test.rb | 7 ++++ test/fixtures/rentals.yml | 11 ++++++ test/models/customer_test.rb | 39 +++------------------ test/models/rental_test.rb | 9 +++++ 9 files changed, 79 insertions(+), 35 deletions(-) create mode 100644 app/controllers/rentals_controller.rb create mode 100644 app/models/rental.rb create mode 100644 db/migrate/20180508221622_create_rentals.rb create mode 100644 test/controllers/rentals_controller_test.rb create mode 100644 test/fixtures/rentals.yml create mode 100644 test/models/rental_test.rb diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb new file mode 100644 index 000000000..331546698 --- /dev/null +++ b/app/controllers/rentals_controller.rb @@ -0,0 +1,16 @@ +class RentalsController < ApplicationController + + def index + end + + def new + end + + def create + end + + def destroy + end + + +end diff --git a/app/models/rental.rb b/app/models/rental.rb new file mode 100644 index 000000000..79e3a65ca --- /dev/null +++ b/app/models/rental.rb @@ -0,0 +1,2 @@ +class Rental < ApplicationRecord +end diff --git a/config/routes.rb b/config/routes.rb index cd4be249f..24ff33b46 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,4 +4,8 @@ resources :movies, only: [:index, :show, :create] get '/customers', to: 'customers#index', as: 'customers' + + post '/rentals/check-out', to: 'rentals#check_out', as: 'check_out' + + post '/rentals/check-in', to: 'rentals#check_in', as: 'check_in' end diff --git a/db/migrate/20180508221622_create_rentals.rb b/db/migrate/20180508221622_create_rentals.rb new file mode 100644 index 000000000..2de04800d --- /dev/null +++ b/db/migrate/20180508221622_create_rentals.rb @@ -0,0 +1,12 @@ +class CreateRentals < ActiveRecord::Migration[5.1] + def change + create_table :rentals do |t| + t.belongs_to :customer, index: true + t.belongs_to :movie, index: true + t.date :due_date + t.date :check_in + t.date :check_out + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 8d8ef0dff..b0bfa15e1 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: 20180508000000) do +ActiveRecord::Schema.define(version: 20180508221622) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -45,4 +45,16 @@ t.datetime "updated_at", null: false end + create_table "rentals", force: :cascade do |t| + t.bigint "customer_id" + t.bigint "movie_id" + t.date "due_date" + t.date "check_in" + t.date "check_out" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["customer_id"], name: "index_rentals_on_customer_id" + t.index ["movie_id"], name: "index_rentals_on_movie_id" + end + end diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb new file mode 100644 index 000000000..f0227216c --- /dev/null +++ b/test/controllers/rentals_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe RentalsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml new file mode 100644 index 000000000..dc3ee79b5 --- /dev/null +++ b/test/fixtures/rentals.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index ad7abbf87..1eee52672 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,48 +1,19 @@ require "test_helper" describe Customer do - let(:customer) { Customer.new } + let(:jane) {customers(:jane)} + let(:ava) {customers(:ava)} - it "must be valid" do - jane = customers(:jane) - value(jane).must_be :valid? + it "must have a name to be valid" do + jane.name = nil + jane.valid?.must_equal false end - it 'nameless customers are invalid' do - no_name = customers(:no_name) - value(no_name).must_be :invalid? - end - - # Test example: no phone number at all - - # Test example if we have phone number validation: - # duplicate phone number - same as Jane, for example, but with her same phone number - - describe 'relations' do - # use YML - customer that already exists it 'checks that a customer already exists' do ava = customers(:ava) value(ava).must_be :valid? end - # it 'checks that a customer has rented a movie' do - # ava = customers(:ava) - # beautiful = movie(:beautiful) - # - # old_rental_count - # - # value(ava).must - # end - - # use YML for movies - - # use YML movie, see if customer has rented movie, try to rent it again - - # use YML movie, see if customer has rented movie (.rent method, for example) - make new entry in customermovies - - # starts out with no rentals - # jane.movies.length = 0 - end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb new file mode 100644 index 000000000..6ea53d94f --- /dev/null +++ b/test/models/rental_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Rental do + let(:rental) { Rental.new } + + it "must be valid" do + value(rental).must_be :valid? + end +end From 2bf87a47fd6337a839aed709c0c0aa2ab1aa22fb Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 16:10:56 -0700 Subject: [PATCH 22/55] update rental model and controller --- app/controllers/rentals_controller.rb | 16 ++++++++++++++-- app/models/rental.rb | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 331546698..883787086 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -1,16 +1,28 @@ +require 'date' + class RentalsController < ApplicationController def index + end def new + # new rental has to have a customer id and a movie id??? + @rental = Rental.new(params ) + render json: rentals.as_json(only: [:id, :check_in, :check_out, :due_date]) + end + + def show + end def create end - def destroy - end +private + + def rental_params + return params.require(:rental).permit(:id, :check_in, :check_out, :due_date) end diff --git a/app/models/rental.rb b/app/models/rental.rb index 79e3a65ca..e06f799b7 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,2 +1,16 @@ class Rental < ApplicationRecord + + def check_in + end + + def check_out + end + + def due_date + # self.check_in + 7 days + end + + def movie_available? + end + end From 65aa797cd731fec41d75a971d5f0db421591cd6c Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 16:14:53 -0700 Subject: [PATCH 23/55] update rental model and controller - again --- app/models/rental.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index e06f799b7..3753ba17a 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -7,10 +7,15 @@ def check_out end def due_date - # self.check_in + 7 days + # self.check_in + 7 days <<--- not if they return it early end - def movie_available? + def returned? + # boolean? + # if returned becomes available + # inventory + 1 + # check_in date gets set + # end end From 46e84b6015f04fa2995a65a47d813102bda6b826 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Tue, 8 May 2018 16:27:28 -0700 Subject: [PATCH 24/55] even more rental updates --- app/controllers/rentals_controller.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 883787086..73884f906 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -17,9 +17,16 @@ def show end def create + # when you check_out a rental, you create a rental + + end + + def update + # when you check_in a rental, you update a rental end + private def rental_params From d544069e95e9d3070dcb6eeb79fb2342f66e7df1 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Tue, 8 May 2018 16:59:08 -0700 Subject: [PATCH 25/55] moved some things into the controller logic --- app/controllers/rentals_controller.rb | 25 ++++++++++--------------- app/models/rental.rb | 6 +----- config/routes.rb | 4 ++-- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 73884f906..3a47871e9 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -8,28 +8,23 @@ def index def new # new rental has to have a customer id and a movie id??? - @rental = Rental.new(params ) - render json: rentals.as_json(only: [:id, :check_in, :check_out, :due_date]) - end - - def show + @rental = Rental.new(params) + render json: @rental.as_json(only: [:id, :check_in, :check_out, :due_date]) end - def create - # when you check_out a rental, you create a rental - + def check_in + # when you check_out a rental, you create a rental end - def update - # when you check_in a rental, you update a rental + def check_out + # when you check_in a rental, you update a rental end - -private - - def rental_params - return params.require(:rental).permit(:id, :check_in, :check_out, :due_date) +# private +# +# def rental_params +# return params.require(:rental).permit(:id, :check_in, :check_out, :due_date) end diff --git a/app/models/rental.rb b/app/models/rental.rb index 3753ba17a..8e1f64306 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,13 +1,9 @@ class Rental < ApplicationRecord - def check_in - end - def check_out - end def due_date - # self.check_in + 7 days <<--- not if they return it early + # self.check_in + 7 days <<--- not if they return it early end def returned? diff --git a/config/routes.rb b/config/routes.rb index 24ff33b46..482bd0e7e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,7 +5,7 @@ get '/customers', to: 'customers#index', as: 'customers' - post '/rentals/check-out', to: 'rentals#check_out', as: 'check_out' + post '/rentals/check-out', to: 'rentals#create', as: 'check_out' - post '/rentals/check-in', to: 'rentals#check_in', as: 'check_in' + post '/rentals/check-in', to: 'rentals#update', as: 'check_in' end From 2b62a263292d1bd4208e948b0af344dc979aa725 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Wed, 9 May 2018 09:31:24 -0700 Subject: [PATCH 26/55] checkin and checkout routes --- app/controllers/application_controller.rb | 1 + app/controllers/rentals_controller.rb | 34 +++++++++++++---------- config/routes.rb | 4 +-- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4ac8823b0..31daacb52 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,3 @@ class ApplicationController < ActionController::API + protect_from_forgery with: :null_session end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 3a47871e9..94336b805 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -2,29 +2,35 @@ class RentalsController < ApplicationController - def index + # def create + # @rental = Rental.new(params) + # + # @rental.check_out = Date.today + # @rental.due_date = Date.today + 7 + # end - end - - def new + def check_out # new rental has to have a customer id and a movie id??? + # when you check_out a rental, you create a rental + # create a new check in date? @rental = Rental.new(params) + #check movies availability - in a movie method? + @rental.check_out = Date.today + @rental.due_date = Date.today + 7 + # render json: @rental.as_json(only: [:id, :check_in, :check_out, :due_date]) - render json: @rental.as_json(only: [:id, :check_in, :check_out, :due_date]) end def check_in - # when you check_out a rental, you create a rental - end + # when you check_in a rental, you update a rental + @rental = Rental.find_by(params) - def check_out - # when you check_in a rental, you update a rental + @rental.check_in = Date.today end + private -# private -# -# def rental_params -# return params.require(:rental).permit(:id, :check_in, :check_out, :due_date) - + def rental_params + return params.require(:rental).permit(:id, :check_in, :check_out, :due_date) + end end diff --git a/config/routes.rb b/config/routes.rb index 482bd0e7e..6712e8ae4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,7 +5,7 @@ get '/customers', to: 'customers#index', as: 'customers' - post '/rentals/check-out', to: 'rentals#create', as: 'check_out' + post '/rentals/checkout', to: 'rentals#check_out', as: 'check_out' - post '/rentals/check-in', to: 'rentals#update', as: 'check_in' + patch '/rentals/checkin', to: 'rentals#check_in', as: 'check_in' end From 60916cb9efa2ca2730030abb64e84e143e1a41af Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Wed, 9 May 2018 10:17:42 -0700 Subject: [PATCH 27/55] fixed movie params to match smoketests --- app/controllers/application_controller.rb | 2 +- app/controllers/customers_controller.rb | 5 +---- app/controllers/movies_controller.rb | 6 +++--- app/controllers/rentals_controller.rb | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 31daacb52..cc695e46f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,3 @@ class ApplicationController < ActionController::API - protect_from_forgery with: :null_session + # protect_from_forgery with: :null_session end diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 4736132f5..7617b9a96 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -2,9 +2,6 @@ class CustomersController < ApplicationController def index customers = Customer.all - render(json: customers.as_json(except: [:created_at, :updated_at, :movies_checked_out_count])) + render(json: customers.as_json(except: [:created_at, :updated_at])) end - - - end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 2c6af1fac..613ee7509 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -15,7 +15,7 @@ def show } }, status: :not_found else - render json: @movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]) + render json: @movie.as_json(only: [:id, :title, :overview, :release_date, :inventory, :available_inventory]) end end @@ -23,7 +23,7 @@ def create movie = Movie.new(movie_params) if movie.save # Success - render json: { id: movie.id }, status: :created + render json: { id: movie.id }, status: :ok else # Failure render json: { errors: movie.errors.messages }, status: :bad_request @@ -34,7 +34,7 @@ def create private def movie_params - return params.require(:movie).permit(:id, :title, :overview, :release_date, :inventory, :available_inventory) + return params.permit(:id, :title, :overview, :release_date, :inventory, :available_inventory) end end diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 94336b805..f0f786e9e 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -32,5 +32,5 @@ def check_in def rental_params return params.require(:rental).permit(:id, :check_in, :check_out, :due_date) - end + end end From 89dd2232f2524d82a9f45d9cf2754361bb8e6051 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Wed, 9 May 2018 10:29:33 -0700 Subject: [PATCH 28/55] updated rentals checkout method, now working --- app/controllers/rentals_controller.rb | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index f0f786e9e..d95daa549 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -2,21 +2,20 @@ class RentalsController < ApplicationController - # def create - # @rental = Rental.new(params) - # - # @rental.check_out = Date.today - # @rental.due_date = Date.today + 7 - # end - def check_out # new rental has to have a customer id and a movie id??? # when you check_out a rental, you create a rental # create a new check in date? - @rental = Rental.new(params) + @rental = Rental.new(rental_params) #check movies availability - in a movie method? @rental.check_out = Date.today @rental.due_date = Date.today + 7 + + if @rental.save + render json: { id: @rental.id }, status: :ok + else + render json: { errors: @rental.errors.messages }, status: :bad_request + end # render json: @rental.as_json(only: [:id, :check_in, :check_out, :due_date]) end @@ -31,6 +30,6 @@ def check_in private def rental_params - return params.require(:rental).permit(:id, :check_in, :check_out, :due_date) + return params.permit(:id, :check_in, :check_out, :due_date, :movie_id, :customer_id) end end From dcd3650813f882288d867c510dc1d3347389928b Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Wed, 9 May 2018 11:51:59 -0700 Subject: [PATCH 29/55] add logic to rental controller check_in method --- app/controllers/rentals_controller.rb | 37 ++++++++++++++++----------- config/routes.rb | 5 ++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index d95daa549..392d9ef02 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -6,30 +6,37 @@ def check_out # new rental has to have a customer id and a movie id??? # when you check_out a rental, you create a rental # create a new check in date? - @rental = Rental.new(rental_params) + rental = Rental.new(rental_params) #check movies availability - in a movie method? - @rental.check_out = Date.today - @rental.due_date = Date.today + 7 + rental.check_out = Date.today + rental.due_date = Date.today + 7 - if @rental.save - render json: { id: @rental.id }, status: :ok + if rental.save + render json: { id: rental.id }, status: :ok else - render json: { errors: @rental.errors.messages }, status: :bad_request + render json: { errors: rental.errors.messages }, status: :bad_request end # render json: @rental.as_json(only: [:id, :check_in, :check_out, :due_date]) end def check_in - # when you check_in a rental, you update a rental - @rental = Rental.find_by(params) - - @rental.check_in = Date.today - end + rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id]) + if rental.nil? + render json: { + "errors": { + "id": ["No rental with #{params[:id]}"] + } + }, status: :not_found + else + # logic for increasing available_inventory + render(json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok) + end + end - private + private - def rental_params - return params.permit(:id, :check_in, :check_out, :due_date, :movie_id, :customer_id) + def rental_params + params.permit(:id, :check_in, :check_out, :due_date, :movie_id, :customer_id) + end end -end diff --git a/config/routes.rb b/config/routes.rb index 6712e8ae4..3781231c3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,7 +5,8 @@ get '/customers', to: 'customers#index', as: 'customers' - post '/rentals/checkout', to: 'rentals#check_out', as: 'check_out' + post '/rentals/check-out', to: 'rentals#check_out', as: 'check_out' - patch '/rentals/checkin', to: 'rentals#check_in', as: 'check_in' + post '/rentals/check-in', to: 'rentals#check_in', as: 'check_in' + end From dfb482af9c4fcc378d209e97588baec9b2ad1396 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Wed, 9 May 2018 15:29:14 -0700 Subject: [PATCH 30/55] added model relations and wrote first test for rental check in --- app/controllers/rentals_controller.rb | 2 -- app/models/customer.rb | 2 ++ app/models/movie.rb | 3 ++- app/models/rental.rb | 3 ++- test/controllers/rentals_controller_test.rb | 26 +++++++++++++++++++++ test/fixtures/rentals.yml | 8 +++++-- 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 392d9ef02..5a02efebb 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -16,8 +16,6 @@ def check_out else render json: { errors: rental.errors.messages }, status: :bad_request end - # render json: @rental.as_json(only: [:id, :check_in, :check_out, :due_date]) - end def check_in diff --git a/app/models/customer.rb b/app/models/customer.rb index 1a60fa4a5..93e85bc9e 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,5 +1,7 @@ class Customer < ApplicationRecord has_and_belongs_to_many :movies + has_many :rentals + validates :name, presence: true end diff --git a/app/models/movie.rb b/app/models/movie.rb index ca98f692a..82c5e6e92 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,6 +1,7 @@ class Movie < ApplicationRecord has_and_belongs_to_many :customers + has_many :rentals validates :title, presence: true - + end diff --git a/app/models/rental.rb b/app/models/rental.rb index 8e1f64306..42de87426 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,5 +1,6 @@ class Rental < ApplicationRecord - + belongs_to :customer + belongs_to :movie def due_date diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index f0227216c..da2b947c5 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -4,4 +4,30 @@ # it "must be a real test" do # flunk "Need real tests" # end + describe 'check_out' do + before do + @customer = Customer.first + @movie = Movie.first + @params = { customer_id: @customer.id, movie_id: @movie.id } + end + + it 'can create a rental with valid info' do + before_rental_count = Rental.count + post check_out_path, params: @params + assert_response :success + + puts @params + Rental.count.must_equal before_rental_count + 1 + + Rental.last.movie_id.must_equal @params[:movie_id] + Rental.last.customer_id.must_equal @params[:customer_id] + end + + it "won't create a rental when movie_id DNE" do + #Maria + end + + it "won't create a rental when customer_id DNE" + #Maria + end end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index dc3ee79b5..b2235526b 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -4,8 +4,12 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} +# one: { +# +# } # column: value # -two: {} +# two: { +# +# } # column: value From fea194810dcc4a9870cd8754e9fd436d55de4c6f Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Wed, 9 May 2018 23:38:14 -0700 Subject: [PATCH 31/55] wrote rentals controller check in method tests --- app/controllers/movies_controller.rb | 1 + app/controllers/rentals_controller.rb | 5 ++- test/controllers/rentals_controller_test.rb | 35 +++++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 613ee7509..344781388 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -21,6 +21,7 @@ def show def create movie = Movie.new(movie_params) + #set available_inventory to inventory?? if movie.save # Success render json: { id: movie.id }, status: :ok diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 5a02efebb..5f85c7cf2 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -3,13 +3,11 @@ class RentalsController < ApplicationController def check_out - # new rental has to have a customer id and a movie id??? - # when you check_out a rental, you create a rental - # create a new check in date? rental = Rental.new(rental_params) #check movies availability - in a movie method? rental.check_out = Date.today rental.due_date = Date.today + 7 + #set available_inventory to inventory in movie controller? if rental.save render json: { id: rental.id }, status: :ok @@ -20,6 +18,7 @@ def check_out def check_in rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id]) + if rental.nil? render json: { "errors": { diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index da2b947c5..de6e911c6 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -21,13 +21,44 @@ Rental.last.movie_id.must_equal @params[:movie_id] Rental.last.customer_id.must_equal @params[:customer_id] + #check that it decreases available_inventory by 1 + # check that it increases customer movie count by 1 end it "won't create a rental when movie_id DNE" do #Maria end - it "won't create a rental when customer_id DNE" - #Maria + it "won't create a rental when customer_id DNE" do + #Maria + end + end + + describe 'check_in' do + before do + @customer = Customer.first + @movie = Movie.first + @params = { customer_id: @customer.id, movie_id: @movie.id } + end + + it 'can find and update a valid rental' do + post check_out_path, params: @params + + post check_in_path, params: @params + + assert_response :success + + # check that check in date is now today + # decreases customer movies by 1 + # increases available_inventory by 1 + end + + it 'returns status not_found if rental DNE' do + post check_in_path, params: @params + + assert_response :not_found + # customer movies stays same + # available_inventory stays same end + end end From 15d66aba1eb151f9c78bd917e901f57064f79075 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Wed, 9 May 2018 23:57:52 -0700 Subject: [PATCH 32/55] add two tests: won't create a rental when movie_id and customer_id DNE --- test/controllers/rentals_controller_test.rb | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index da2b947c5..59dc7c1db 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,9 +1,7 @@ require "test_helper" - +require 'pry' describe RentalsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe 'check_out' do before do @customer = Customer.first @@ -20,14 +18,22 @@ Rental.count.must_equal before_rental_count + 1 Rental.last.movie_id.must_equal @params[:movie_id] + Rental.last.customer_id.must_equal @params[:customer_id] end it "won't create a rental when movie_id DNE" do - #Maria + params = { customer_id: @customer.id, movie_id: nil } + + post check_out_path, params: params + assert_response :bad_request end - it "won't create a rental when customer_id DNE" - #Maria + it "won't create a rental when customer_id DNE" do + + params = { customer_id: nil, movie_id: @movie.id } + post check_out_path, params: params + assert_response :bad_request end + end end From d4ece012221a0106d7847377a4b5955ababe8f92 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Wed, 9 May 2018 23:58:33 -0700 Subject: [PATCH 33/55] add YML for 'purple' with available_inventory attribute set to nil by default --- test/fixtures/movies.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index dbed6c30e..fd93ae539 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -12,4 +12,11 @@ gijane: overview: In response to political pressure from Senator Lillian DeHaven (Anne Bancroft), the U.S. Navy begins a program that would allow for the eventual integration of women into its services. release_date: 1997-08-22 inventory: 3 - available_inventory: 3 + available_inventory: 2 + +purple: + title: The Color Purple + overview: An epic tale spanning forty years in the life of Celie (Whoopi Goldberg), an African-American woman living in the South who survives incredible abuse and bigotry. + release_date: 1985-12-18 + inventory: 3 + available_inventory: From 36fff26a3d251c1c50303fcdb14e110c4c204eb2 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 00:01:41 -0700 Subject: [PATCH 34/55] add movie model tests for available_inventory, decreasing and increasing inventory of movies --- test/models/movie_test.rb | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index da50e2996..e3c7e2fca 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -43,4 +43,43 @@ result.must_equal false end end + + describe 'describe available inventory methods' do + + # the next test uses the yml 'gijane' which has different inventory compared to available_inventory + it 'sets the available_inventory of a movie equal to the inventory' do + movie = movies(:gijane) + + movie.set_avail_inventory + + movie.available_inventory.must_equal 3 + end + + # the next two tests uses the yml 'purple' which has available_inventory set to nil as a default + it 'decreases available inventory of a movie by 1' do + movie = movies(:purple) + movie.set_avail_inventory + before_count = movie.available_inventory + + movie.dec_avail_inventory + + after_count = movie.available_inventory + + after_count.must_equal before_count - 1 + + end + + it 'increases available inventory of a movie by 1' do + movie = movies(:purple) + movie.set_avail_inventory + before_count = movie.available_inventory + + movie.inc_avail_inventory + + after_count = movie.available_inventory + + after_count.must_equal before_count + 1 + + end + end end From fe7f1d549e5b24434f72cac8e377d5d6ceb38d9d Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 00:03:05 -0700 Subject: [PATCH 35/55] add available_inventory methods - setting, decreasing, increasing - to movie model --- app/models/movie.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/models/movie.rb b/app/models/movie.rb index 82c5e6e92..7ad1e2ed0 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -4,4 +4,23 @@ class Movie < ApplicationRecord validates :title, presence: true + def set_avail_inventory + # because available_inventory is nil by default (see seed files), we have to set it equal to inventory + self.available_inventory = self.inventory + # TODO: self.available_inventory must not be a larger value than inventory + # TODO: self.available_inventory attribute can't go below 0 + end + + def dec_avail_inventory + # this method decrements available_inventory for that movie by 1; we call this in movies_controller check_out method + self.available_inventory -= 1 + + end + + def inc_avail_inventory + # this method increments available_inventory for that movie by 1; we call this in movies_controller check_in method + self.available_inventory += 1 + end + + end From 85e308706e7b04b4e175255ae9c54613a7360f93 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 00:04:19 -0700 Subject: [PATCH 36/55] update rentals_controller to include available_inventory methods called on movie --- app/controllers/rentals_controller.rb | 38 ++++++++++++++------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 5a02efebb..624652f60 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -3,15 +3,15 @@ class RentalsController < ApplicationController def check_out - # new rental has to have a customer id and a movie id??? - # when you check_out a rental, you create a rental - # create a new check in date? rental = Rental.new(rental_params) #check movies availability - in a movie method? rental.check_out = Date.today rental.due_date = Date.today + 7 if rental.save + movie = Movie.find_by(id: rental.movie_id) + movie.dec_avail_inventory + render json: { id: rental.id }, status: :ok else render json: { errors: rental.errors.messages }, status: :bad_request @@ -20,21 +20,23 @@ def check_out def check_in rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id]) - if rental.nil? - render json: { - "errors": { - "id": ["No rental with #{params[:id]}"] - } - }, status: :not_found - else - # logic for increasing available_inventory - render(json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok) - end - end - - private + if rental + movie = Movie.find_by(id: rental.movie_id) + movie.inc_avail_inventory - def rental_params - params.permit(:id, :check_in, :check_out, :due_date, :movie_id, :customer_id) + render(json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok) + else + render json: { + "errors": { + "id": ["No rental with #{params[:id]}"] + } + }, status: :not_found end end + +private + + def rental_params + params.permit(:id, :check_in, :check_out, :due_date, :movie_id, :customer_id) + end +end From 16677cc5ddd60beca0245796074c37851e1fbbd2 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 00:05:06 -0700 Subject: [PATCH 37/55] add miscellaneous comments and TODOs --- app/controllers/movies_controller.rb | 1 + app/models/rental.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 613ee7509..628c24e60 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -21,6 +21,7 @@ def show def create movie = Movie.new(movie_params) + movie.set_avail_inventory # <-- TODO write test for this in movies_controller_test if movie.save # Success render json: { id: movie.id }, status: :ok diff --git a/app/models/rental.rb b/app/models/rental.rb index 42de87426..b6ccba458 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -4,7 +4,7 @@ class Rental < ApplicationRecord def due_date - # self.check_in + 7 days <<--- not if they return it early + # self.check_in + 7 days <<-- not if they return it early? end def returned? From dd1da3b48ff3a1d30e653f2921cbc7521e00ecc1 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Thu, 10 May 2018 14:34:35 -0700 Subject: [PATCH 38/55] wrote a check in test --- app/controllers/rentals_controller.rb | 3 +++ app/models/rental.rb | 5 ----- db/schema.rb | 2 +- test/controllers/rentals_controller_test.rb | 10 +++++++++- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 5f85c7cf2..6205e3961 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -27,6 +27,9 @@ def check_in }, status: :not_found else # logic for increasing available_inventory + rental.check_in = Date.today + rental.save + render(json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok) end end diff --git a/app/models/rental.rb b/app/models/rental.rb index 42de87426..05832eb3d 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -2,11 +2,6 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :movie - - def due_date - # self.check_in + 7 days <<--- not if they return it early - end - def returned? # boolean? # if returned becomes available diff --git a/db/schema.rb b/db/schema.rb index b0bfa15e1..3078c703d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -22,10 +22,10 @@ t.string "state" t.string "postal_code" t.string "phone" - t.integer "movies_checked_out_count" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.datetime "registered_at" + t.integer "movies_checked_out_count" end create_table "customers_movies", force: :cascade do |t| diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index de6e911c6..8fec8b775 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,4 +1,5 @@ require "test_helper" +require 'pry' describe RentalsController do # it "must be a real test" do @@ -48,7 +49,10 @@ assert_response :success - # check that check in date is now today + rental = Rental.find_by(@params) + # binding.pry + rental.check_in.must_equal Date.today + # decreases customer movies by 1 # increases available_inventory by 1 end @@ -60,5 +64,9 @@ # customer movies stays same # available_inventory stays same end + + it 'can handle already checked in' do + + end end end From 2c983e81b1e1fdbdee7759a25dfef2406f44197d Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Thu, 10 May 2018 15:04:44 -0700 Subject: [PATCH 39/55] resolved merge conflicts and syntax errors --- app/controllers/rentals_controller.rb | 18 +++++++----------- app/models/rental.rb | 8 -------- test/controllers/rentals_controller_test.rb | 3 --- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index f3ee3dbbc..59db5b26d 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -24,27 +24,23 @@ def check_in if rental.nil? render json: { - "errors": { - "id": ["No rental with #{params[:id]}"] - }, status: :not_found + "errors": { + "id": ["No rental with #{params[:id]}"] + }, status: :not_found } else # logic for increasing available_inventory movie = Movie.find_by(id: rental.movie_id) movie.inc_avail_inventory + # logic for increasing available_inventory + rental.check_in = Date.today + rental.save render(json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok) - }, status: :not_found - else - # logic for increasing available_inventory - rental.check_in = Date.today - rental.save - - render(json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok) - end end end + private def rental_params diff --git a/app/models/rental.rb b/app/models/rental.rb index d3357fdec..05832eb3d 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -2,14 +2,6 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :movie -<<<<<<< HEAD - - def due_date - # self.check_in + 7 days <<-- not if they return it early? - end - -======= ->>>>>>> migration_for_customer def returned? # boolean? # if returned becomes available diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index 917fe7ca8..638465cf4 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -1,9 +1,6 @@ require "test_helper" require 'pry' -<<<<<<< HEAD -======= ->>>>>>> migration_for_customer describe RentalsController do describe 'check_out' do From 035d8241065126f6655c92d496100ca629e2edc8 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 15:17:55 -0700 Subject: [PATCH 40/55] add simplecov to gemfile; add coverage to .gitignore --- .gitignore | 2 ++ Gemfile | 2 ++ Gemfile.lock | 8 ++++++++ 3 files changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index 68ac019ec..fd0838a7d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ !/tmp/.keep .byebug_history + +coverage diff --git a/Gemfile b/Gemfile index 78bff8d26..bf784b0f7 100644 --- a/Gemfile +++ b/Gemfile @@ -48,3 +48,5 @@ group :test do gem 'minitest-rails' gem 'minitest-reporters' end + +gem 'simplecov', require: false, group: :test diff --git a/Gemfile.lock b/Gemfile.lock index e547d2449..d936cd1e6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -45,12 +45,14 @@ GEM coderay (1.1.2) concurrent-ruby (1.0.5) crass (1.0.4) + docile (1.3.0) erubi (1.7.1) ffi (1.9.23) globalid (0.4.1) activesupport (>= 4.2.0) i18n (1.0.1) concurrent-ruby (~> 1.0) + json (2.1.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) @@ -114,6 +116,11 @@ GEM ffi (>= 0.5.0, < 2) ruby-progressbar (1.9.0) ruby_dep (1.5.0) + simplecov (0.16.1) + docile (~> 1.1) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.2) spring (2.0.2) activesupport (>= 4.2) spring-watcher-listen (2.0.1) @@ -146,6 +153,7 @@ DEPENDENCIES pry-rails puma (~> 3.7) rails (~> 5.1.6) + simplecov spring spring-watcher-listen (~> 2.0.0) tzinfo-data From 08d4112da32b8056a78ebcff7ee47465b37ffbc2 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 15:18:21 -0700 Subject: [PATCH 41/55] add simplecov to test_helper --- test/test_helper.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 10594a324..597d04043 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,6 @@ +require 'simplecov' +SimpleCov.start + ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" From 4b8783198327711b687aa9cee64e637857d0be9f Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 15:19:18 -0700 Subject: [PATCH 42/55] add TODO for setting up and running test for rental model --- app/models/rental.rb | 2 +- test/fixtures/rentals.yml | 2 +- test/models/rental_test.rb | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/models/rental.rb b/app/models/rental.rb index b6ccba458..69d447f7e 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -12,7 +12,7 @@ def returned? # if returned becomes available # inventory + 1 # check_in date gets set - # + end end diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index b2235526b..ed1253b4d 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -3,7 +3,7 @@ # This model initially had no columns defined. If you add columns to the # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below -# +# TODO fill in this one and run rental_test # one: { # # } diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 6ea53d94f..f45823e9d 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,9 +1,11 @@ require "test_helper" describe Rental do - let(:rental) { Rental.new } + let(:rental) { rentals(:one) } + it "must be valid" do + # TODO set up rental YML file with a customer and movie -- using the yml called ":one" and then run this test again value(rental).must_be :valid? end end From 4b6e5b9b20b6a7e27449e3d6df1c6c4ac9372c93 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 15:20:20 -0700 Subject: [PATCH 43/55] modify movies_controller test to include available_inventory attribute --- app/controllers/movies_controller.rb | 2 +- test/controllers/movies_controller_test.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 628c24e60..f7d664c44 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -21,7 +21,7 @@ def show def create movie = Movie.new(movie_params) - movie.set_avail_inventory # <-- TODO write test for this in movies_controller_test + if movie.save # Success render json: { id: movie.id }, status: :ok diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index f6edb6877..bc0e35707 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -28,7 +28,7 @@ describe 'show' do it 'can get one movie' do movie = movies(:beautiful) - keys = %w(id title release_date inventory overview).sort + keys = %w(id title release_date inventory overview available_inventory).sort get movie_path(movie.id) must_respond_with :success @@ -43,7 +43,7 @@ it 'returns movie with exactly the required fields' do movie = Movie.first - keys = %w(id title release_date inventory overview).sort + keys = %w(id title release_date inventory overview available_inventory).sort get movie_path(movie) body = JSON.parse(response.body) From 48484c7605ff8171576fa46f32984f2976a1c317 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Thu, 10 May 2018 15:21:24 -0700 Subject: [PATCH 44/55] update movie model and tests; add custom validation and private method to handle setting available_inventory --- app/models/movie.rb | 23 ++++++++++++++++++----- test/models/movie_test.rb | 22 ++++++++++++++-------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index 7ad1e2ed0..2df2f33d2 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -3,12 +3,17 @@ class Movie < ApplicationRecord has_many :rentals validates :title, presence: true + validate :available_inventory_cannot_be_greater_than_inventory - def set_avail_inventory - # because available_inventory is nil by default (see seed files), we have to set it equal to inventory - self.available_inventory = self.inventory - # TODO: self.available_inventory must not be a larger value than inventory - # TODO: self.available_inventory attribute can't go below 0 + validates :available_inventory, numericality: { only_integer: true, greater_than_or_equal_to: 0} + + # #TODO add validations: + # inventory >= 0 + # inventory is only an integer + + after_initialize do |movie| + self.inventory ||= 0 + self.available_inventory ||= self.inventory end def dec_avail_inventory @@ -22,5 +27,13 @@ def inc_avail_inventory self.available_inventory += 1 end +private + +# See: http://guides.rubyonrails.org/active_record_validations.html#custom-methods +def available_inventory_cannot_be_greater_than_inventory + if available_inventory > inventory + errors.add(:available_inventory, "Can't be greater than inventory value") + end +end end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index e3c7e2fca..d045909d8 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -42,23 +42,30 @@ result.must_equal false end - end - describe 'describe available inventory methods' do + it 'is invalid if available inventory greater than inventory'do + movie= movies(:gijane) + + # this will increment available_inventory value to 4 + movie.inc_avail_inventory + movie.inc_avail_inventory - # the next test uses the yml 'gijane' which has different inventory compared to available_inventory - it 'sets the available_inventory of a movie equal to the inventory' do - movie = movies(:gijane) + movie.wont_be :valid? + end + end - movie.set_avail_inventory + describe 'attributes' do + it 'available_inventory defaults to the inventory amount' do + movie = movies(:purple) movie.available_inventory.must_equal 3 end + end + describe 'describe available inventory methods' do # the next two tests uses the yml 'purple' which has available_inventory set to nil as a default it 'decreases available inventory of a movie by 1' do movie = movies(:purple) - movie.set_avail_inventory before_count = movie.available_inventory movie.dec_avail_inventory @@ -71,7 +78,6 @@ it 'increases available inventory of a movie by 1' do movie = movies(:purple) - movie.set_avail_inventory before_count = movie.available_inventory movie.inc_avail_inventory From 956fdf67710524a7ceefe05edb23565919996755 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Thu, 10 May 2018 23:12:49 -0700 Subject: [PATCH 45/55] wrote positive test for rental model, tested available_inventory functionality, added inventory validation --- app/models/movie.rb | 4 +--- test/fixtures/customers.yml | 2 +- test/fixtures/rentals.yml | 17 +++++++---------- test/models/movie_test.rb | 21 +++++++++++++++++++-- test/models/rental_test.rb | 6 +++++- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/app/models/movie.rb b/app/models/movie.rb index 2df2f33d2..f3e84a6d3 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -7,9 +7,7 @@ class Movie < ApplicationRecord validates :available_inventory, numericality: { only_integer: true, greater_than_or_equal_to: 0} - # #TODO add validations: - # inventory >= 0 - # inventory is only an integer + validates :inventory, numericality: { only_integer: true, greater_than: 0 } after_initialize do |movie| self.inventory ||= 0 diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index c668a6bd8..7a8eed2bb 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -19,7 +19,7 @@ ava: movies_checked_out_count: 3 no_name: - name: + name: address: 455 Main Dr city: New York state: NY diff --git a/test/fixtures/rentals.yml b/test/fixtures/rentals.yml index ed1253b4d..e6e97552f 100644 --- a/test/fixtures/rentals.yml +++ b/test/fixtures/rentals.yml @@ -3,13 +3,10 @@ # This model initially had no columns defined. If you add columns to the # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below -# TODO fill in this one and run rental_test -# one: { -# -# } -# column: value -# -# two: { -# -# } -# column: value +one: + customer_id: 1 + movie_id: 3 + +two: + customer_id: 2 + movie_id: 1 diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index d045909d8..85c29e4d0 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -43,7 +43,7 @@ result.must_equal false end - it 'is invalid if available inventory greater than inventory'do + it 'is invalid if available inventory greater than inventory' do movie= movies(:gijane) # this will increment available_inventory value to 4 @@ -52,6 +52,14 @@ movie.wont_be :valid? end + + it 'is invalid if available_inventory is negative' do + #try to check out when available_inventory is 0 + end + + it 'is invalid if inventory is zero or less' do + # cannot be created with 0 + end end describe 'attributes' do @@ -73,7 +81,6 @@ after_count = movie.available_inventory after_count.must_equal before_count - 1 - end it 'increases available inventory of a movie by 1' do @@ -87,5 +94,15 @@ after_count.must_equal before_count + 1 end + + it 'throws an error if available_inventory is greater than inventory' do + movie = Movie.first + stock = movie.inventory + + movie.available_inventory = stock + 2 + result = movie.valid? + + result.must_equal false + end end end diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index f45823e9d..36bcd5ae5 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -5,7 +5,11 @@ it "must be valid" do - # TODO set up rental YML file with a customer and movie -- using the yml called ":one" and then run this test again + # rental = rentals(:one) + movie = Movie.first + customer = Customer.first + rental = Rental.new(movie_id: movie.id, customer_id: customer.id) + value(rental).must_be :valid? end end From 1f0870e29740a0e8033fee512ad219abba1dcdc6 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Thu, 10 May 2018 23:22:50 -0700 Subject: [PATCH 46/55] skipped tests for old join tables --- test/models/movie_test.rb | 6 +++++- test/models/rental_test.rb | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 85c29e4d0..031157f3a 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -5,16 +5,20 @@ before do # @customer = Customer.create!(name: "test customer") @customer = Customer.first - puts @customer.name + @movie = Movie.new(title: "test movie") @movie.customers << @customer end it 'can connect customer to customer_id' do + skip + # write these for a rental @movie.customers.last.id.must_equal @customer.id end it 'has a list of customers' do + skip + # write these for a rental @movie.must_respond_to :customers second_cust = Customer.create!(name: "fake name") @movie.customers << second_cust diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 36bcd5ae5..09fab89b1 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -3,7 +3,6 @@ describe Rental do let(:rental) { rentals(:one) } - it "must be valid" do # rental = rentals(:one) movie = Movie.first @@ -12,4 +11,12 @@ value(rental).must_be :valid? end + + it "will be invalid without customer_id" do + skip + end + + it "will be invalid without movie_id" do + skip + end end From 96d988d08ec41202abb9e40b1548beaa5d7f8035 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Thu, 10 May 2018 23:49:37 -0700 Subject: [PATCH 47/55] wrote some validation test stubs for customers --- app/models/customer.rb | 16 ++++++++++++++++ app/models/movie.rb | 16 ++++++++-------- app/models/rental.rb | 9 --------- test/models/customer_test.rb | 19 ++++++++++++++----- 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/app/models/customer.rb b/app/models/customer.rb index 93e85bc9e..a6193b03c 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -4,4 +4,20 @@ class Customer < ApplicationRecord has_many :rentals validates :name, presence: true + validates :movies_checked_out_count, numericality: { only_integer: true, greater_than_or_equal_to: 0 } + + after_initialize do |customer| + self.movies_checked_out_count ||= 0 + end + + def dec_checked_out_count + # this method decrements available_inventory for that movie by 1; we call this in movies_controller check_out method + self.movies_checked_out_count -= 1 + end + + def inc_checked_out_count + # this method increments available_inventory for that movie by 1; we call this in movies_controller check_in method + self.movies_checked_out_count += 1 + end + end diff --git a/app/models/movie.rb b/app/models/movie.rb index f3e84a6d3..bf94345d4 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -10,8 +10,8 @@ class Movie < ApplicationRecord validates :inventory, numericality: { only_integer: true, greater_than: 0 } after_initialize do |movie| - self.inventory ||= 0 - self.available_inventory ||= self.inventory + self.inventory ||= 0 + self.available_inventory ||= self.inventory end def dec_avail_inventory @@ -25,13 +25,13 @@ def inc_avail_inventory self.available_inventory += 1 end -private + private -# See: http://guides.rubyonrails.org/active_record_validations.html#custom-methods -def available_inventory_cannot_be_greater_than_inventory - if available_inventory > inventory - errors.add(:available_inventory, "Can't be greater than inventory value") + # See: http://guides.rubyonrails.org/active_record_validations.html#custom-methods + def available_inventory_cannot_be_greater_than_inventory + if available_inventory > inventory + errors.add(:available_inventory, "Can't be greater than inventory value") + end end -end end diff --git a/app/models/rental.rb b/app/models/rental.rb index c982cca4e..e001ff37c 100644 --- a/app/models/rental.rb +++ b/app/models/rental.rb @@ -1,13 +1,4 @@ class Rental < ApplicationRecord belongs_to :customer belongs_to :movie - - def returned? - # boolean? - # if returned becomes available - # inventory + 1 - # check_in date gets set - - end - end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 1eee52672..102c69cb9 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -4,16 +4,25 @@ let(:jane) {customers(:jane)} let(:ava) {customers(:ava)} - it "must have a name to be valid" do - jane.name = nil - jane.valid?.must_equal false - end - describe 'relations' do it 'checks that a customer already exists' do ava = customers(:ava) value(ava).must_be :valid? end + end + + describe 'validations' do + it "can be created with valid info" do + skip + end + + it "must have a name to be valid" do + jane.name = nil + jane.valid?.must_equal false + end + it 'is invalid if movies_checked_out_count is less than zero' do + # cannot be created with 0 + end end end From a898d072c17eae45a99918824809b5131c9c5179 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Fri, 11 May 2018 00:05:34 -0700 Subject: [PATCH 48/55] fixed a validation test to instantiate movie with an inventory, and fixed a customer controller test to include movies_checked_out_count in fields to return --- test/controllers/customers_controller_test.rb | 2 +- test/models/movie_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/controllers/customers_controller_test.rb b/test/controllers/customers_controller_test.rb index 0b66ebc37..901f6a54c 100644 --- a/test/controllers/customers_controller_test.rb +++ b/test/controllers/customers_controller_test.rb @@ -14,7 +14,7 @@ end it 'returns customers with exactly the required fields' do - keys = %w(id name address city state postal_code phone registered_at) + keys = %w(id name address city state postal_code phone registered_at movies_checked_out_count) keys = keys.sort get customers_path body = JSON.parse(response.body) diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 031157f3a..a16e24670 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -32,7 +32,7 @@ describe 'validations' do it "can be created with all valid fields" do - movie = Movie.new(title: "test movie") + movie = Movie.new(title: "test movie", inventory: 4) result = movie.valid? From 910170ec4aa6696f53c5d505fd1e3775f3dd3f45 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Fri, 11 May 2018 00:21:18 -0700 Subject: [PATCH 49/55] fixed some more tests, deleted unnecessary line from movie controller create method --- app/controllers/movies_controller.rb | 4 +- test/controllers/movies_controller_test.rb | 61 ++++++++++----------- test/controllers/rentals_controller_test.rb | 5 +- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index d70360eda..774cb12c8 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -21,8 +21,7 @@ def show def create movie = Movie.new(movie_params) - movie.set_avail_inventory - #todo: write test for this in movies_controller_test + if movie.save # Success render json: { id: movie.id }, status: :ok @@ -30,7 +29,6 @@ def create # Failure render json: { errors: movie.errors.messages }, status: :bad_request end - end private diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index bc0e35707..84d24198b 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -60,45 +60,44 @@ body.must_include "errors" body["errors"].must_include "id" end + end - describe 'create' do - let(:movie_data) { - { - title: "Secret Life of Walter Mitty", - overview: "An employee at Life Mag that daydreams a lot", - release_date: 2013-12-25, inventory: 5, - available_inventory: 0 - } + describe 'create' do + let(:movie_data) { + { + title: "Secret Life of Walter Mitty", + overview: "An employee at Life Mag that daydreams a lot", + release_date: 2013-12-25, inventory: 5 } - it "Creates a new movie" do - before_movie_count = Movie.count + } + it "Creates a new movie" do + before_movie_count = Movie.count - post movies_path, params: { movie: movie_data } - assert_response :success + post movies_path, params: movie_data + assert_response :success - Movie.count.must_equal before_movie_count + 1 + Movie.count.must_equal before_movie_count + 1 - body = JSON.parse(response.body) - body.must_be_kind_of Hash - body.must_include "id" + body = JSON.parse(response.body) + body.must_be_kind_of Hash + body.must_include "id" - # Check that the ID matches - Movie.find(body["id"]).title.must_equal movie_data[:title] - end + # Check that the ID matches + Movie.find(body["id"]).title.must_equal movie_data[:title] + end - it "Returns an error for an invalid movie" do - bad_data = movie_data.clone() - bad_data.delete(:title) - assert_no_difference "Movie.count" do - post movies_path, params: { movie: bad_data } - assert_response :bad_request - end - - body = JSON.parse(response.body) - body.must_be_kind_of Hash - body.must_include "errors" - body["errors"].must_include "title" + it "Returns an error for an invalid movie" do + bad_data = movie_data.clone() + bad_data.delete(:title) + assert_no_difference "Movie.count" do + post movies_path, params: { movie: bad_data } + assert_response :bad_request end + + 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 638465cf4..c05137b23 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -64,11 +64,10 @@ end it 'returns status not_found if rental DNE' do - post check_in_path, params: @params + bad_params = { customer_id: 21394, movie_id: 4208422 } + post check_in_path, params: bad_params assert_response :not_found - # customer movies stays same - # available_inventory stays same end it 'can handle already checked in' do From ce4cddb38bf3fea72bc873791e1bada6c0d36f27 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Fri, 11 May 2018 00:48:53 -0700 Subject: [PATCH 50/55] rewrote relations model tests --- app/controllers/rentals_controller.rb | 1 - test/controllers/rentals_controller_test.rb | 3 --- test/fixtures/customers.yml | 2 +- test/models/customer_test.rb | 13 ++++++++++--- test/models/movie_test.rb | 11 ++++------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 59db5b26d..04d78dbf3 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -40,7 +40,6 @@ def check_in end end - private def rental_params diff --git a/test/controllers/rentals_controller_test.rb b/test/controllers/rentals_controller_test.rb index c05137b23..035642693 100644 --- a/test/controllers/rentals_controller_test.rb +++ b/test/controllers/rentals_controller_test.rb @@ -70,8 +70,5 @@ assert_response :not_found end - it 'can handle already checked in' do - - end end end diff --git a/test/fixtures/customers.yml b/test/fixtures/customers.yml index 7a8eed2bb..7ce682869 100644 --- a/test/fixtures/customers.yml +++ b/test/fixtures/customers.yml @@ -19,7 +19,7 @@ ava: movies_checked_out_count: 3 no_name: - name: + name: Name address: 455 Main Dr city: New York state: NY diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 102c69cb9..32a1c82b2 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -6,14 +6,21 @@ describe 'relations' do it 'checks that a customer already exists' do - ava = customers(:ava) - value(ava).must_be :valid? + customer = Customer.find_by(name: "ava") + customer.must_be_nil + end + + it "connects customer and rental customer_id" do + movie = Movie.first + customer = Customer.first + rental = Rental.new(movie_id: movie.id, customer_id: customer.id) + rental.customer_id.must_equal customer.id end end describe 'validations' do it "can be created with valid info" do - skip + end it "must have a name to be valid" do diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index a16e24670..5bc690f46 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -7,18 +7,15 @@ @customer = Customer.first @movie = Movie.new(title: "test movie") - @movie.customers << @customer end - it 'can connect customer to customer_id' do - skip - # write these for a rental - @movie.customers.last.id.must_equal @customer.id + it "connects customer and rental customer_id" do + movie = Movie.first + rental = Rental.new(movie_id: movie.id, customer_id: @customer.id) + rental.movie_id.must_equal movie.id end it 'has a list of customers' do - skip - # write these for a rental @movie.must_respond_to :customers second_cust = Customer.create!(name: "fake name") @movie.customers << second_cust From f84ab77ffc8caf51b00245868073b373eec6572d Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Fri, 11 May 2018 00:56:35 -0700 Subject: [PATCH 51/55] added two validation tests to customer --- test/models/customer_test.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 32a1c82b2..9216e022a 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -20,7 +20,11 @@ describe 'validations' do it "can be created with valid info" do - + customer = Customer.new(name: "test customer") + + result = customer.valid? + + result.must_equal true end it "must have a name to be valid" do @@ -29,7 +33,13 @@ end it 'is invalid if movies_checked_out_count is less than zero' do - # cannot be created with 0 + customer = customers(:no_name) + + customer.dec_checked_out_count + customer.dec_checked_out_count + customer.dec_checked_out_count + + customer.wont_be :valid? end end end From db30769b30e17ac393bcafcedac5c2f1a440047b Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Fri, 11 May 2018 01:07:25 -0700 Subject: [PATCH 52/55] wrote tests for customer check_out_count methods --- test/models/customer_test.rb | 22 +++++++++++++++++++++- test/models/movie_test.rb | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 9216e022a..1f23bb7d1 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -34,7 +34,7 @@ it 'is invalid if movies_checked_out_count is less than zero' do customer = customers(:no_name) - + customer.dec_checked_out_count customer.dec_checked_out_count customer.dec_checked_out_count @@ -42,4 +42,24 @@ customer.wont_be :valid? end end + + describe 'checked_out_count methods' do + it 'decreases customer check out count by 1' do + customer = Customer.first + before_count = customer.movies_checked_out_count + + customer.dec_checked_out_count + + customer.movies_checked_out_count.must_equal before_count - 1 + end + + it 'increases available inventory of a movie by 1' do + customer = Customer.first + before_count = customer.movies_checked_out_count + + customer.inc_checked_out_count + + customer.movies_checked_out_count.must_equal before_count + 1 + end + end end diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 5bc690f46..3d3823c86 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -96,7 +96,7 @@ end - it 'throws an error if available_inventory is greater than inventory' do + it 'invalid if available_inventory is greater than inventory' do movie = Movie.first stock = movie.inventory From 92e13e01bd37fcbbc4d9f621e4e6467809ae8065 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Fri, 11 May 2018 01:19:05 -0700 Subject: [PATCH 53/55] wrote validation tests for rentals --- app/controllers/rentals_controller.rb | 6 ++++++ test/models/rental_test.rb | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 04d78dbf3..887152aaa 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -13,6 +13,9 @@ def check_out movie = Movie.find_by(id: rental.movie_id) movie.dec_avail_inventory + customer = Customer.find_by(id: rental.customer_id) + customer.inc_checked_out_count + render json: { id: rental.id }, status: :ok else render json: { errors: rental.errors.messages }, status: :bad_request @@ -32,6 +35,9 @@ def check_in # logic for increasing available_inventory movie = Movie.find_by(id: rental.movie_id) movie.inc_avail_inventory + + customer = Customer.find_by(id: rental.customer_id) + customer.dec_checked_out_count # logic for increasing available_inventory rental.check_in = Date.today rental.save diff --git a/test/models/rental_test.rb b/test/models/rental_test.rb index 09fab89b1..d09b21f54 100644 --- a/test/models/rental_test.rb +++ b/test/models/rental_test.rb @@ -1,7 +1,6 @@ require "test_helper" describe Rental do - let(:rental) { rentals(:one) } it "must be valid" do # rental = rentals(:one) @@ -13,10 +12,20 @@ end it "will be invalid without customer_id" do - skip + movie = Movie.first + rental = Rental.new(movie_id: movie.id) + + result = rental.valid? + + result.must_equal false end it "will be invalid without movie_id" do - skip + customer = Customer.first + rental = Rental.new(customer_id: customer.id) + + result = rental.valid? + + result.must_equal false end end From 056bb8bffadc487b2d0d17d73152c2f65a29fc74 Mon Sep 17 00:00:00 2001 From: knockknockhusthere Date: Fri, 11 May 2018 11:55:28 -0700 Subject: [PATCH 54/55] fixed rental controller test, edited rentals controller to pass postman smoke tests --- app/controllers/rentals_controller.rb | 11 +++++++---- app/models/customer.rb | 4 ++-- app/models/movie.rb | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 887152aaa..90d1aa34d 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -12,9 +12,11 @@ def check_out if rental.save movie = Movie.find_by(id: rental.movie_id) movie.dec_avail_inventory + movie.save customer = Customer.find_by(id: rental.customer_id) customer.inc_checked_out_count + customer.save render json: { id: rental.id }, status: :ok else @@ -29,16 +31,17 @@ def check_in render json: { "errors": { "id": ["No rental with #{params[:id]}"] - }, status: :not_found - } + } + }, status: :not_found else - # logic for increasing available_inventory movie = Movie.find_by(id: rental.movie_id) movie.inc_avail_inventory + movie.save customer = Customer.find_by(id: rental.customer_id) customer.dec_checked_out_count - # logic for increasing available_inventory + customer.save + rental.check_in = Date.today rental.save diff --git a/app/models/customer.rb b/app/models/customer.rb index a6193b03c..d067716ee 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -11,12 +11,12 @@ class Customer < ApplicationRecord end def dec_checked_out_count - # this method decrements available_inventory for that movie by 1; we call this in movies_controller check_out method + self.movies_checked_out_count -= 1 end def inc_checked_out_count - # this method increments available_inventory for that movie by 1; we call this in movies_controller check_in method + self.movies_checked_out_count += 1 end diff --git a/app/models/movie.rb b/app/models/movie.rb index bf94345d4..1b6779823 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -5,7 +5,7 @@ class Movie < ApplicationRecord validates :title, presence: true validate :available_inventory_cannot_be_greater_than_inventory - validates :available_inventory, numericality: { only_integer: true, greater_than_or_equal_to: 0} + validates :available_inventory, numericality: { only_integer: true, greater_than_or_equal_to: 0 } validates :inventory, numericality: { only_integer: true, greater_than: 0 } From d7d460721923dfab45a611d63af9a1030444f4e3 Mon Sep 17 00:00:00 2001 From: 0velez0 Date: Fri, 11 May 2018 15:57:19 -0700 Subject: [PATCH 55/55] add extra test - invalid if available_inventory is zero or less --- test/models/movie_test.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 3d3823c86..937290bd6 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -55,11 +55,13 @@ end it 'is invalid if available_inventory is negative' do - #try to check out when available_inventory is 0 - end + movie= movies(:gijane) - it 'is invalid if inventory is zero or less' do - # cannot be created with 0 + movie.dec_avail_inventory + movie.dec_avail_inventory + movie.dec_avail_inventory + + movie.wont_be :valid? end end