From 96fc8d88ca7e6f29c6b80fa26fd52e49fede0253 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Wed, 17 Oct 2018 15:25:28 -0700 Subject: [PATCH 001/347] Create new rails --- .gitignore | 27 ++ .ruby-version | 1 + Gemfile | 81 +++++ Gemfile.lock | 277 ++++++++++++++++++ Guardfile | 9 + Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 20 ++ app/assets/javascripts/cable.js | 13 + app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/application.scss | 18 ++ 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/helpers/application_helper.rb | 2 + 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/application.html.erb | 15 + 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 | 36 +++ bin/spring | 17 ++ bin/update | 31 ++ bin/yarn | 11 + config.ru | 5 + config/application.rb | 25 ++ config/boot.rb | 4 + config/cable.yml | 10 + config/credentials.yml.enc | 1 + config/database.yml | 85 ++++++ config/environment.rb | 5 + config/environments/development.rb | 61 ++++ config/environments/production.rb | 94 ++++++ config/environments/test.rb | 46 +++ config/initializers/action_view.rb | 1 + .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 + config/initializers/backtrace_silencers.rb | 7 + .../initializers/content_security_policy.rb | 25 ++ config/initializers/cookies_serializer.rb | 5 + .../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 | 34 +++ config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 +++ db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 5 + public/404.html | 67 +++++ public/422.html | 67 +++++ public/500.html | 66 +++++ public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/favicon.ico | 0 public/robots.txt | 1 + storage/.keep | 0 test/application_system_test_case.rb | 5 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 24 ++ tmp/.keep | 0 vendor/.keep | 0 81 files changed, 1407 insertions(+) create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 Rakefile create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/cable.js create mode 100644 app/assets/javascripts/channels/.keep create mode 100644 app/assets/stylesheets/application.scss 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/helpers/application_helper.rb 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/application.html.erb 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 100755 bin/yarn create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/action_view.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/content_security_policy.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/spring.rb create mode 100644 config/storage.yml create mode 100644 db/seeds.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 package.json create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/application_system_test_case.rb create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.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 0000000000..18b43c9cd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore uploaded files in development +/storage/* +!/storage/.keep + +/node_modules +/yarn-error.log + +/public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..25c81fe399 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-2.5.1 \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..6219256bd8 --- /dev/null +++ b/Gemfile @@ -0,0 +1,81 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.5.1' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.1' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'mini_racer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +# gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# 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 ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false + +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 + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + 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 + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of chromedriver to run system tests with Chrome + gem 'chromedriver-helper' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'jquery-rails' +gem 'jquery-turbolinks' +gem 'bootstrap', '~> 4.1.3' +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'better_errors' + gem 'binding_of_caller' + gem 'guard' + gem 'guard-minitest' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..51100b2a1d --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,277 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.2.1) + actionpack (= 5.2.1) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.1) + actionpack (= 5.2.1) + actionview (= 5.2.1) + activejob (= 5.2.1) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.2.1) + actionview (= 5.2.1) + activesupport (= 5.2.1) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.1) + activesupport (= 5.2.1) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.1) + activesupport (= 5.2.1) + globalid (>= 0.3.6) + activemodel (5.2.1) + activesupport (= 5.2.1) + activerecord (5.2.1) + activemodel (= 5.2.1) + activesupport (= 5.2.1) + arel (>= 9.0) + activestorage (5.2.1) + actionpack (= 5.2.1) + activerecord (= 5.2.1) + marcel (~> 0.3.1) + activesupport (5.2.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + ansi (1.5.0) + archive-zip (0.11.0) + io-like (~> 0.3.0) + arel (9.0.0) + autoprefixer-rails (9.2.1) + execjs + better_errors (2.5.0) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) + bindex (0.5.0) + binding_of_caller (0.8.0) + debug_inspector (>= 0.0.1) + bootsnap (1.3.2) + msgpack (~> 1.0) + bootstrap (4.1.3) + autoprefixer-rails (>= 6.0.3) + popper_js (>= 1.12.9, < 2) + sass (>= 3.5.2) + builder (3.2.3) + byebug (10.0.2) + capybara (3.9.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + xpath (~> 3.1) + childprocess (0.9.0) + ffi (~> 1.0, >= 1.0.11) + chromedriver-helper (2.1.0) + archive-zip (~> 0.10) + nokogiri (~> 1.8) + coderay (1.1.2) + concurrent-ruby (1.0.5) + crass (1.0.4) + debug_inspector (0.0.3) + erubi (1.7.1) + execjs (2.7.0) + ffi (1.9.25) + formatador (0.2.5) + globalid (0.4.1) + activesupport (>= 4.2.0) + guard (2.14.2) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-minitest (2.4.6) + guard-compat (~> 1.2) + minitest (>= 3.0) + i18n (1.1.1) + concurrent-ruby (~> 1.0) + io-like (0.3.0) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + jquery-rails (4.3.3) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks + 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) + lumberjack (1.0.13) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (0.9.0) + mimemagic (0.3.2) + mini_mime (1.0.1) + mini_portile2 (2.3.0) + minitest (5.11.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.3.5) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.2.4) + multi_json (1.13.1) + nenv (0.3.0) + nio4r (2.3.1) + nokogiri (1.8.5) + mini_portile2 (~> 2.3.0) + notiffany (0.1.1) + nenv (~> 0.1) + shellany (~> 0.0) + pg (1.1.3) + popper_js (1.14.3) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + public_suffix (3.0.3) + puma (3.12.0) + rack (2.0.5) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.1) + actioncable (= 5.2.1) + actionmailer (= 5.2.1) + actionpack (= 5.2.1) + actionview (= 5.2.1) + activejob (= 5.2.1) + activemodel (= 5.2.1) + activerecord (= 5.2.1) + activestorage (= 5.2.1) + activesupport (= 5.2.1) + bundler (>= 1.3.0) + railties (= 5.2.1) + 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.2.1) + actionpack (= 5.2.1) + activesupport (= 5.2.1) + method_source + rake (>= 0.8.7) + thor (>= 0.19.0, < 2.0) + rake (12.3.1) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + ruby-progressbar (1.10.0) + ruby_dep (1.5.0) + rubyzip (1.2.2) + sass (3.6.0) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sass-rails (5.0.7) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + selenium-webdriver (3.14.1) + childprocess (~> 0.5) + rubyzip (~> 1.2, >= 1.2.2) + shellany (0.0.1) + 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.2) + 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) + tilt (2.0.8) + turbolinks (5.2.0) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + uglifier (4.1.19) + execjs (>= 0.3.0, < 3) + web-console (3.7.0) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + websocket-driver (0.7.0) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.3) + xpath (3.2.0) + nokogiri (~> 1.8) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + bootsnap (>= 1.1.0) + bootstrap (~> 4.1.3) + byebug + capybara (>= 2.15) + chromedriver-helper + guard + guard-minitest + jbuilder (~> 2.5) + jquery-rails + jquery-turbolinks + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 3.11) + rails (~> 5.2.1) + sass-rails (~> 5.0) + selenium-webdriver + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +RUBY VERSION + ruby 2.5.1p57 + +BUNDLED WITH + 1.16.2 diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000000..e34f706f4a --- /dev/null +++ b/Guardfile @@ -0,0 +1,9 @@ +guard :minitest, autorun: false, spring: true do + watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' } + watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" } + watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" } + watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" } + watch(%r{^test/.+_test.rb$}) + watch(%r{^test/test_helper.rb$}) { 'test' } +end diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /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/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 0000000000..b16e53d6d5 --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000000..4f73c21a7d --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,20 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's +// vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. + //= require jquery3 + //= require popper + //= require bootstrap-sprockets + +// +//= require rails-ujs +//= require activestorage +//= require turbolinks +//= require_tree . diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js new file mode 100644 index 0000000000..739aa5f022 --- /dev/null +++ b/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/app/assets/javascripts/channels/.keep b/app/assets/javascripts/channels/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss new file mode 100644 index 0000000000..8b1701e581 --- /dev/null +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,18 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + */ + +/* Custom bootstrap variables must be set or imported *before* bootstrap. */ +@import "bootstrap"; +/* Import scss content */ +@import "**/*"; diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /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 0000000000..0ff5442f47 --- /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 0000000000..09705d12ab --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..a009ace51c --- /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 0000000000..286b2239d1 --- /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 0000000000..10a4cba84d --- /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 0000000000..e69de29bb2 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..f18f1b6820 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,15 @@ + + + + Betsy + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /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 0000000000..37f0bddbd7 --- /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 0000000000..f19acf5b5c --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..5badb2fde0 --- /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 0000000000..d87d5f5781 --- /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 0000000000..94fd4d7977 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +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') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + # 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 0000000000..fb2ec2ebb4 --- /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 0000000000..58bfaed518 --- /dev/null +++ b/bin/update @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +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') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + 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/bin/yarn b/bin/yarn new file mode 100755 index 0000000000..460dd565b4 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /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 0000000000..5c09a3eefc --- /dev/null +++ b/config/application.rb @@ -0,0 +1,25 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Betsy + 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.2 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000000..b9e460cef3 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000000..dd2a324c68 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: betsy_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 0000000000..0c34020ecf --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +GMbIIAQ/5NRffX7iCiCBcZuW2u8rzZi5DaeBXluszYpMVKcav3AkJwB8CejAmhS94WtBtZqL9eBmTXwYr55znE7fd2qwCwJ7teizjst/V4aZAimUW1osSkxo28I6QjtHz67QZxmHhafDHZu5H7p9R04sIWeaw1sZPz59OCcYQb4XintKfAYKTkMV01P5LScnaTFwWi76KuT0xFhLd094CAFKIPcPIc4WMuMfkVsBVBa1SFSPhrHBt7dNVWH628rw1N5AlmdiybSn5lumEcJjzSQkG34xEL+83s3TZDCwMHCqZN6d0cwueJ8NiKGs3GTaP3VBLxKIz4SaEuQxOKk7JEs7ljagt/tJRx7Oz/+yxVSqg94hqYdRQKW8FBjhMnDZQvV3vRvC700I3A4yuhb1XrV2OX7HuDFdh/Lw--x2kYxhic6KQpmp1d--W1YDfTdRLPCag+7y0G50UQ== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..6903bb6083 --- /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: betsy_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: betsy + + # 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: betsy_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: betsy_production + username: betsy + password: <%= ENV['BETSY_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /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 0000000000..1311e3e4ef --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,61 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..5f6f3058c6 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,94 @@ +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 + + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "betsy_#{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 0000000000..0a38fd3ce9 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,46 @@ +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.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 + + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 0000000000..142d382f87 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1 @@ +Rails.application.config.action_view.form_with_generates_remote_forms = false diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..89d2efab2b --- /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/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..4b828e80cb --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /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/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000000..d3bcaa5ec8 --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,25 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /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 0000000000..ac033bf9dc --- /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 0000000000..dc1899682b --- /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 0000000000..bbfc3961bf --- /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 0000000000..decc5a8573 --- /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 0000000000..a5eccf816b --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,34 @@ +# 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. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..787824f888 --- /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/spring.rb b/config/spring.rb new file mode 100644 index 0000000000..9fa7863f99 --- /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/config/storage.yml b/config/storage.yml new file mode 100644 index 0000000000..d32f76e8fb --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..1beea2accd --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# 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) diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..f874acf437 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "betsy", + "private": true, + "dependencies": {} +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..37b576a4a0 --- /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/storage/.keep b/storage/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 0000000000..d19212abd5 --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..2b5172a7d6 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,24 @@ +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 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2 From b5729529c60c7b77544605f1b56208c61cf516be Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Wed, 17 Oct 2018 15:42:21 -0700 Subject: [PATCH 002/347] add order model and that has_many order_item --- app/models/order.rb | 3 +++ db/migrate/20181017223934_create_orders.rb | 15 +++++++++++ db/schema.rb | 30 ++++++++++++++++++++++ test/fixtures/orders.yml | 19 ++++++++++++++ test/models/order_test.rb | 9 +++++++ 5 files changed, 76 insertions(+) create mode 100644 app/models/order.rb create mode 100644 db/migrate/20181017223934_create_orders.rb create mode 100644 db/schema.rb create mode 100644 test/fixtures/orders.yml create mode 100644 test/models/order_test.rb diff --git a/app/models/order.rb b/app/models/order.rb new file mode 100644 index 0000000000..b8ff4b192c --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,3 @@ +class Order < ApplicationRecord + has_many :order_items +end diff --git a/db/migrate/20181017223934_create_orders.rb b/db/migrate/20181017223934_create_orders.rb new file mode 100644 index 0000000000..3f283e3f1b --- /dev/null +++ b/db/migrate/20181017223934_create_orders.rb @@ -0,0 +1,15 @@ +class CreateOrders < ActiveRecord::Migration[5.2] + def change + create_table :orders do |t| + t.string :email + t.string :mailing_address + t.integer :cc + t.string :cc_name + t.string :cc_expiration + t.integer :cvv + t.integer :zip + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..f0f6e83144 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,30 @@ +# 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: 2018_10_17_223934) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "orders", force: :cascade do |t| + t.string "email" + t.string "mailing_address" + t.integer "cc" + t.string "cc_name" + t.string "cc_expiration" + t.integer "cvv" + t.integer "zip" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml new file mode 100644 index 0000000000..211cf5eef8 --- /dev/null +++ b/test/fixtures/orders.yml @@ -0,0 +1,19 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + email: MyString + mailing_address: MyString + cc: 1 + cc_name: MyString + cc_expiration: MyString + cvv: 1 + zip: 1 + +two: + email: MyString + mailing_address: MyString + cc: 1 + cc_name: MyString + cc_expiration: MyString + cvv: 1 + zip: 1 diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 0000000000..df80f10fb6 --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Order do + let(:order) { Order.new } + + it "must be valid" do + value(order).must_be :valid? + end +end From c4cdd93a8f328d98dcfeb0136b93f6d9f8572688 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Wed, 17 Oct 2018 15:45:49 -0700 Subject: [PATCH 003/347] Create Product and Category models and joined table --- app/models/category.rb | 2 + app/models/product.rb | 2 + db/migrate/20181017223503_create_products.rb | 11 ++++++ .../20181017223604_create_categories.rb | 9 +++++ .../20181017223750_create_join_table.rb | 7 ++++ db/schema.rb | 38 +++++++++++++++++++ test/fixtures/categories.yml | 7 ++++ test/fixtures/products.yml | 11 ++++++ test/models/category_test.rb | 9 +++++ test/models/product_test.rb | 9 +++++ 10 files changed, 105 insertions(+) create mode 100644 app/models/category.rb create mode 100644 app/models/product.rb create mode 100644 db/migrate/20181017223503_create_products.rb create mode 100644 db/migrate/20181017223604_create_categories.rb create mode 100644 db/migrate/20181017223750_create_join_table.rb create mode 100644 db/schema.rb create mode 100644 test/fixtures/categories.yml create mode 100644 test/fixtures/products.yml create mode 100644 test/models/category_test.rb create mode 100644 test/models/product_test.rb diff --git a/app/models/category.rb b/app/models/category.rb new file mode 100644 index 0000000000..54cb6aee3f --- /dev/null +++ b/app/models/category.rb @@ -0,0 +1,2 @@ +class Category < ApplicationRecord +end diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..35a85acab3 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,2 @@ +class Product < ApplicationRecord +end diff --git a/db/migrate/20181017223503_create_products.rb b/db/migrate/20181017223503_create_products.rb new file mode 100644 index 0000000000..f434bdf580 --- /dev/null +++ b/db/migrate/20181017223503_create_products.rb @@ -0,0 +1,11 @@ +class CreateProducts < ActiveRecord::Migration[5.2] + def change + create_table :products do |t| + t.string :name + t.float :price + t.string :description + + t.timestamps + end + end +end diff --git a/db/migrate/20181017223604_create_categories.rb b/db/migrate/20181017223604_create_categories.rb new file mode 100644 index 0000000000..6ccc3914a0 --- /dev/null +++ b/db/migrate/20181017223604_create_categories.rb @@ -0,0 +1,9 @@ +class CreateCategories < ActiveRecord::Migration[5.2] + def change + create_table :categories do |t| + t.string :name + + t.timestamps + end + end +end diff --git a/db/migrate/20181017223750_create_join_table.rb b/db/migrate/20181017223750_create_join_table.rb new file mode 100644 index 0000000000..d5460e6b20 --- /dev/null +++ b/db/migrate/20181017223750_create_join_table.rb @@ -0,0 +1,7 @@ +class CreateJoinTable < ActiveRecord::Migration[5.2] + def change + create_join_table :products, :categories do |t| + t.index [:category_id, :product_id] + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..8ba5f2a709 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,38 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2018_10_17_223750) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "categories", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "categories_products", id: false, force: :cascade do |t| + t.bigint "product_id", null: false + t.bigint "category_id", null: false + t.index ["category_id", "product_id"], name: "index_categories_products_on_category_id_and_product_id" + end + + create_table "products", force: :cascade do |t| + t.string "name" + t.float "price" + t.string "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 0000000000..56066c68af --- /dev/null +++ b/test/fixtures/categories.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..f049a8bba9 --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + price: 1.5 + description: MyString + +two: + name: MyString + price: 1.5 + description: MyString diff --git a/test/models/category_test.rb b/test/models/category_test.rb new file mode 100644 index 0000000000..781320ad8e --- /dev/null +++ b/test/models/category_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Category do + let(:category) { Category.new } + + it "must be valid" do + value(category).must_be :valid? + end +end diff --git a/test/models/product_test.rb b/test/models/product_test.rb new file mode 100644 index 0000000000..a618b0a156 --- /dev/null +++ b/test/models/product_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Product do + let(:product) { Product.new } + + it "must be valid" do + value(product).must_be :valid? + end +end From 6a05b2074ef3731d553bab49576d44d5eafd3dee Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Wed, 17 Oct 2018 15:45:51 -0700 Subject: [PATCH 004/347] added order item model --- app/models/order_item.rb | 2 ++ .../20181017223753_create_order_items.rb | 10 ++++++++ ...81017224245_add_order_key_to_order_item.rb | 4 +++ db/schema.rb | 25 +++++++++++++++++++ test/fixtures/order_items.yml | 9 +++++++ test/models/order_item_test.rb | 9 +++++++ 6 files changed, 59 insertions(+) create mode 100644 app/models/order_item.rb create mode 100644 db/migrate/20181017223753_create_order_items.rb create mode 100644 db/migrate/20181017224245_add_order_key_to_order_item.rb create mode 100644 db/schema.rb create mode 100644 test/fixtures/order_items.yml create mode 100644 test/models/order_item_test.rb diff --git a/app/models/order_item.rb b/app/models/order_item.rb new file mode 100644 index 0000000000..acc6099fd0 --- /dev/null +++ b/app/models/order_item.rb @@ -0,0 +1,2 @@ +class OrderItem < ApplicationRecord +end diff --git a/db/migrate/20181017223753_create_order_items.rb b/db/migrate/20181017223753_create_order_items.rb new file mode 100644 index 0000000000..a8371730a8 --- /dev/null +++ b/db/migrate/20181017223753_create_order_items.rb @@ -0,0 +1,10 @@ +class CreateOrderItems < ActiveRecord::Migration[5.2] + def change + create_table :order_items do |t| + t.integer :quantity + t.string :status + + t.timestamps + end + end +end diff --git a/db/migrate/20181017224245_add_order_key_to_order_item.rb b/db/migrate/20181017224245_add_order_key_to_order_item.rb new file mode 100644 index 0000000000..140e199e1b --- /dev/null +++ b/db/migrate/20181017224245_add_order_key_to_order_item.rb @@ -0,0 +1,4 @@ +class AddOrderKeyToOrderItem < ActiveRecord::Migration[5.2] + def change + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..363d1ef07c --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,25 @@ +# 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: 2018_10_17_224245) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "order_items", force: :cascade do |t| + t.integer "quantity" + t.string "status" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml new file mode 100644 index 0000000000..8f70aabb93 --- /dev/null +++ b/test/fixtures/order_items.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + quanity: 1 + status: + +two: + quanity: 1 + status: diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb new file mode 100644 index 0000000000..19a9bf8f58 --- /dev/null +++ b/test/models/order_item_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe OrderItem do + let(:order_item) { OrderItem.new } + + it "must be valid" do + value(order_item).must_be :valid? + end +end From 2250042c832c5706ef085e80b864661353b1abbd Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Wed, 17 Oct 2018 15:52:07 -0700 Subject: [PATCH 005/347] generate model for merchant --- app/models/merchant.rb | 3 +++ db/migrate/20181017225013_create_merchants.rb | 10 +++++++++ db/schema.rb | 22 ++++++++++++++----- test/fixtures/merchants.yml | 9 ++++++++ test/models/merchant_test.rb | 9 ++++++++ 5 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 app/models/merchant.rb create mode 100644 db/migrate/20181017225013_create_merchants.rb create mode 100644 test/fixtures/merchants.yml create mode 100644 test/models/merchant_test.rb diff --git a/app/models/merchant.rb b/app/models/merchant.rb new file mode 100644 index 0000000000..07aacc445d --- /dev/null +++ b/app/models/merchant.rb @@ -0,0 +1,3 @@ +class Merchant < ApplicationRecord + has_many :products +end diff --git a/db/migrate/20181017225013_create_merchants.rb b/db/migrate/20181017225013_create_merchants.rb new file mode 100644 index 0000000000..6fbed1393c --- /dev/null +++ b/db/migrate/20181017225013_create_merchants.rb @@ -0,0 +1,10 @@ +class CreateMerchants < ActiveRecord::Migration[5.2] + def change + create_table :merchants do |t| + t.string :username + t.string :email + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 5c5f595fb7..1f85c86208 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,8 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 2018_10_17_223934) do +ActiveRecord::Schema.define(version: 2018_10_17_225013) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -28,10 +27,13 @@ t.index ["category_id", "product_id"], name: "index_categories_products_on_category_id_and_product_id" end - create_table "products", force: :cascade do |t| - t.string "name" - t.float "price" - t.string "description" + create_table "merchants", force: :cascade do |t| + t.string "username" + t.string "email" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "orders", force: :cascade do |t| t.string "email" t.string "mailing_address" @@ -44,4 +46,12 @@ t.datetime "updated_at", null: false end + create_table "products", force: :cascade do |t| + t.string "name" + t.float "price" + t.string "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml new file mode 100644 index 0000000000..7af41d4fbe --- /dev/null +++ b/test/fixtures/merchants.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + username: MyString + email: MyString + +two: + username: MyString + email: MyString diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb new file mode 100644 index 0000000000..1cc99d985f --- /dev/null +++ b/test/models/merchant_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Merchant do + let(:merchant) { Merchant.new } + + it "must be valid" do + value(merchant).must_be :valid? + end +end From 6c9b93ea18d7af9a5acb5da3ab6b5ee79d409c67 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Wed, 17 Oct 2018 17:41:07 -0700 Subject: [PATCH 006/347] added product and order foreign keys to order items model --- app/models/order_item.rb | 2 ++ db/migrate/20181018003057_add_product_id_to_order_item.rb | 6 ++++++ db/schema.rb | 8 +++++++- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20181018003057_add_product_id_to_order_item.rb diff --git a/app/models/order_item.rb b/app/models/order_item.rb index acc6099fd0..570fad96f7 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,2 +1,4 @@ class OrderItem < ApplicationRecord + has_many :products + belongs_to :orders end diff --git a/db/migrate/20181018003057_add_product_id_to_order_item.rb b/db/migrate/20181018003057_add_product_id_to_order_item.rb new file mode 100644 index 0000000000..cbbff4ef0f --- /dev/null +++ b/db/migrate/20181018003057_add_product_id_to_order_item.rb @@ -0,0 +1,6 @@ +class AddProductIdToOrderItem < ActiveRecord::Migration[5.2] + def change + add_reference :products, :order_items, foreign_key: true + add_reference :orders, :order_items, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 49279ee7fb..56644029ca 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: 2018_10_17_225013) do +ActiveRecord::Schema.define(version: 2018_10_18_003057) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -51,6 +51,8 @@ t.integer "zip" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "order_items_id" + t.index ["order_items_id"], name: "index_orders_on_order_items_id" end create_table "products", force: :cascade do |t| @@ -59,6 +61,10 @@ t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "order_items_id" + t.index ["order_items_id"], name: "index_products_on_order_items_id" end + add_foreign_key "orders", "order_items", column: "order_items_id" + add_foreign_key "products", "order_items", column: "order_items_id" end From ca116fa18ba3d53d1d47fb480dfdbd01b192bf84 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Wed, 17 Oct 2018 18:05:17 -0700 Subject: [PATCH 007/347] Reviews table with foreign key migrations --- app/models/product.rb | 1 + app/models/review.rb | 4 ++++ db/migrate/20181018003449_create_reviews.rb | 10 ++++++++++ .../20181018004819_add_foreign_key_to_review.rb | 5 +++++ db/schema.rb | 12 +++++++++++- test/fixtures/reviews.yml | 9 +++++++++ test/models/review_test.rb | 9 +++++++++ 7 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 app/models/review.rb create mode 100644 db/migrate/20181018003449_create_reviews.rb create mode 100644 db/migrate/20181018004819_add_foreign_key_to_review.rb create mode 100644 test/fixtures/reviews.yml create mode 100644 test/models/review_test.rb diff --git a/app/models/product.rb b/app/models/product.rb index 35a85acab3..27481067b5 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,2 +1,3 @@ class Product < ApplicationRecord + end diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..bbfa5faf1b --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,4 @@ +class Review < ApplicationRecord +belongs_to :product + +end diff --git a/db/migrate/20181018003449_create_reviews.rb b/db/migrate/20181018003449_create_reviews.rb new file mode 100644 index 0000000000..b3b1f0c445 --- /dev/null +++ b/db/migrate/20181018003449_create_reviews.rb @@ -0,0 +1,10 @@ +class CreateReviews < ActiveRecord::Migration[5.2] + def change + create_table :reviews do |t| + t.integer :rating + t.string :description + + t.timestamps + end + end +end diff --git a/db/migrate/20181018004819_add_foreign_key_to_review.rb b/db/migrate/20181018004819_add_foreign_key_to_review.rb new file mode 100644 index 0000000000..e9e799df88 --- /dev/null +++ b/db/migrate/20181018004819_add_foreign_key_to_review.rb @@ -0,0 +1,5 @@ +class AddForeignKeyToReview < ActiveRecord::Migration[5.2] + def change + add_reference :reviews, :products, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 56644029ca..9c756385ee 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: 2018_10_18_003057) do +ActiveRecord::Schema.define(version: 2018_10_18_004819) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -65,6 +65,16 @@ t.index ["order_items_id"], name: "index_products_on_order_items_id" end + create_table "reviews", force: :cascade do |t| + t.integer "rating" + t.string "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.bigint "products_id" + t.index ["products_id"], name: "index_reviews_on_products_id" + end + add_foreign_key "orders", "order_items", column: "order_items_id" add_foreign_key "products", "order_items", column: "order_items_id" + add_foreign_key "reviews", "products", column: "products_id" end diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000..e0c8abf962 --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + rating: + description: MyString + +two: + rating: + description: MyString diff --git a/test/models/review_test.rb b/test/models/review_test.rb new file mode 100644 index 0000000000..ce8378a033 --- /dev/null +++ b/test/models/review_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Review do + let(:review) { Review.new } + + it "must be valid" do + value(review).must_be :valid? + end +end From f32c42e98c72f11c4b660e9d6e43b08dd481a7b5 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Wed, 17 Oct 2018 20:16:11 -0700 Subject: [PATCH 008/347] added product relationships --- app/models/product.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/models/product.rb b/app/models/product.rb index 27481067b5..6a804d704a 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,3 +1,5 @@ class Product < ApplicationRecord - + has_many :order_items + has_many :reviews + belongs_to :merchants end From 8798affc6ed7bc2b0671c32f5ad4802c761e657f Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 10:08:30 -0700 Subject: [PATCH 009/347] accidental bad fkeys in product and order and not order items. fixed it --- ...or_order_items_replace_with_order_product_id.rb | 9 +++++++++ db/schema.rb | 14 +++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20181018170301_delete_bad_fkeys_for_order_items_replace_with_order_product_id.rb diff --git a/db/migrate/20181018170301_delete_bad_fkeys_for_order_items_replace_with_order_product_id.rb b/db/migrate/20181018170301_delete_bad_fkeys_for_order_items_replace_with_order_product_id.rb new file mode 100644 index 0000000000..2c3a2d144f --- /dev/null +++ b/db/migrate/20181018170301_delete_bad_fkeys_for_order_items_replace_with_order_product_id.rb @@ -0,0 +1,9 @@ +class DeleteBadFkeysForOrderItemsReplaceWithOrderProductId < ActiveRecord::Migration[5.2] + def change + remove_reference :products, :order_items, foreign_key: true + remove_reference :orders, :order_items, foreign_key: true + + add_reference :order_items, :products, foreign_key: true + add_reference :order_items, :orders, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 9c756385ee..dd78e3c7b0 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: 2018_10_18_004819) do +ActiveRecord::Schema.define(version: 2018_10_18_170301) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -39,6 +39,10 @@ t.string "status" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "products_id" + t.bigint "orders_id" + t.index ["orders_id"], name: "index_order_items_on_orders_id" + t.index ["products_id"], name: "index_order_items_on_products_id" end create_table "orders", force: :cascade do |t| @@ -51,8 +55,6 @@ t.integer "zip" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.bigint "order_items_id" - t.index ["order_items_id"], name: "index_orders_on_order_items_id" end create_table "products", force: :cascade do |t| @@ -61,8 +63,6 @@ t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.bigint "order_items_id" - t.index ["order_items_id"], name: "index_products_on_order_items_id" end create_table "reviews", force: :cascade do |t| @@ -74,7 +74,7 @@ t.index ["products_id"], name: "index_reviews_on_products_id" end - add_foreign_key "orders", "order_items", column: "order_items_id" - add_foreign_key "products", "order_items", column: "order_items_id" + add_foreign_key "order_items", "orders", column: "orders_id" + add_foreign_key "order_items", "products", column: "products_id" add_foreign_key "reviews", "products", column: "products_id" end From 88b3713057996bbf8843a3c3f881d3f1764da077 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 10:20:36 -0700 Subject: [PATCH 010/347] Add relations --- app/models/category.rb | 1 + app/models/merchant.rb | 1 + app/models/product.rb | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/app/models/category.rb b/app/models/category.rb index 54cb6aee3f..f3218758f1 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,2 +1,3 @@ class Category < ApplicationRecord + has_and_belongs_to_many :products end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 07aacc445d..7decf201d8 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,3 +1,4 @@ class Merchant < ApplicationRecord has_many :products + has_many :order_items through :product end diff --git a/app/models/product.rb b/app/models/product.rb index 35a85acab3..5524936fec 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,2 +1,6 @@ class Product < ApplicationRecord + belongs_to :merchants + has_and_belongs_to_many :categories + has_many :order_items, dependent: :destroy + has_many :reviews, dependent: :destroy end From 96ff5734ea492f99fe3ca82804b6367acb785ac0 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 10:25:28 -0700 Subject: [PATCH 011/347] Edit relationships singular vs plural --- app/models/order_item.rb | 3 ++- app/models/product.rb | 2 +- app/models/review.rb | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 570fad96f7..00e325ef1a 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,4 +1,5 @@ class OrderItem < ApplicationRecord has_many :products - belongs_to :orders + belongs_to :order + has_one :merchant, through: :product end diff --git a/app/models/product.rb b/app/models/product.rb index 5524936fec..0e892b7117 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,5 @@ class Product < ApplicationRecord - belongs_to :merchants + belongs_to :merchant has_and_belongs_to_many :categories has_many :order_items, dependent: :destroy has_many :reviews, dependent: :destroy diff --git a/app/models/review.rb b/app/models/review.rb index bbfa5faf1b..97679be642 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,4 +1,3 @@ class Review < ApplicationRecord belongs_to :product - end From de114cc4c23dd6c0e630661e1fc3e23c9a6904c5 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 10:31:40 -0700 Subject: [PATCH 012/347] Add fkey merchant_id to products --- db/migrate/20181018172853_add_merchant_id_to_products.rb | 5 +++++ db/schema.rb | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20181018172853_add_merchant_id_to_products.rb diff --git a/db/migrate/20181018172853_add_merchant_id_to_products.rb b/db/migrate/20181018172853_add_merchant_id_to_products.rb new file mode 100644 index 0000000000..afcdd3c80b --- /dev/null +++ b/db/migrate/20181018172853_add_merchant_id_to_products.rb @@ -0,0 +1,5 @@ +class AddMerchantIdToProducts < ActiveRecord::Migration[5.2] + def change + add_reference :products, :merchants, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index dd78e3c7b0..181a476aeb 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: 2018_10_18_170301) do +ActiveRecord::Schema.define(version: 2018_10_18_172853) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -63,6 +63,8 @@ t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "merchants_id" + t.index ["merchants_id"], name: "index_products_on_merchants_id" end create_table "reviews", force: :cascade do |t| @@ -76,5 +78,6 @@ add_foreign_key "order_items", "orders", column: "orders_id" add_foreign_key "order_items", "products", column: "products_id" + add_foreign_key "products", "merchants", column: "merchants_id" add_foreign_key "reviews", "products", column: "products_id" end From a1c526d1d45f35b751997923bceb5f4b768229db Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 10:41:22 -0700 Subject: [PATCH 013/347] added routes to project --- config/routes.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 787824f888..0242fb6a2e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,14 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + + resources :order_items, except: [:index] do + resources :orders + end + + resources :merchants, except: [:index] do + resources :products + resources :categories, only: [:new, :create] + end + + resources :reviews, only: [:new, :create] end From 6722812bd9afd142b5a22039965c3cded201abc4 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 10:47:36 -0700 Subject: [PATCH 014/347] adjusted routes so that order items is nested inside orders --- config/routes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 0242fb6a2e..ea945bc738 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,8 +1,8 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :order_items, except: [:index] do - resources :orders + resources :orders do + resources :order_items, except: [:index] end resources :merchants, except: [:index] do From 9431349e4ba42b5a0f49cedb2a6a139a03027504 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 11:08:57 -0700 Subject: [PATCH 015/347] added data to merchant yml file --- test/fixtures/merchants.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index 7af41d4fbe..e7bef6ada4 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -1,9 +1,13 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - username: MyString - email: MyString + username: griffiam + email: sesamestreet@yahoo.com two: - username: MyString - email: MyString + username: yggurlie + email: yggurlie@yahoo.com + +three: + username: maddiemax + email: maddiemaxwell@yahoo.com From 4228519595eb68aef94846c760f650ac0006896a Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 11:21:48 -0700 Subject: [PATCH 016/347] added views and controllers for orders, categories, products, order_items, reviews, merchant --- app/assets/javascripts/categories.js | 2 ++ app/assets/javascripts/order_items.js | 2 ++ app/assets/javascripts/orders.js | 2 ++ app/assets/javascripts/reviews.js | 2 ++ app/assets/stylesheets/categories.scss | 3 ++ app/assets/stylesheets/order_items.scss | 3 ++ app/assets/stylesheets/orders.scss | 3 ++ app/assets/stylesheets/reviews.scss | 3 ++ app/controllers/categories_controller.rb | 7 ++++ app/controllers/order_items_controller.rb | 16 +++++++++ app/controllers/orders_controller.rb | 19 +++++++++++ app/controllers/reviews_controller.rb | 7 ++++ app/helpers/categories_helper.rb | 2 ++ app/helpers/order_items_helper.rb | 2 ++ app/helpers/orders_helper.rb | 2 ++ app/helpers/reviews_helper.rb | 2 ++ app/views/categories/new.html.erb | 2 ++ app/views/order_items/edit.html.erb | 2 ++ app/views/order_items/new.html.erb | 2 ++ app/views/orders/edit.html.erb | 2 ++ app/views/orders/new.html.erb | 2 ++ app/views/orders/show.html.erb | 2 ++ app/views/reviews/new.html.erb | 2 ++ config/routes.rb | 2 +- .../controllers/categories_controller_test.rb | 14 ++++++++ .../order_items_controller_test.rb | 29 ++++++++++++++++ test/controllers/orders_controller_test.rb | 34 +++++++++++++++++++ test/controllers/reviews_controller_test.rb | 14 ++++++++ 28 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/categories.js create mode 100644 app/assets/javascripts/order_items.js create mode 100644 app/assets/javascripts/orders.js create mode 100644 app/assets/javascripts/reviews.js create mode 100644 app/assets/stylesheets/categories.scss create mode 100644 app/assets/stylesheets/order_items.scss create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/assets/stylesheets/reviews.scss create mode 100644 app/controllers/categories_controller.rb create mode 100644 app/controllers/order_items_controller.rb create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/controllers/reviews_controller.rb create mode 100644 app/helpers/categories_helper.rb create mode 100644 app/helpers/order_items_helper.rb create mode 100644 app/helpers/orders_helper.rb create mode 100644 app/helpers/reviews_helper.rb create mode 100644 app/views/categories/new.html.erb create mode 100644 app/views/order_items/edit.html.erb create mode 100644 app/views/order_items/new.html.erb create mode 100644 app/views/orders/edit.html.erb create mode 100644 app/views/orders/new.html.erb create mode 100644 app/views/orders/show.html.erb create mode 100644 app/views/reviews/new.html.erb create mode 100644 test/controllers/categories_controller_test.rb create mode 100644 test/controllers/order_items_controller_test.rb create mode 100644 test/controllers/orders_controller_test.rb create mode 100644 test/controllers/reviews_controller_test.rb diff --git a/app/assets/javascripts/categories.js b/app/assets/javascripts/categories.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/categories.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/order_items.js b/app/assets/javascripts/order_items.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/order_items.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/orders.js b/app/assets/javascripts/orders.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/orders.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/reviews.js b/app/assets/javascripts/reviews.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/reviews.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss new file mode 100644 index 0000000000..ef1657f8c9 --- /dev/null +++ b/app/assets/stylesheets/categories.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the categories controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/order_items.scss b/app/assets/stylesheets/order_items.scss new file mode 100644 index 0000000000..c02e2068ea --- /dev/null +++ b/app/assets/stylesheets/order_items.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the order_items controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss new file mode 100644 index 0000000000..3b0428a94e --- /dev/null +++ b/app/assets/stylesheets/orders.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the orders controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss new file mode 100644 index 0000000000..6ea2454d26 --- /dev/null +++ b/app/assets/stylesheets/reviews.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the reviews controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb new file mode 100644 index 0000000000..0e3d845f08 --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,7 @@ +class CategoriesController < ApplicationController + def new + end + + def create + end +end diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb new file mode 100644 index 0000000000..d47c6f4389 --- /dev/null +++ b/app/controllers/order_items_controller.rb @@ -0,0 +1,16 @@ +class OrderItemsController < ApplicationController + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..b8e0acd9b7 --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,19 @@ +class OrdersController < ApplicationController + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb new file mode 100644 index 0000000000..102b3bb888 --- /dev/null +++ b/app/controllers/reviews_controller.rb @@ -0,0 +1,7 @@ +class ReviewsController < ApplicationController + def new + end + + def create + end +end diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb new file mode 100644 index 0000000000..e06f31554c --- /dev/null +++ b/app/helpers/categories_helper.rb @@ -0,0 +1,2 @@ +module CategoriesHelper +end diff --git a/app/helpers/order_items_helper.rb b/app/helpers/order_items_helper.rb new file mode 100644 index 0000000000..e197528ae1 --- /dev/null +++ b/app/helpers/order_items_helper.rb @@ -0,0 +1,2 @@ +module OrderItemsHelper +end diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb new file mode 100644 index 0000000000..443227fd48 --- /dev/null +++ b/app/helpers/orders_helper.rb @@ -0,0 +1,2 @@ +module OrdersHelper +end diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb new file mode 100644 index 0000000000..682b7b1abc --- /dev/null +++ b/app/helpers/reviews_helper.rb @@ -0,0 +1,2 @@ +module ReviewsHelper +end diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb new file mode 100644 index 0000000000..7e5c27307e --- /dev/null +++ b/app/views/categories/new.html.erb @@ -0,0 +1,2 @@ +

Categories#new

+

Find me in app/views/categories/new.html.erb

diff --git a/app/views/order_items/edit.html.erb b/app/views/order_items/edit.html.erb new file mode 100644 index 0000000000..25ca83799b --- /dev/null +++ b/app/views/order_items/edit.html.erb @@ -0,0 +1,2 @@ +

OrderItems#edit

+

Find me in app/views/order_items/edit.html.erb

diff --git a/app/views/order_items/new.html.erb b/app/views/order_items/new.html.erb new file mode 100644 index 0000000000..a02b812fae --- /dev/null +++ b/app/views/order_items/new.html.erb @@ -0,0 +1,2 @@ +

OrderItems#new

+

Find me in app/views/order_items/new.html.erb

diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb new file mode 100644 index 0000000000..7de9049bee --- /dev/null +++ b/app/views/orders/edit.html.erb @@ -0,0 +1,2 @@ +

Orders#edit

+

Find me in app/views/orders/edit.html.erb

diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb new file mode 100644 index 0000000000..1bc27609ce --- /dev/null +++ b/app/views/orders/new.html.erb @@ -0,0 +1,2 @@ +

Orders#new

+

Find me in app/views/orders/new.html.erb

diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb new file mode 100644 index 0000000000..22eb495f6f --- /dev/null +++ b/app/views/orders/show.html.erb @@ -0,0 +1,2 @@ +

Orders#show

+

Find me in app/views/orders/show.html.erb

diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb new file mode 100644 index 0000000000..9cc9d7f56b --- /dev/null +++ b/app/views/reviews/new.html.erb @@ -0,0 +1,2 @@ +

Reviews#new

+

Find me in app/views/reviews/new.html.erb

diff --git a/config/routes.rb b/config/routes.rb index ea945bc738..c526277f3a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,7 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :orders do - resources :order_items, except: [:index] + resources :order_items, except: [:index, :show] end resources :merchants, except: [:index] do diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb new file mode 100644 index 0000000000..f50efa8fb0 --- /dev/null +++ b/test/controllers/categories_controller_test.rb @@ -0,0 +1,14 @@ +require "test_helper" + +describe CategoriesController do + it "should get new" do + get categories_new_url + value(response).must_be :success? + end + + it "should get create" do + get categories_create_url + value(response).must_be :success? + end + +end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb new file mode 100644 index 0000000000..51d5429c17 --- /dev/null +++ b/test/controllers/order_items_controller_test.rb @@ -0,0 +1,29 @@ +require "test_helper" + +describe OrderItemsController do + it "should get new" do + get order_items_new_url + value(response).must_be :success? + end + + it "should get create" do + get order_items_create_url + value(response).must_be :success? + end + + it "should get edit" do + get order_items_edit_url + value(response).must_be :success? + end + + it "should get update" do + get order_items_update_url + value(response).must_be :success? + end + + it "should get destroy" do + get order_items_destroy_url + value(response).must_be :success? + end + +end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 0000000000..0ac3204d45 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,34 @@ +require "test_helper" + +describe OrdersController do + it "should get show" do + get orders_show_url + value(response).must_be :success? + end + + it "should get new" do + get orders_new_url + value(response).must_be :success? + end + + it "should get create" do + get orders_create_url + value(response).must_be :success? + end + + it "should get edit" do + get orders_edit_url + value(response).must_be :success? + end + + it "should get update" do + get orders_update_url + value(response).must_be :success? + end + + it "should get destroy" do + get orders_destroy_url + value(response).must_be :success? + end + +end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb new file mode 100644 index 0000000000..a0a226d82d --- /dev/null +++ b/test/controllers/reviews_controller_test.rb @@ -0,0 +1,14 @@ +require "test_helper" + +describe ReviewsController do + it "should get new" do + get reviews_new_url + value(response).must_be :success? + end + + it "should get create" do + get reviews_create_url + value(response).must_be :success? + end + +end From 3ed63797afd1281a857a4e16d528a032444ca6da Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 11:33:33 -0700 Subject: [PATCH 017/347] Begin validation tests in models --- app/assets/javascripts/merchants.js | 2 + app/assets/javascripts/products.js | 2 + app/assets/stylesheets/merchants.scss | 3 ++ app/assets/stylesheets/products.scss | 3 ++ app/controllers/merchants_controller.rb | 19 ++++++++ app/controllers/products_controller.rb | 22 +++++++++ app/helpers/merchants_helper.rb | 2 + app/helpers/products_helper.rb | 2 + app/views/merchants/show.html.erb | 2 + app/views/products/edit.html.erb | 2 + app/views/products/index.html.erb | 2 + app/views/products/new.html.erb | 2 + app/views/products/show.html.erb | 2 + test/controllers/merchants_controller_test.rb | 34 ++++++++++++++ test/controllers/products_controller_test.rb | 39 ++++++++++++++++ test/models/merchant_test.rb | 46 +++++++++++++++++++ 16 files changed, 184 insertions(+) create mode 100644 app/assets/javascripts/merchants.js create mode 100644 app/assets/javascripts/products.js create mode 100644 app/assets/stylesheets/merchants.scss create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/controllers/merchants_controller.rb create mode 100644 app/controllers/products_controller.rb create mode 100644 app/helpers/merchants_helper.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/views/merchants/show.html.erb create mode 100644 app/views/products/edit.html.erb create mode 100644 app/views/products/index.html.erb create mode 100644 app/views/products/new.html.erb create mode 100644 app/views/products/show.html.erb create mode 100644 test/controllers/merchants_controller_test.rb create mode 100644 test/controllers/products_controller_test.rb diff --git a/app/assets/javascripts/merchants.js b/app/assets/javascripts/merchants.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/merchants.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/products.js b/app/assets/javascripts/products.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/products.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss new file mode 100644 index 0000000000..2327c00afe --- /dev/null +++ b/app/assets/stylesheets/merchants.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the merchants controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000000..89e2e8db07 --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the products controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb new file mode 100644 index 0000000000..f8d1b1933a --- /dev/null +++ b/app/controllers/merchants_controller.rb @@ -0,0 +1,19 @@ +class MerchantsController < ApplicationController + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000000..6cc58717c0 --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,22 @@ +class ProductsController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/helpers/merchants_helper.rb b/app/helpers/merchants_helper.rb new file mode 100644 index 0000000000..5337747b0f --- /dev/null +++ b/app/helpers/merchants_helper.rb @@ -0,0 +1,2 @@ +module MerchantsHelper +end diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb new file mode 100644 index 0000000000..ab5c42b325 --- /dev/null +++ b/app/helpers/products_helper.rb @@ -0,0 +1,2 @@ +module ProductsHelper +end diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb new file mode 100644 index 0000000000..cbb0f02bfe --- /dev/null +++ b/app/views/merchants/show.html.erb @@ -0,0 +1,2 @@ +

Merchants#show

+

Find me in app/views/merchants/show.html.erb

diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb new file mode 100644 index 0000000000..279b066f30 --- /dev/null +++ b/app/views/products/edit.html.erb @@ -0,0 +1,2 @@ +

Products#edit

+

Find me in app/views/products/edit.html.erb

diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000000..f8eeb82674 --- /dev/null +++ b/app/views/products/index.html.erb @@ -0,0 +1,2 @@ +

Products#index

+

Find me in app/views/products/index.html.erb

diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000000..a14e0d91b6 --- /dev/null +++ b/app/views/products/new.html.erb @@ -0,0 +1,2 @@ +

Products#new

+

Find me in app/views/products/new.html.erb

diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000000..5f44ec44d2 --- /dev/null +++ b/app/views/products/show.html.erb @@ -0,0 +1,2 @@ +

Products#show

+

Find me in app/views/products/show.html.erb

diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb new file mode 100644 index 0000000000..ce4b465d1f --- /dev/null +++ b/test/controllers/merchants_controller_test.rb @@ -0,0 +1,34 @@ +require "test_helper" + +describe MerchantsController do + it "should get show" do + get merchants_show_url + value(response).must_be :success? + end + + it "should get new" do + get merchants_new_url + value(response).must_be :success? + end + + it "should get create" do + get merchants_create_url + value(response).must_be :success? + end + + it "should get edit" do + get merchants_edit_url + value(response).must_be :success? + end + + it "should get update" do + get merchants_update_url + value(response).must_be :success? + end + + it "should get destroy" do + get merchants_destroy_url + value(response).must_be :success? + end + +end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000000..a00ad0e288 --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,39 @@ +require "test_helper" + +describe ProductsController do + it "should get index" do + get products_index_url + value(response).must_be :success? + end + + it "should get show" do + get products_show_url + value(response).must_be :success? + end + + it "should get new" do + get products_new_url + value(response).must_be :success? + end + + it "should get create" do + get products_create_url + value(response).must_be :success? + end + + it "should get edit" do + get products_edit_url + value(response).must_be :success? + end + + it "should get update" do + get products_update_url + value(response).must_be :success? + end + + it "should get destroy" do + get products_destroy_url + value(response).must_be :success? + end + +end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 1cc99d985f..509d0b4298 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -6,4 +6,50 @@ it "must be valid" do value(merchant).must_be :valid? end + + describe 'relations' do + it 'has a product' do + end + + it 'has some order_items through products' do + end + + end + + describe 'validations' do + before do + @merchant = Merchant.new( + username: 'test_merchant', + email: 'test_merchant@braineaze.com' + ) + end + + it 'is valid when username is present and unique and email is present' do + + + end + + it 'is valid when email is present and unique and username is present' do + + + end + + it 'is invalid without a username' do + + + end + + it 'is invalid without a email' do + + + end + + it 'is invalid with a non-unique username' do + + end + + it 'is invalid with a non-unique email' do + + end + end end From 1e71cf9ba22c254b916c1304ef33bcfc7fe5d219 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 11:48:06 -0700 Subject: [PATCH 018/347] added tests to review model --- test/models/review_test.rb | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index ce8378a033..3e01779894 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -6,4 +6,45 @@ it "must be valid" do value(review).must_be :valid? end + + describe 'relations' do + it "belongs to a product" do + + end + + describe 'validations' do + before do + @review = Review.new( + product_id: 1 + rating: 5, + description: 'test-description' + ) + end + + it 'is valid when rating is between 1 and 5' do + + end + + it 'is valid with product_id present' do + + end + + it 'is invalid if rating is not an integer' do + + end + + it 'is invalid without a rating' do + + end + + it 'is valid with a description' do + + end + + it 'is invalid without a description' do + + end + + end + end end From 33f24d3c97395a2315e7d59bd0e4f0d30531436e Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 11:49:26 -0700 Subject: [PATCH 019/347] Add inventory column to product table --- db/migrate/20181018184242_add_inventory_column_to_product.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20181018184242_add_inventory_column_to_product.rb diff --git a/db/migrate/20181018184242_add_inventory_column_to_product.rb b/db/migrate/20181018184242_add_inventory_column_to_product.rb new file mode 100644 index 0000000000..9b4d7cd9d6 --- /dev/null +++ b/db/migrate/20181018184242_add_inventory_column_to_product.rb @@ -0,0 +1,5 @@ +class AddInventoryColumnToProduct < ActiveRecord::Migration[5.2] + def change + add_column :products, :inventory, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 181a476aeb..abc9ea7b4c 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: 2018_10_18_172853) do +ActiveRecord::Schema.define(version: 2018_10_18_184242) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -64,6 +64,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "merchants_id" + t.integer "inventory" t.index ["merchants_id"], name: "index_products_on_merchants_id" end From aba9adaf3187bdf215a6a0bfdd7b5427f9e7741f Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 11:49:48 -0700 Subject: [PATCH 020/347] Add validations for merchant --- app/models/merchant.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 7decf201d8..f910fa26fa 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,4 +1,8 @@ class Merchant < ApplicationRecord has_many :products has_many :order_items through :product + + validates :username, presence: true, uniqueness: true + + validates :email, presence: true, uniqueness: true end From 070556612826a0d08f4c70133165d40686bb25ee Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 11:50:26 -0700 Subject: [PATCH 021/347] add validations to product --- app/models/product.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/product.rb b/app/models/product.rb index 0e892b7117..734f3dc4db 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,5 +2,8 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories has_many :order_items, dependent: :destroy - has_many :reviews, dependent: :destroy + has_many :reviews, dependent: :destroy validates :name, presence: true, uniqueness: true + + validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } + validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 end From e72105c9f64d77a7c49fea81ca2e591dbda881af Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 12:08:45 -0700 Subject: [PATCH 022/347] Change description type from string to text in db --- .../20181018190315_add_description_column_to_product.rb | 6 ++++++ ...1018190541_change_description_type_to_text_in_reviews.rb | 6 ++++++ db/schema.rb | 6 +++--- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20181018190315_add_description_column_to_product.rb create mode 100644 db/migrate/20181018190541_change_description_type_to_text_in_reviews.rb diff --git a/db/migrate/20181018190315_add_description_column_to_product.rb b/db/migrate/20181018190315_add_description_column_to_product.rb new file mode 100644 index 0000000000..00d036f8ba --- /dev/null +++ b/db/migrate/20181018190315_add_description_column_to_product.rb @@ -0,0 +1,6 @@ +class AddDescriptionColumnToProduct < ActiveRecord::Migration[5.2] + def change + remove_column :products, :description, :string + add_column :products, :description, :text + end +end diff --git a/db/migrate/20181018190541_change_description_type_to_text_in_reviews.rb b/db/migrate/20181018190541_change_description_type_to_text_in_reviews.rb new file mode 100644 index 0000000000..91fccaf06a --- /dev/null +++ b/db/migrate/20181018190541_change_description_type_to_text_in_reviews.rb @@ -0,0 +1,6 @@ +class ChangeDescriptionTypeToTextInReviews < ActiveRecord::Migration[5.2] + def change + remove_column :reviews, :description, :string + add_column :reviews, :description, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index abc9ea7b4c..fe30b75cf9 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: 2018_10_18_184242) do +ActiveRecord::Schema.define(version: 2018_10_18_190541) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -60,20 +60,20 @@ create_table "products", force: :cascade do |t| t.string "name" t.float "price" - t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "merchants_id" t.integer "inventory" + t.text "description" t.index ["merchants_id"], name: "index_products_on_merchants_id" end create_table "reviews", force: :cascade do |t| t.integer "rating" - t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "products_id" + t.text "description" t.index ["products_id"], name: "index_reviews_on_products_id" end From f824b1396fd727443a3785ae8dd2ee87d2769b88 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 12:09:01 -0700 Subject: [PATCH 023/347] Work on merchant model tests --- test/models/merchant_test.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 509d0b4298..f0a33a6ded 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,14 +1,16 @@ require "test_helper" describe Merchant do - let(:merchant) { Merchant.new } - - it "must be valid" do - value(merchant).must_be :valid? - end describe 'relations' do it 'has a product' do + merchant = Merchant.first + + # Act + author = b.author + + # Assert + expect(author).must_be_instance_of Author end it 'has some order_items through products' do From 7a941f10afba80b41aa0fa9ae892a6f20b5d4cc5 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 12:10:01 -0700 Subject: [PATCH 024/347] added order_item tests - validations and relations as well as review tests validations and relations --- test/models/order_item_test.rb | 42 ++++++++++++++++++++++++++++++++++ test/models/review_test.rb | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 19a9bf8f58..8419afe520 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -6,4 +6,46 @@ it "must be valid" do value(order_item).must_be :valid? end + + describe 'relations' do + it "belongs to a product" do + + end + + it "belongs to an order" do + + end + + describe 'validations' do + before do + @order_item = Order_item.new( + product_id: 1, + order_id: 1, + quantity: 5, + status: 'pending' + ) + end + + it 'is valid with product_id present' do + + end + + it 'is valid with order_id present' do + + end + + it 'is invalid without status' do + + end + + it 'is invalid if quantity is 0' do + + end + + it 'is invalid if quantity is nil' do + + end + + end + end end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 3e01779894..d201bb25c7 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -15,7 +15,7 @@ describe 'validations' do before do @review = Review.new( - product_id: 1 + product_id: 1, rating: 5, description: 'test-description' ) From fa47a1f410df627c605ffe1ea463d8e39c5330f1 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 12:13:33 -0700 Subject: [PATCH 025/347] Work on Merchant model tests --- test/models/merchant_test.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index f0a33a6ded..d54cbfa147 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -3,14 +3,10 @@ describe Merchant do describe 'relations' do - it 'has a product' do - merchant = Merchant.first - - # Act - author = b.author - - # Assert - expect(author).must_be_instance_of Author + it 'has many products' do + m = Merchant.first + products = m.products + expect(products.first).must_be_instance_of Product end it 'has some order_items through products' do From a5e4847720ed04ba42e36947a0dc691cc33448c6 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 12:53:28 -0700 Subject: [PATCH 026/347] added validation tests to category model test --- test/models/category_test.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 781320ad8e..32ad0850b9 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -6,4 +6,28 @@ it "must be valid" do value(category).must_be :valid? end + + describe 'validations' do + before do + @categories = Category.new( + name: 'test_category_name' + ) + end + + it 'is valid when name is present and unique' do + + + end + + + + it 'is invalid without a name' do + + + end + + it 'is invalid with a non-unique name' do + + end + end end From 45d1dc3b3a6e1be13bb17a2b2357abe5a1965212 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 13:31:50 -0700 Subject: [PATCH 027/347] category yml update --- test/fixtures/categories.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml index 56066c68af..340ef0809d 100644 --- a/test/fixtures/categories.yml +++ b/test/fixtures/categories.yml @@ -1,7 +1,13 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString +toys: + name: toys -two: - name: MyString +books: + name: boooks + +meditation: + name: meditation + +apparel: + name: apparel From 1c506452de28783723502bd449e8413a3f824567 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 13:33:17 -0700 Subject: [PATCH 028/347] Finish Merchant model tests --- test/models/merchant_test.rb | 45 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index d54cbfa147..9fadad9943 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,17 +1,13 @@ require "test_helper" describe Merchant do - describe 'relations' do it 'has many products' do - m = Merchant.first - products = m.products - expect(products.first).must_be_instance_of Product - end - - it 'has some order_items through products' do + merchant = Merchant.first + merchant.products.each do |product| + product.must_be_instance_of Product + end end - end describe 'validations' do @@ -22,32 +18,37 @@ ) end - it 'is valid when username is present and unique and email is present' do - - - end - - it 'is valid when email is present and unique and username is present' do - - + it 'is valid when username is present and unique and email is present and unique' do + is_valid = @merchant.valid? + expect( is_valid ).must_equal true end it 'is invalid without a username' do - - + @merchant.username = nil + is_valid = @merchant.valid? + expect( is_valid ).must_equal false + expect( @merchant.errors.messages ).must_include :username end it 'is invalid without a email' do - - + @merchant.email = nil + is_valid = @merchant.valid? + expect( is_valid ).must_equal false + expect( @merchant.errors.messages ).must_include :email end it 'is invalid with a non-unique username' do - + @merchant.username = Merchant.first.username + is_valid = @merchant.valid? + expect( is_valid ).must_equal false + expect( @merchant.errors.messages ).must_include :username end it 'is invalid with a non-unique email' do - + @merchant.email = Merchant.first.email + is_valid = @merchant.valid? + expect( is_valid ).must_equal false + expect( @merchant.errors.messages ).must_include :email end end end From 4462e3e676c11f37586b8658ec22798c7723f0c3 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 13:43:59 -0700 Subject: [PATCH 029/347] fixtures for order items, orders, and products --- test/fixtures/order_items.yml | 35 +++++++++++++++++++++++++++++++---- test/fixtures/orders.yml | 28 ++++++++++++++-------------- test/fixtures/products.yml | 21 +++++++++++++-------- 3 files changed, 58 insertions(+), 26 deletions(-) diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml index 8f70aabb93..3f53ad1f76 100644 --- a/test/fixtures/order_items.yml +++ b/test/fixtures/order_items.yml @@ -1,9 +1,36 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: +pending: quanity: 1 - status: + status: :pending + order: one + product: plushie + order: one -two: +paid: quanity: 1 - status: + status: :paid + order: one + product: puzzle + order: two + +complete: + quanity: 1 + status: :complete + order: two + product: puddy + order: one + +cancelled: + quanity: 1 + status: :cancelled + order: two + product: plushie + order: two + +many: + quantity: 20 + status: :pending + order: two + product: puzzle + order: one diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 211cf5eef8..18a8893b84 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -1,19 +1,19 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - email: MyString - mailing_address: MyString - cc: 1 - cc_name: MyString - cc_expiration: MyString - cvv: 1 - zip: 1 + email: aaa@gmail.com + mailing_address: 12345 A Street + cc: 1234123412341234 + cc_name: Aaa Aaaaaa + cc_expiration: 11/11 + cvv: 123 + zip: 12345 two: - email: MyString - mailing_address: MyString - cc: 1 - cc_name: MyString - cc_expiration: MyString - cvv: 1 - zip: 1 + email: z@zmail.com + mailing_address: 90 Z Ave + cc: 1111222233334444 + cc_name: Zebra Zee + cc_expiration: 99/99 + cvv: 100 + zip: 50100 diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index f049a8bba9..3e3848e5bf 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,11 +1,16 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString - price: 1.5 - description: MyString +plushie: + name: Brain Plushie + price: 15.0 + description: A beautiful integlligent brain plushie -two: - name: MyString - price: 1.5 - description: MyString +puzzle: + name: Brain Puzzle + price: 100.0 + description: improve ur mind! + +puddy: + name: Brain Puddy + price: 4.75 + description: puddy for ur brain! From b106bf052743c826b570585d4e9883696025d5ed Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 13:47:35 -0700 Subject: [PATCH 030/347] fix typo in order items fixtures --- test/fixtures/order_items.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml index 3f53ad1f76..c121c99d53 100644 --- a/test/fixtures/order_items.yml +++ b/test/fixtures/order_items.yml @@ -1,28 +1,28 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html pending: - quanity: 1 + quantity: 1 status: :pending order: one product: plushie order: one paid: - quanity: 1 + quantity: 1 status: :paid order: one product: puzzle order: two complete: - quanity: 1 + quantity: 1 status: :complete order: two product: puddy order: one cancelled: - quanity: 1 + quantity: 1 status: :cancelled order: two product: plushie @@ -33,4 +33,4 @@ many: status: :pending order: two product: puzzle - order: one + order: one From 81d901eb90eb5cd62cd6e6d3705dfd34ed607a89 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 13:59:10 -0700 Subject: [PATCH 031/347] change all inputs in orders to string --- ...20181018205434_change_integers_in_orders_to_strings.rb | 8 ++++++++ db/schema.rb | 8 ++++---- test/fixtures/orders.yml | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20181018205434_change_integers_in_orders_to_strings.rb diff --git a/db/migrate/20181018205434_change_integers_in_orders_to_strings.rb b/db/migrate/20181018205434_change_integers_in_orders_to_strings.rb new file mode 100644 index 0000000000..3d4f3cadd3 --- /dev/null +++ b/db/migrate/20181018205434_change_integers_in_orders_to_strings.rb @@ -0,0 +1,8 @@ +class ChangeIntegersInOrdersToStrings < ActiveRecord::Migration[5.2] + def change + change_column :orders, :cc, :string + change_column :orders, :cvv, :string + change_column :orders, :zip, :string + change_column :orders, :cc_expiration, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index fe30b75cf9..59d5d33177 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: 2018_10_18_190541) do +ActiveRecord::Schema.define(version: 2018_10_18_205434) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -48,11 +48,11 @@ create_table "orders", force: :cascade do |t| t.string "email" t.string "mailing_address" - t.integer "cc" + t.string "cc" t.string "cc_name" t.string "cc_expiration" - t.integer "cvv" - t.integer "zip" + t.string "cvv" + t.string "zip" t.datetime "created_at", null: false t.datetime "updated_at", null: false end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 18a8893b84..3f5cc4a664 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -5,7 +5,7 @@ one: mailing_address: 12345 A Street cc: 1234123412341234 cc_name: Aaa Aaaaaa - cc_expiration: 11/11 + cc_expiration: 22/22 cvv: 123 zip: 12345 From 66aecf4124f998d940464410cf699e909a22aa1e Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 13:59:53 -0700 Subject: [PATCH 032/347] filled in tests for category model --- test/models/category_test.rb | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 32ad0850b9..60162b6fc9 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -9,25 +9,45 @@ describe 'validations' do before do - @categories = Category.new( + @category = Category.new( name: 'test_category_name' ) end + + @CATEGORIES = %w[games toys books vitamins meditation] + it 'is valid when name is present and unique' do + @category.name = "apparel" + result = @category.valid? + expect(result).must_equal true + expect( @category ).errors.messages_must_include :name end it 'is invalid without a name' do + @category.name = nil + result = @category.valid? + expect(result).wont_equal true + expect( @category ).errors.messages_must_include :name end + + CATEGORIES = %w[games toys books vitamins meditation] + it 'is invalid with a non-unique name' do + @category.name = CATEGORIES.first + + result = @category.valid? + expect(result).wont_equal true + expect( @category ).errors.messages_must_include :name end + end end From 3e0a63be05e8bdcce859d0ea32bd9d38f7caf1d0 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 14:04:27 -0700 Subject: [PATCH 033/347] change status to string, take out extra order in order items fixture --- test/fixtures/order_items.yml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml index c121c99d53..b045204855 100644 --- a/test/fixtures/order_items.yml +++ b/test/fixtures/order_items.yml @@ -2,35 +2,30 @@ pending: quantity: 1 - status: :pending + status: pending order: one product: plushie - order: one paid: quantity: 1 - status: :paid - order: one - product: puzzle + status: paid order: two + product: puzzle complete: quantity: 1 - status: :complete - order: two - product: puddy + status: complete order: one + product: puddy cancelled: quantity: 1 - status: :cancelled + status: cancelled order: two product: plushie - order: two many: quantity: 20 - status: :pending + status: pending order: two product: puzzle - order: one From 37e84053bbc6ea290c0bd75c8b38ac54f0a60996 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 14:06:32 -0700 Subject: [PATCH 034/347] Make changes to get merchant model tests to work --- app/models/merchant.rb | 8 +++----- app/models/order_item.rb | 2 +- app/models/product.rb | 3 ++- test/test_helper.rb | 4 +++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index f910fa26fa..a8442888c8 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,8 +1,6 @@ class Merchant < ApplicationRecord has_many :products - has_many :order_items through :product - - validates :username, presence: true, uniqueness: true - - validates :email, presence: true, uniqueness: true + has_many :order_items, through: :product + validates :username, presence: true, uniqueness: true + validates :email, presence: true, uniqueness: true end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 00e325ef1a..6db1ccf618 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,5 +1,5 @@ class OrderItem < ApplicationRecord - has_many :products + belongs_to :product belongs_to :order has_one :merchant, through: :product end diff --git a/app/models/product.rb b/app/models/product.rb index 734f3dc4db..ff3a76fdc2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,8 +2,9 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories has_many :order_items, dependent: :destroy - has_many :reviews, dependent: :destroy validates :name, presence: true, uniqueness: true + has_many :reviews, dependent: :destroy + validates :name, presence: true, uniqueness: true validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 end diff --git a/test/test_helper.rb b/test/test_helper.rb index 2b5172a7d6..10594a3248 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,9 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails"require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output + # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, From 2be94ba63d918846f337f5a21adabb6dd8d7bdd9 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 14:10:36 -0700 Subject: [PATCH 035/347] fixed pluralized foreign keys in order items into singular --- ...0913_fix_pluralized_foreign_keys_to_singular.rb | 10 ++++++++++ db/schema.rb | 14 +++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20181018210913_fix_pluralized_foreign_keys_to_singular.rb diff --git a/db/migrate/20181018210913_fix_pluralized_foreign_keys_to_singular.rb b/db/migrate/20181018210913_fix_pluralized_foreign_keys_to_singular.rb new file mode 100644 index 0000000000..f98a45717e --- /dev/null +++ b/db/migrate/20181018210913_fix_pluralized_foreign_keys_to_singular.rb @@ -0,0 +1,10 @@ +class FixPluralizedForeignKeysToSingular < ActiveRecord::Migration[5.2] + def change + remove_reference :order_items, :products, foreign_key: true + remove_reference :order_items, :orders, foreign_key: true + + add_reference :order_items, :product, foreign_key: true + add_reference :order_items, :order, foreign_key: true + + end +end diff --git a/db/schema.rb b/db/schema.rb index 59d5d33177..af8f038f08 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: 2018_10_18_205434) do +ActiveRecord::Schema.define(version: 2018_10_18_210913) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -39,10 +39,10 @@ t.string "status" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.bigint "products_id" - t.bigint "orders_id" - t.index ["orders_id"], name: "index_order_items_on_orders_id" - t.index ["products_id"], name: "index_order_items_on_products_id" + t.bigint "product_id" + t.bigint "order_id" + t.index ["order_id"], name: "index_order_items_on_order_id" + t.index ["product_id"], name: "index_order_items_on_product_id" end create_table "orders", force: :cascade do |t| @@ -77,8 +77,8 @@ t.index ["products_id"], name: "index_reviews_on_products_id" end - add_foreign_key "order_items", "orders", column: "orders_id" - add_foreign_key "order_items", "products", column: "products_id" + add_foreign_key "order_items", "orders" + add_foreign_key "order_items", "products" add_foreign_key "products", "merchants", column: "merchants_id" add_foreign_key "reviews", "products", column: "products_id" end From ae735caae9c1d170f6bed1bb09db994c43063df3 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 14:15:14 -0700 Subject: [PATCH 036/347] reviews fixture --- test/fixtures/reviews.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index e0c8abf962..b4fe0801a3 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -1,9 +1,16 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: - rating: - description: MyString + rating: 5 + product: puddy + description: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. two: - rating: - description: MyString + rating: 3 + product: plushie + description: Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + +two: + rating: 1 + product: plushie + description: Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. From 0f600d0321114bd0a04908eeddc2de8aaf5efcf1 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 14:16:49 -0700 Subject: [PATCH 037/347] merged changes to merchant and product model, moved a 'required' statement to new line --- test/models/order_item_test.rb | 18 +++++++++++++----- test/test_helper.rb | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 8419afe520..97bb799661 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -27,23 +27,31 @@ end it 'is valid with product_id present' do - + result = @order_item.valid? + expect( result ).must_equal true end it 'is valid with order_id present' do - + result = @order_item.valid? + expect( result ).must_equal true end it 'is invalid without status' do - + @order_item.status = nil + result = @order_item.valid? + expect( @order_item ).errors.messages_must_include :status end it 'is invalid if quantity is 0' do - + @order_item.quantity = 0 + result = @order_item.valid? + expect( @order_item ).errors.messages_must_include :quantity end it 'is invalid if quantity is nil' do - + @order_item.quantity = nil + result = @order_item.valid? + expect( @order_item ).errors.messages_must_include :quantity end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 10594a3248..45db8780f3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,7 +3,7 @@ require "rails/test_help" require "minitest/rails" require "minitest/reporters" # for Colorized output - +ß # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, From e2266a2dd3d84c282ef83f0e6ae345026c66227c Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 14:18:38 -0700 Subject: [PATCH 038/347] updated merchant, product models and test helper --- test/test_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 45db8780f3..10594a3248 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,7 +3,7 @@ require "rails/test_help" require "minitest/rails" require "minitest/reporters" # for Colorized output -ß + # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, From 6a34248b4dcbddba4cb1bcafc70545da0f006130 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 14:18:52 -0700 Subject: [PATCH 039/347] order tests --- app/models/merchant.rb | 2 +- app/models/order.rb | 8 ++++++++ app/models/product.rb | 4 +++- test/models/order_test.rb | 34 +++++++++++++++++++++++++++++++--- test/test_helper.rb | 3 ++- 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index f910fa26fa..c56f7b26a4 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,6 +1,6 @@ class Merchant < ApplicationRecord has_many :products - has_many :order_items through :product + has_many :order_items, through: :product validates :username, presence: true, uniqueness: true diff --git a/app/models/order.rb b/app/models/order.rb index b8ff4b192c..c3030845ad 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,3 +1,11 @@ class Order < ApplicationRecord has_many :order_items + + validates :email, presence: true + validates :mailing_address, presence: true + validates :cc, presence: true + validates :cc_name, presence: true + validates :cc_expiration, presence: true + validates :cvv, presence: true + validates :zip, presence: true end diff --git a/app/models/product.rb b/app/models/product.rb index 734f3dc4db..9d7da76296 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,7 +2,9 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories has_many :order_items, dependent: :destroy - has_many :reviews, dependent: :destroy validates :name, presence: true, uniqueness: true + has_many :reviews, dependent: :destroy + + validates :name, presence: true, uniqueness: true validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 diff --git a/test/models/order_test.rb b/test/models/order_test.rb index df80f10fb6..ee6c22376f 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,9 +1,37 @@ require "test_helper" describe Order do - let(:order) { Order.new } + describe 'relations' do + it "has a list of order items" do + order = orders(:one) + order.must_respond_to :order_items - it "must be valid" do - value(order).must_be :valid? + order.order_items.each do |order_item| + order_item.must_be_kind_of Order_item + end + end + end + + describe 'validations' do + it 'is valid with an email' do + + end + + it 'is valid with a mailing address' do + end + + it 'is valid with a cc' do + + end + + it 'is valid with an integer cc number' do + + end + + it 'is valid with a cc name' do + end + + it 'is valid with ' do + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 2b5172a7d6..fb7dd505e2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,8 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails"require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, From a6d539eac773dfddc94c9c27500884f1232dc1e6 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 14:22:33 -0700 Subject: [PATCH 040/347] merge conflict fixed another one --- app/models/product.rb | 5 ----- test/test_helper.rb | 3 --- 2 files changed, 8 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index e3a74b45e8..ff3a76fdc2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -3,11 +3,6 @@ class Product < ApplicationRecord has_and_belongs_to_many :categories has_many :order_items, dependent: :destroy has_many :reviews, dependent: :destroy -<<<<<<< HEAD - - validates :name, presence: true, uniqueness: true -======= ->>>>>>> e2266a2dd3d84c282ef83f0e6ae345026c66227c validates :name, presence: true, uniqueness: true validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } diff --git a/test/test_helper.rb b/test/test_helper.rb index 68a56f9233..10594a3248 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,10 +3,7 @@ require "rails/test_help" require "minitest/rails" require "minitest/reporters" # for Colorized output -<<<<<<< HEAD -======= ->>>>>>> e2266a2dd3d84c282ef83f0e6ae345026c66227c # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, From f6c738341f6b8bc04d1b3baeee02178c5e081592 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 14:24:39 -0700 Subject: [PATCH 041/347] typo in reviews yml --- test/fixtures/reviews.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index b4fe0801a3..79b595d03e 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -10,7 +10,7 @@ two: product: plushie description: Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. -two: +three: rating: 1 product: plushie description: Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. From 625fa7242c719529bcb6998f6740626f52c69ee3 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Thu, 18 Oct 2018 14:31:02 -0700 Subject: [PATCH 042/347] fix the plural FK in reviews and products --- ...reviews_and_merchant_id_in_products_singular.rb | 10 ++++++++++ db/schema.rb | 14 +++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20181018212924_make_product_id_in_reviews_and_merchant_id_in_products_singular.rb diff --git a/db/migrate/20181018212924_make_product_id_in_reviews_and_merchant_id_in_products_singular.rb b/db/migrate/20181018212924_make_product_id_in_reviews_and_merchant_id_in_products_singular.rb new file mode 100644 index 0000000000..05ef1bda80 --- /dev/null +++ b/db/migrate/20181018212924_make_product_id_in_reviews_and_merchant_id_in_products_singular.rb @@ -0,0 +1,10 @@ +class MakeProductIdInReviewsAndMerchantIdInProductsSingular < ActiveRecord::Migration[5.2] + def change + remove_reference :reviews, :products, foreign_key: true + add_reference :reviews, :product, foreign_key: true + + remove_reference :products, :merchants, foreign_key: true + + add_reference :products, :merchant, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index af8f038f08..ea5d2de528 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: 2018_10_18_210913) do +ActiveRecord::Schema.define(version: 2018_10_18_212924) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -62,23 +62,23 @@ t.float "price" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.bigint "merchants_id" t.integer "inventory" t.text "description" - t.index ["merchants_id"], name: "index_products_on_merchants_id" + t.bigint "merchant_id" + t.index ["merchant_id"], name: "index_products_on_merchant_id" end create_table "reviews", force: :cascade do |t| t.integer "rating" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.bigint "products_id" t.text "description" - t.index ["products_id"], name: "index_reviews_on_products_id" + t.bigint "product_id" + t.index ["product_id"], name: "index_reviews_on_product_id" end add_foreign_key "order_items", "orders" add_foreign_key "order_items", "products" - add_foreign_key "products", "merchants", column: "merchants_id" - add_foreign_key "reviews", "products", column: "products_id" + add_foreign_key "products", "merchants" + add_foreign_key "reviews", "products" end From dcc59b588886eb00ca73cd215db4568435fbd806 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 14:35:12 -0700 Subject: [PATCH 043/347] updated review tests by adding Arrange, Acts, and Asserts to tests --- test/models/review_test.rb | 46 +++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index d201bb25c7..6b5b331ed7 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -8,8 +8,18 @@ end describe 'relations' do + before do + @review = Review.new( + product_id: 1, + rating: 5, + description: 'test-description' + ) + end + it "belongs to a product" do + item = @review.product + expect( item ).must_be_instance_of Product end describe 'validations' do @@ -21,28 +31,54 @@ ) end - it 'is valid when rating is between 1 and 5' do + it 'is invalid without a rating' do + @review.rating = nil + result = @review.valid? + expect( result ).wont_equal true end - it 'is valid with product_id present' do + it 'is invalid if rating is not an integer' do + @review.rating = 'five' + result = @review.valid? + expect( result ).wont_equal true end - it 'is invalid if rating is not an integer' do + it 'is valid when rating is between 1 and 5' do + result = @review.valid? + expect( result ).must_equal true + end + + it 'is valid when rating is less than 1' do + @review.rating = -1 + result = @review.valid? + expect( result ).must_equal true end - it 'is invalid without a rating' do + it 'is valid when rating is greater than 5' do + @review.rating = 6 + result = @review.valid? + expect( result ).must_equal true end - it 'is valid with a description' do + it 'is valid with product_id present' do + result = @review.valid? + expect( result ).must_equal true + end + it 'is valid with a description' do + result = @review.valid? + expect( result ).must_equal true end it 'is invalid without a description' do + @review.description = nil + result = @review.valid? + expect( result ).wont_equal true end end From 0a712a84cb6cebd05ea9e4ec55ca27e48f2ee6a6 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 14:39:13 -0700 Subject: [PATCH 044/347] Add routes for sessions --- config/routes.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index c526277f3a..bfb2e794eb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,4 +11,7 @@ end resources :reviews, only: [:new, :create] + + resources :sessions, only: [:new, :create] + post '/sessions/logout', to: 'sessions#logout', as: 'logout' end From 9322e22722389add45b66b19735b937724d619e9 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 14:44:06 -0700 Subject: [PATCH 045/347] created session controller --- app/assets/javascripts/sessions.js | 2 ++ app/assets/stylesheets/sessions.scss | 3 +++ app/controllers/sessions_controller.rb | 2 ++ app/helpers/sessions_helper.rb | 2 ++ test/controllers/sessions_controller_test.rb | 12 ++++++++++++ test/models/order_test.rb | 2 +- 6 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/sessions.js create mode 100644 app/assets/stylesheets/sessions.scss create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/helpers/sessions_helper.rb create mode 100644 test/controllers/sessions_controller_test.rb diff --git a/app/assets/javascripts/sessions.js b/app/assets/javascripts/sessions.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/sessions.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 0000000000..ccb1ed25b2 --- /dev/null +++ b/app/assets/stylesheets/sessions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Sessions controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 0000000000..16d11b5710 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,2 @@ +class SessionsController < ApplicationController +end diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb new file mode 100644 index 0000000000..309f8b2eb3 --- /dev/null +++ b/app/helpers/sessions_helper.rb @@ -0,0 +1,2 @@ +module SessionsHelper +end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb new file mode 100644 index 0000000000..54d42acf8f --- /dev/null +++ b/test/controllers/sessions_controller_test.rb @@ -0,0 +1,12 @@ +require "test_helper" + +describe SessionsController do + def login_form + end + + def create + end + + def destroy + end +end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index ee6c22376f..0bd49c97e4 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -7,7 +7,7 @@ order.must_respond_to :order_items order.order_items.each do |order_item| - order_item.must_be_kind_of Order_item + order_item.must_be_kind_of OrderItem end end end From 172c176ca6cce27ea308269d264892d77368c1a8 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 15:48:15 -0700 Subject: [PATCH 046/347] Work on product model tests to pass --- ...ange_price_float_to_integer_in_products.rb | 5 + db/schema.rb | 4 +- test/fixtures/products.yml | 16 +++- test/models/product_test.rb | 94 ++++++++++++++++++- 4 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20181018223818_change_price_float_to_integer_in_products.rb diff --git a/db/migrate/20181018223818_change_price_float_to_integer_in_products.rb b/db/migrate/20181018223818_change_price_float_to_integer_in_products.rb new file mode 100644 index 0000000000..ed4eceb470 --- /dev/null +++ b/db/migrate/20181018223818_change_price_float_to_integer_in_products.rb @@ -0,0 +1,5 @@ +class ChangePriceFloatToIntegerInProducts < ActiveRecord::Migration[5.2] + def change + change_column :products, :price, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index ea5d2de528..da6bedc96b 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: 2018_10_18_212924) do +ActiveRecord::Schema.define(version: 2018_10_18_223818) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -59,7 +59,7 @@ create_table "products", force: :cascade do |t| t.string "name" - t.float "price" + t.integer "price" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "inventory" diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 3e3848e5bf..89900d7e22 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -2,15 +2,23 @@ plushie: name: Brain Plushie - price: 15.0 + price: 15 description: A beautiful integlligent brain plushie + inventory: 10 + merchant: one + puzzle: name: Brain Puzzle - price: 100.0 + price: 100 description: improve ur mind! + inventory: 5 + merchant: two + puddy: name: Brain Puddy - price: 4.75 - description: puddy for ur brain! + price: 475 + description: puddy for ur brain! + inventory: 100 + merchant: three diff --git a/test/models/product_test.rb b/test/models/product_test.rb index a618b0a156..2d7c860934 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,9 +1,97 @@ require "test_helper" +require 'pry' describe Product do - let(:product) { Product.new } + describe 'relations' do + it 'has many reviews' do + product = Product.first + product.reviews.each do |review| + review.must_be_instance_of Review + end + end - it "must be valid" do - value(product).must_be :valid? + it 'has many order_items' do + product = Product.first + product.order_items.each do |order_item| + order_item.must_be_instance_of OrderItem + end + end + + it 'has many categories' do + product = Product.first + product.categories.each do |category| + category.must_be_instance_of Product + end + end + + it 'belongs to a Merchant' do + plushie = products(:plushie) + plushie.must_respond_to :merchant + plushie.merchant.must_be_kind_of Merchant + plushie.merchant.username.must_equal "griffiam" + plushie.merchant.must_equal merchants(:one) + end + end + + describe 'validations' do + before do + @product = Product.new( + name: 'test_product', + price: 1005, + inventory: 4 + ) + end + + it 'is valid when name is present and unique, price is present, and inventory is present and greater or equal to 0' do + plushie = products(:plushie) + plushie.valid?.must_equal true + end + + it 'is invalid without a name' do + @product.name = nil + is_valid = @product.valid? + expect( is_valid ).must_equal false + expect( @product.errors.messages ).must_include :name + end + + it 'is invalid without a price' do + @product.price = nil + is_valid = @product.valid? + expect( is_valid ).must_equal false + expect( @product.errors.messages ).must_include :price + end + + it 'is invalid if price is less or equal to 0' do + @product.price = 0 + is_valid = @product.valid? + expect( is_valid ).must_equal false + expect( @product.errors.messages ).must_include :price + + @product.price = -2 + is_valid = @product.valid? + expect( is_valid ).must_equal false + expect( @product.errors.messages ).must_include :price + end + + it 'is invalid without an inventory amt' do + @product.inventory = nil + is_valid = @product.valid? + expect( is_valid ).must_equal false + expect( @product.errors.messages ).must_include :inventory + end + + it 'is invalid if inventory amt is less than 0' do + @product.inventory = -1 + is_valid = @product.valid? + expect( is_valid ).must_equal false + expect( @product.errors.messages ).must_include :inventory + end + + it 'is invalid with a non-unique name' do + @product.name = Product.first.name + is_valid = @product.valid? + expect( is_valid ).must_equal false + expect( @product.errors.messages ).must_include :name + end end end From cbeec889c5ffc8359d8ba60cd73e5d4159d3f0dd Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 15:50:16 -0700 Subject: [PATCH 047/347] remove pry --- test/models/product_test.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 2d7c860934..938c9227e9 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require 'pry' describe Product do describe 'relations' do From a38d4519552e8d924e2c00c5386ccc182d82568d Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 16:57:26 -0700 Subject: [PATCH 048/347] Modify routes --- config/routes.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index bfb2e794eb..9dee853ec3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,12 +1,14 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :orders do + resources :orders only: [:show, :create, :update, :destroy] do resources :order_items, except: [:index, :show] end + get '/cart', to: 'orders#index', as: 'cart' + resources :merchants, except: [:index] do - resources :products + resources :products, except: [:destroy] resources :categories, only: [:new, :create] end From acd2f488e8e98157b76682a0fd0810899436e95f Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 18:48:49 -0700 Subject: [PATCH 049/347] Set up oauth and sessions controller --- .env | 2 + Gemfile | 1 + Gemfile.lock | 5 + app/controllers/sessions_controller.rb | 33 ++++ config/initializers/omniauth.rb | 4 + config/routes.rb | 4 +- test/controllers/orders_controller_test.rb | 179 +++++++++++++++++---- 7 files changed, 198 insertions(+), 30 deletions(-) create mode 100644 .env create mode 100644 config/initializers/omniauth.rb diff --git a/.env b/.env new file mode 100644 index 0000000000..e7ba84e6e1 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +GITHUB_CLIENT_ID: 2d12c0fab1c8a110c869 +GITHUB_CLIENT_SECRET: 6df336950ef58a98890cb61af5f9e01f9bf2796d diff --git a/Gemfile b/Gemfile index 6219256bd8..f0aa480d08 100644 --- a/Gemfile +++ b/Gemfile @@ -69,6 +69,7 @@ group :development, :test do end group :development do + gem 'dotenv-rails' gem 'better_errors' gem 'binding_of_caller' gem 'guard' diff --git a/Gemfile.lock b/Gemfile.lock index 51100b2a1d..953f570aed 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,6 +81,10 @@ GEM concurrent-ruby (1.0.5) crass (1.0.4) debug_inspector (0.0.3) + dotenv (2.5.0) + dotenv-rails (2.5.0) + dotenv (= 2.5.0) + railties (>= 3.2, < 6.0) erubi (1.7.1) execjs (2.7.0) ffi (1.9.25) @@ -249,6 +253,7 @@ DEPENDENCIES byebug capybara (>= 2.15) chromedriver-helper + dotenv-rails guard guard-minitest jbuilder (~> 2.5) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 16d11b5710..38c61c5939 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,2 +1,35 @@ class SessionsController < ApplicationController + def login + auth_hash = request.env['omniauth.auth'] + + if auth_hash['uid'] + @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: 'github') + + if @merchant.nil? + @merchant = Merchant.build_from_github(auth_hash) + successful_save = @merchant.save + if successful_save + flash[:success] = "Logged in Successfully. Welcome #{@merchant.username}" + session[:merchant_id] = @merchant.id + redirect_to root_path + else + flash[:alert] = "Some error happened in Merchant creation" + redirect_to root_path + end + else + flash[:success] = "Logged in successfully" + session[:merchant_id] = @merchant.id + redirect_to root_path + end + else + flash[:alert] = "Logging in through Github not successful" + redirect_to root_path + end + end + + def logout + session[:merchant_id] = nil + flash[:success] = "Successfully logged out" + redirect_to root_path + end end diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb new file mode 100644 index 0000000000..ef8c60c371 --- /dev/null +++ b/config/initializers/omniauth.rb @@ -0,0 +1,4 @@ +# config/initializers/omniauth.rb +Rails.application.config.middleware.use OmniAuth::Builder do + provider :github, ENV["GITHUB_CLIENT_ID"], ENV["GITHUB_CLIENT_SECRET"], scope: "user:email" +end diff --git a/config/routes.rb b/config/routes.rb index 9dee853ec3..a286aa0ee0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,9 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :orders only: [:show, :create, :update, :destroy] do + get "/auth/:provider/callback", to: "sessions#create" + + resources :orders, only: [:show, :create, :update, :destroy] do resources :order_items, except: [:index, :show] end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 0ac3204d45..6ecffe4634 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,34 +1,155 @@ require "test_helper" describe OrdersController do - it "should get show" do - get orders_show_url - value(response).must_be :success? - end - - it "should get new" do - get orders_new_url - value(response).must_be :success? - end - - it "should get create" do - get orders_create_url - value(response).must_be :success? - end - - it "should get edit" do - get orders_edit_url - value(response).must_be :success? - end - - it "should get update" do - get orders_update_url - value(response).must_be :success? - end - - it "should get destroy" do - get orders_destroy_url - value(response).must_be :success? - end + let(:bad_order_id) { Order.first.destroy.id } + + describe "index" do + it "should get index" do + # Act + get orders_path + + # Assert + must_respond_with :success + end + end + + describe "new" do + it "can get the new page" do + get new_order_path + + must_respond_with :success + end + end + + describe "create" do + it "can create a order with valid data" do + # Arrange + order_data = { + order: { + email: 'test@test.com', + mailing_address: '5678 willow st', + cc: '567856785675678', + cc_name: 'First Last', + cc_expiration: '08/21', + cvv: '456', + zip: '98765' + } + } + + # Assumptions + test_order = Order.new(order_data[:order]) + test_order.must_be :valid?, "Order data was invalid. Please come fix this test" + + # Act + expect { + post orders_path, params: order_data + }.must_change('Order.count', +1) + + # Assert + must_redirect_to order_path(Order.last) + end + + it "does not creat a new order w/ invalid data" do + # Arrange + order_data = { + order: { + email: 'test@test.com', + } + } + + # Assumptions + Order.new(order_data[:order]).wont_be :valid?, "Order data wasn't invalid. Please come fix this test" + + # Act + expect { + post(orders_path, params: order_data) + }.wont_change('Order.count') + + # Assert + must_respond_with :bad_request + end + end + + describe "show" do + + it "should respond with success for showing an existing order" do + # Arrange + existing_order = orders(:one) + + # Act + get order_path(existing_order.id) + + # Assert + must_respond_with :success + end + + it "should respond with not found for showing a non-existing order" do + # Arrange + # order = orders(:poodr) + # id = order.id + + # get order_path(id) + # must_respond_with :success + # + # + # order.destroy + + # Act + get order_path(bad_order_id) + + # Assert + must_respond_with :missing + end + + end + + describe "edit" do + it "responds with success for an existing order" do + get edit_order_path(Order.first) + must_respond_with :success + end + + it "responds with not_found for a order that D.N.E." do + get edit_order_path(bad_order_id) + must_respond_with :not_found + end + end + + describe "update" do + end + + + describe "destroy" do + it "can destroy an existing order" do + # Arrange + order = orders(:one) + # before_order_count = Book.count + + # Act + expect { + delete order_path(order) + }.must_change('puts "inside the must_change argument"; Book.count', -1) + + # Assert + must_respond_with :redirect + must_redirect_to orders_path + + # expect(Book.count).must_equal( + # before_order_count - 1, + # "order count did not decrease" + # ) + end + + it "responds with not_found if the order doesn't exist" do + id = bad_order_id + expect { + delete order_path(id) + }.wont_change('Book.count') + + must_respond_with :not_found + end + end + + end From e6668f2b2bc27eb9c34697180bcbce26e2fa2e1f Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 19:07:08 -0700 Subject: [PATCH 050/347] Add sessions for when merchant is logged in and for cart when browsing site --- app/controllers/application_controller.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09705d12ab..40253d91fb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,19 @@ class ApplicationController < ActionController::Base + before_action :current_merchant + before_action :current_cart + + private + + def current_merchant + @current_merchant = Merchant.find_by(id: session[:merchant_id]) + end + + def current_cart + if session[:order_id] + @shopping_cart = Order.find_by(id: session[:order_id]) + else + @shopping_cart = Order.create + session[:order_id] = @shopping_cart.id + end + end end From 466163d885c1ef4ddb5a8f06f973150ee9fa3d1c Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 19:48:30 -0700 Subject: [PATCH 051/347] Make changes for oauth to work with model test for merchant --- Gemfile | 4 ++++ Gemfile.lock | 23 +++++++++++++++++++ app/models/merchant.rb | 4 ++++ .../20181019023824_add_oauth_to_merchants.rb | 6 +++++ db/schema.rb | 4 +++- test/fixtures/merchants.yml | 6 +++++ 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20181019023824_add_oauth_to_merchants.rb diff --git a/Gemfile b/Gemfile index f0aa480d08..6207adb51e 100644 --- a/Gemfile +++ b/Gemfile @@ -13,6 +13,10 @@ gem 'puma', '~> 3.11' gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' +gem 'omniauth' + +gem 'omniauth-github' + # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'mini_racer', platforms: :ruby diff --git a/Gemfile.lock b/Gemfile.lock index 953f570aed..6ffb22fbfa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -87,6 +87,8 @@ GEM railties (>= 3.2, < 6.0) erubi (1.7.1) execjs (2.7.0) + faraday (0.15.3) + multipart-post (>= 1.2, < 3) ffi (1.9.25) formatador (0.2.5) globalid (0.4.1) @@ -104,6 +106,7 @@ GEM guard-minitest (2.4.6) guard-compat (~> 1.2) minitest (>= 3.0) + hashie (3.5.7) i18n (1.1.1) concurrent-ruby (~> 1.0) io-like (0.3.0) @@ -117,6 +120,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + jwt (2.1.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) @@ -144,6 +148,8 @@ GEM ruby-progressbar msgpack (1.2.4) multi_json (1.13.1) + multi_xml (0.6.0) + multipart-post (2.0.0) nenv (0.3.0) nio4r (2.3.1) nokogiri (1.8.5) @@ -151,6 +157,21 @@ GEM notiffany (0.1.1) nenv (~> 0.1) shellany (~> 0.0) + oauth2 (1.4.1) + faraday (>= 0.8, < 0.16.0) + jwt (>= 1.0, < 3.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (>= 1.2, < 3) + omniauth (1.8.1) + hashie (>= 3.4.6, < 3.6.0) + rack (>= 1.6.2, < 3) + omniauth-github (1.3.0) + omniauth (~> 1.5) + omniauth-oauth2 (>= 1.4.0, < 2.0) + omniauth-oauth2 (1.5.0) + oauth2 (~> 1.1) + omniauth (~> 1.2) pg (1.1.3) popper_js (1.14.3) pry (0.11.3) @@ -262,6 +283,8 @@ DEPENDENCIES listen (>= 3.0.5, < 3.2) minitest-rails minitest-reporters + omniauth + omniauth-github pg (>= 0.18, < 2.0) pry-rails puma (~> 3.11) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index a8442888c8..82c620fc5a 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -3,4 +3,8 @@ class Merchant < ApplicationRecord has_many :order_items, through: :product validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness: true + + def self.build_from_github(auth_hash) + return Merchant.new(provider: auth_hash[:provider], uid: auth_hash[:uid], email: auth_hash[:info][:email], username: auth_hash[:info][:nickname]) + end end diff --git a/db/migrate/20181019023824_add_oauth_to_merchants.rb b/db/migrate/20181019023824_add_oauth_to_merchants.rb new file mode 100644 index 0000000000..2af9b1f1df --- /dev/null +++ b/db/migrate/20181019023824_add_oauth_to_merchants.rb @@ -0,0 +1,6 @@ +class AddOauthToMerchants < ActiveRecord::Migration[5.2] + def change + add_column :merchants, :provider, :string, null: false + add_column :merchants, :uid, :integer, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index da6bedc96b..fe7dbb0801 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: 2018_10_18_223818) do +ActiveRecord::Schema.define(version: 2018_10_19_023824) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -32,6 +32,8 @@ t.string "email" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "provider", null: false + t.integer "uid", null: false end create_table "order_items", force: :cascade do |t| diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index e7bef6ada4..e7ec7a2a8f 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -3,11 +3,17 @@ one: username: griffiam email: sesamestreet@yahoo.com + uid: 12345678 + provider: github two: username: yggurlie email: yggurlie@yahoo.com + uid: 87654321 + provider: github three: username: maddiemax email: maddiemaxwell@yahoo.com + uid: 23456789 + provider: github From 630902b8346fcd845be7b953872e56b90d8beec6 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 20:16:09 -0700 Subject: [PATCH 052/347] passed all tests but one - unsure of why it doesn't work --- app/models/category.rb | 6 ++ app/models/order_item.rb | 13 ++++ app/models/review.rb | 10 ++- test/fixtures/products.yml | 8 ++- test/models/category_test.rb | 3 +- test/models/order_item_test.rb | 114 +++++++++++++++++++++++---------- 6 files changed, 116 insertions(+), 38 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index f3218758f1..708c30e8e5 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,3 +1,9 @@ class Category < ApplicationRecord has_and_belongs_to_many :products + + CATEGORIES = %w(games toys books vitamins meditation) + + validates_associated :products + validates :category, presence: true + validates :category, inclusion: { in: CATEGORIES } end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 6db1ccf618..1225fb7c49 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -2,4 +2,17 @@ class OrderItem < ApplicationRecord belongs_to :product belongs_to :order has_one :merchant, through: :product + + validates_associated :product, :order, :merchant + validates :quantity, presence: true, :numericality => { only_integer: true, greater_than_or_equal_to: 1 } + validates :status, presence: true + + # validate :quantity_validation, on: :new + # + # def quantity_validation + # if self.quantity > self.product.inventory + # self.errors.add(:quantity, " - Please order only what's available") + # end + # end + end diff --git a/app/models/review.rb b/app/models/review.rb index 97679be642..d45de7458f 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,3 +1,11 @@ class Review < ApplicationRecord -belongs_to :product + belongs_to :product + + + validates_associated :product + validates :rating, presence: true + validates :rating, numericality: true + validates :rating, numericality: { only_integer: true } + validates :numericality => { :less_than_or_equal_to => 5, :greater_than_or_equal_to => 1 } + validates :description, presence: true end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 3e3848e5bf..6037af64b8 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -4,13 +4,19 @@ plushie: name: Brain Plushie price: 15.0 description: A beautiful integlligent brain plushie + merchant: one + inventory: 2 puzzle: name: Brain Puzzle price: 100.0 description: improve ur mind! + merchant: two + inventory: 2 puddy: name: Brain Puddy price: 4.75 - description: puddy for ur brain! + description: puddy for ur brain! + merchant: one + inventory: 2 diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 60162b6fc9..68785c9e86 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -14,7 +14,6 @@ ) end - @CATEGORIES = %w[games toys books vitamins meditation] it 'is valid when name is present and unique' do @@ -38,7 +37,7 @@ end - CATEGORIES = %w[games toys books vitamins meditation] + CATEGORIES = %w(games toys books vitamins meditation) it 'is invalid with a non-unique name' do @category.name = CATEGORIES.first diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 97bb799661..df6753ea07 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -1,59 +1,105 @@ require "test_helper" +require 'pry' describe OrderItem do - let(:order_item) { OrderItem.new } + before do + @order_item = OrderItem.first + end it "must be valid" do - value(order_item).must_be :valid? + result = @order_item.valid? + expect( result ).must_equal true end describe 'relations' do + before do + @order_item = OrderItem.first + end + it "belongs to a product" do + product = @order_item.product + expect( product ).must_be_kind_of Product end it "belongs to an order" do + @order_item = OrderItem.first + + order = @order_item.order + + expect( order ).must_be_kind_of Order + end + end + + describe 'validations' do + before do + @order_item = OrderItem.first + end + + it 'is valid with product_id present' do + result = @order_item.valid? + expect( result ).must_equal true + end + + it 'is invalid without product_id' do + @order_item.product_id = nil + result = @order_item.valid? + + expect( result ).wont_equal true + expect( @order_item.errors.messages ).must_include :product + end + + it 'is valid with order_id present' do + result = @order_item.valid? + + expect( result ).must_equal true + end + + it 'is invalid without order_id' do + @order_item.order_id = nil + result = @order_item.valid? + + expect( result ).wont_equal true + expect( @order_item.errors.messages ).must_include :order end - describe 'validations' do - before do - @order_item = Order_item.new( - product_id: 1, - order_id: 1, - quantity: 5, - status: 'pending' - ) - end + it 'is invalid without status' do + @order_item.status = nil + result = @order_item.valid? - it 'is valid with product_id present' do - result = @order_item.valid? - expect( result ).must_equal true - end + expect( result ).wont_equal true + expect( @order_item.errors.messages ).must_include :status + end - it 'is valid with order_id present' do - result = @order_item.valid? - expect( result ).must_equal true - end + it 'is valid with status' do + result = @order_item.valid? + expect( result ).must_equal true + end - it 'is invalid without status' do - @order_item.status = nil - result = @order_item.valid? - expect( @order_item ).errors.messages_must_include :status - end + it 'is invalid if quantity is 0' do + @order_item.quantity = 0 + result = @order_item.valid? - it 'is invalid if quantity is 0' do - @order_item.quantity = 0 - result = @order_item.valid? - expect( @order_item ).errors.messages_must_include :quantity - end + expect( result ).wont_equal true + expect( @order_item.errors.messages ).must_include :quantity + end - it 'is invalid if quantity is nil' do - @order_item.quantity = nil - result = @order_item.valid? - expect( @order_item ).errors.messages_must_include :quantity - end + it 'is invalid if quantity is nil' do + @order_item.quantity = nil + result = @order_item.valid? + expect( result ).wont_equal true + expect( @order_item.errors.messages ).must_include :quantity end + + # it 'is invalid if quantity is greater than product inventory' do + # @order_item.quantity = 20 + # result = @order_item.valid? + # + # expect( result ).wont_equal true + # expect( @order_item.errors.messages ).must_include :quantity + # end end + end From 6c4a214b5aa9ebfad4a1d7844bf9f4f3d5d0a9af Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 20:17:29 -0700 Subject: [PATCH 053/347] some order tests complete and passing. --- test/models/order_test.rb | 54 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 0bd49c97e4..2d3ac00558 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,6 +1,7 @@ require "test_helper" describe Order do + describe 'relations' do it "has a list of order items" do order = orders(:one) @@ -13,17 +14,64 @@ end describe 'validations' do - it 'is valid with an email' do + before do + @order = Order.new( + email: 'aaa@gmail.com', + mailing_address: '12345 A Street', + cc: 1234123412341234, + cc_name: 'Aaa Aaaaaa', + cc_expiration: '20/22', + cvv: 123, + zip: 12345 + ) + end + + it 'is valid when email is present and unique' do + is_valid = @order.valid? + expect( is_valid ).must_equal true + end + it 'is invalid when email is missing' do + @order.email = nil + is_valid = @order.valid? + expect( is_valid ).must_equal false + expect( @order.errors.messages ).must_include :email end - it 'is valid with a mailing address' do + it 'is invalid when email is non-unique' do + @order.email = Order.first.email + is_valid = @order.valid? + expect( is_valid ).must_equal false end - it 'is valid with a cc' do + it 'is valid when mailing address is present' do + is_valid = @order.valid? + expect( is_valid ).must_equal true end + it 'is invalid when mailing address is missing' do + @order.mailing_address = nil + is_valid = @order.valid? + expect( is_valid ).must_equal false + expect( @order.errors.messages ).must_include :mailing_address + end + + it 'is valid when cc is present' do + is_valid = @order.valid? + expect( is_valid ).must_equal true + end + + it 'is invalid when cc is missing' do + @order.cc = nil + is_valid = @order.valid? + expect( is_valid ).must_equal false + expect( @order.errors.messages ).must_include :cc + + end + + + it 'is valid with an integer cc number' do end From 28b0cfc1f52f34f26bdd1997f589955562060206 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Thu, 18 Oct 2018 20:35:32 -0700 Subject: [PATCH 054/347] updated tests for categories --- app/models/category.rb | 2 +- test/fixtures/categories.yml | 2 +- test/models/category_test.rb | 21 ++++++++++----------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index 708c30e8e5..f28cf8054a 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,7 +1,7 @@ class Category < ApplicationRecord has_and_belongs_to_many :products - CATEGORIES = %w(games toys books vitamins meditation) + CATEGORIES = %w(toys books meditation apparel) validates_associated :products validates :category, presence: true diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml index 340ef0809d..79b85f1ff0 100644 --- a/test/fixtures/categories.yml +++ b/test/fixtures/categories.yml @@ -4,7 +4,7 @@ toys: name: toys books: - name: boooks + name: books meditation: name: meditation diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 68785c9e86..c626b16d15 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,28 +1,27 @@ require "test_helper" +require 'pry' describe Category do - let(:category) { Category.new } + @category = Category.first it "must be valid" do - value(category).must_be :valid? + result = @category.valid? + expect( result ).must_equal true end describe 'validations' do before do - @category = Category.new( - name: 'test_category_name' + @category = Category.create( + name: 'candies' ) end @CATEGORIES = %w[games toys books vitamins meditation] it 'is valid when name is present and unique' do - @category.name = "apparel" - +binding.pry result = @category.valid? - - expect(result).must_equal true - expect( @category ).errors.messages_must_include :name + expect( result ).must_equal true end @@ -32,7 +31,7 @@ result = @category.valid? - expect(result).wont_equal true + expect( result ).wont_equal true expect( @category ).errors.messages_must_include :name end @@ -44,7 +43,7 @@ result = @category.valid? - expect(result).wont_equal true + expect( result ).wont_equal true expect( @category ).errors.messages_must_include :name end From 520568e935fecafc4ada98480185449f31ccf415 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 21:04:42 -0700 Subject: [PATCH 055/347] orders tests completed --- app/models/order.rb | 2 +- test/models/order_test.rb | 65 +++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index c3030845ad..1a3fbf8c85 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,7 +1,7 @@ class Order < ApplicationRecord has_many :order_items - validates :email, presence: true + validates :email, presence: true, uniqueness: true validates :mailing_address, presence: true validates :cc, presence: true validates :cc_name, presence: true diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 2d3ac00558..e0c52b4d02 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -15,71 +15,84 @@ describe 'validations' do before do - @order = Order.new( - email: 'aaa@gmail.com', - mailing_address: '12345 A Street', - cc: 1234123412341234, - cc_name: 'Aaa Aaaaaa', - cc_expiration: '20/22', - cvv: 123, - zip: 12345 - ) + @order = orders(:one) end - it 'is valid when email is present and unique' do + it 'is valid when email, mailing, cc, cc_name, ccv and zip is present' do is_valid = @order.valid? + expect( is_valid ).must_equal true end + it 'is valid when email is unique' do + order1 = Order.last + order1.email = 'test@email.com' + + is_valid = order1.valid? + + expect ( is_valid ).must_equal true + end + it 'is invalid when email is missing' do @order.email = nil + is_valid = @order.valid? + expect( is_valid ).must_equal false + expect( @order.errors.messages ).must_include :email end it 'is invalid when email is non-unique' do @order.email = Order.first.email - is_valid = @order.valid? - expect( is_valid ).must_equal false - end - it 'is valid when mailing address is present' do is_valid = @order.valid? - expect( is_valid ).must_equal true - + expect( is_valid ).must_equal false end it 'is invalid when mailing address is missing' do @order.mailing_address = nil + is_valid = @order.valid? + expect( is_valid ).must_equal false expect( @order.errors.messages ).must_include :mailing_address end - it 'is valid when cc is present' do - is_valid = @order.valid? - expect( is_valid ).must_equal true - end - it 'is invalid when cc is missing' do @order.cc = nil + is_valid = @order.valid? + expect( is_valid ).must_equal false expect( @order.errors.messages ).must_include :cc - end + it 'is invalid when cc name is missing' do + @order.cc_name = nil + is_valid = @order.valid? - it 'is valid with an integer cc number' do - + expect( is_valid ).must_equal false + expect( @order.errors.messages ).must_include :cc_name end - it 'is valid with a cc name' do + it 'is invalid when cvv name is missing' do + @order.cvv = nil + + is_valid = @order.valid? + + expect( is_valid ).must_equal false + expect( @order.errors.messages ).must_include :cvv end - it 'is valid with ' do + it 'is invalid when zip is missing' do + @order.zip = nil + + is_valid = @order.valid? + + expect( is_valid ).must_equal false + expect( @order.errors.messages ).must_include :zip end end end From af510c2e1f8ae680c4eef4afed060acd47a5339b Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 21:50:26 -0700 Subject: [PATCH 056/347] changed minor edits on review model --- app/models/review.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/review.rb b/app/models/review.rb index d45de7458f..110e50aca1 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -6,6 +6,6 @@ class Review < ApplicationRecord validates :rating, presence: true validates :rating, numericality: true validates :rating, numericality: { only_integer: true } - validates :numericality => { :less_than_or_equal_to => 5, :greater_than_or_equal_to => 1 } + validates :rating, :numericality => { :less_than_or_equal_to => 5, :greater_than_or_equal_to => 1 } validates :description, presence: true end From 411b0b5bc7e612d2cf9c4e3afbb23128a3061bcc Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 22:40:22 -0700 Subject: [PATCH 057/347] added product controller methods --- app/controllers/products_controller.rb | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6cc58717c0..0f50179917 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,22 +1,54 @@ class ProductsController < ApplicationController def index + @products = Product.all end def show + @product = Product.find_by(id: params[:id]) + if @product.nil? + head:not_found + end end def new + @product = Product.new end def create + @product = Product.new(product_params()) + if @product.save + redirect_to product_path(@product.id) + else + render:new, status: :bad_request + end end def edit + @product = Product.find_by(id: params[:id]) + end def update + @product = Product.find_by(id: params[:id]) + + if @product.update(product_params) + redirect_to product_path(@product.id) + end end def destroy + @product = Product.find_by(id: params[:id]) + @product.destroy + + redirect_to products_path end + + private + def product_params + return params.require(:product).permit( + :name, + :price, + :inventory, + :description + ) end From f1cd971c72073c50ebf0b34ff3dd580ce7cb483c Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Thu, 18 Oct 2018 22:41:01 -0700 Subject: [PATCH 058/347] Change validations for tests --- app/models/category.rb | 6 +----- app/models/review.rb | 7 +------ test/models/category_test.rb | 16 ++-------------- test/models/review_test.rb | 1 + 4 files changed, 5 insertions(+), 25 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index f28cf8054a..4b827d45de 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,9 +1,5 @@ class Category < ApplicationRecord has_and_belongs_to_many :products - - CATEGORIES = %w(toys books meditation apparel) - validates_associated :products - validates :category, presence: true - validates :category, inclusion: { in: CATEGORIES } + validates :name, presence: true end diff --git a/app/models/review.rb b/app/models/review.rb index d45de7458f..b517eb69ea 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,11 +1,6 @@ class Review < ApplicationRecord belongs_to :product - - - validates_associated :product - validates :rating, presence: true - validates :rating, numericality: true validates :rating, numericality: { only_integer: true } - validates :numericality => { :less_than_or_equal_to => 5, :greater_than_or_equal_to => 1 } + validates_inclusion_of :rating, numericality: true, in: (1..5) validates :description, presence: true end diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 4edd26ccd5..068337f762 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,37 +1,25 @@ require "test_helper" -require 'pry' describe Category do - @category = Category.first - - it "must be valid" do - result = @category.valid? - expect( result ).must_equal true - end - describe 'validations' do before do - @category = Category.create( + @category = Category.new( name: 'candies' ) end - @CATEGORIES = %w[games toys books vitamins meditation] - it 'is valid when name is present and unique' do result = @category.valid? expect( result ).must_equal true end - - it 'is invalid without a name' do @category.name = nil result = @category.valid? expect( result ).wont_equal true - expect( @category ).errors.messages_must_include :name + expect( @category.errors.messages ).must_include :name end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 6b5b331ed7..9810902652 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -14,6 +14,7 @@ rating: 5, description: 'test-description' ) + end it "belongs to a product" do From 41d69166d1ea4a128c9faa18eaea544caf50c4bd Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Thu, 18 Oct 2018 23:01:26 -0700 Subject: [PATCH 059/347] product controller tests for index and show --- app/controllers/products_controller.rb | 9 +-- config/routes.rb | 2 +- test/controllers/products_controller_test.rb | 62 ++++++++++++-------- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0f50179917..0c8c390262 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -6,7 +6,7 @@ def index def show @product = Product.find_by(id: params[:id]) if @product.nil? - head:not_found + head :not_found end end @@ -19,7 +19,7 @@ def create if @product.save redirect_to product_path(@product.id) else - render:new, status: :bad_request + render :new, status: :bad_request end end @@ -32,7 +32,7 @@ def update @product = Product.find_by(id: params[:id]) if @product.update(product_params) - redirect_to product_path(@product.id) + redirect_to merchant_product_path(@product.id) end end @@ -40,7 +40,7 @@ def destroy @product = Product.find_by(id: params[:id]) @product.destroy - redirect_to products_path + redirect_to merchant_products_path end private @@ -51,4 +51,5 @@ def product_params :inventory, :description ) + end end diff --git a/config/routes.rb b/config/routes.rb index a286aa0ee0..6fa000ffd2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,7 +7,7 @@ resources :order_items, except: [:index, :show] end - get '/cart', to: 'orders#index', as: 'cart' + get '/cart', to: 'orders#index', as: 'cart' resources :merchants, except: [:index] do resources :products, except: [:destroy] diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index a00ad0e288..dc5586a0bb 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -2,38 +2,52 @@ describe ProductsController do it "should get index" do - get products_index_url - value(response).must_be :success? + get merchant_products_path + + must_response_with :success end it "should get show" do - get products_show_url - value(response).must_be :success? - end + id = products(:puzzle) - it "should get new" do - get products_new_url - value(response).must_be :success? - end + get merchant_product_path(id) - it "should get create" do - get products_create_url - value(response).must_be :success? + must_response_with :success end - it "should get edit" do - get products_edit_url - value(response).must_be :success? - end + it "should respond with not found for showing a non-existing product" do + id = products(:puzzle) + id.destroy - it "should get update" do - get products_update_url - value(response).must_be :success? - end + get merchant_product_path(id) - it "should get destroy" do - get products_destroy_url - value(response).must_be :success? + must_response_with :not_found end - end +# +# it "should get new" do +# get products_new_url +# value(response).must_be :success? +# end +# +# it "should get create" do +# get products_create_url +# value(response).must_be :success? +# end +# +# it "should get edit" do +# get products_edit_url +# value(response).must_be :success? +# end +# +# it "should get update" do +# get products_update_url +# value(response).must_be :success? +# end +# +# it "should get destroy" do +# get products_destroy_url +# value(response).must_be :success? +# end +# +# end From 2296635c1f0485f4a881322a704c4304d8668f1f Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 09:07:24 -0700 Subject: [PATCH 060/347] updated merged category test conflicts --- app/models/category.rb | 5 ++--- test/models/category_test.rb | 17 ++--------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index f28cf8054a..4a56a57f06 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -3,7 +3,6 @@ class Category < ApplicationRecord CATEGORIES = %w(toys books meditation apparel) - validates_associated :products - validates :category, presence: true - validates :category, inclusion: { in: CATEGORIES } + # validates_associated :products + # validates :name, presence: true, inclusion: { in: CATEGORIES } end diff --git a/test/models/category_test.rb b/test/models/category_test.rb index c626b16d15..0c665552b2 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -2,30 +2,17 @@ require 'pry' describe Category do - @category = Category.first - - it "must be valid" do - result = @category.valid? - expect( result ).must_equal true - end - describe 'validations' do - before do - @category = Category.create( - name: 'candies' - ) - end - @CATEGORIES = %w[games toys books vitamins meditation] it 'is valid when name is present and unique' do -binding.pry + @category = Category.new(name: 'candies') result = @category.valid? + expect( result ).must_equal true end - it 'is invalid without a name' do @category.name = nil From 9f2df516468665c279a9a3fd56e37fa773371d25 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 09:27:55 -0700 Subject: [PATCH 061/347] changes to category_test --- test/models/category_test.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 00b398df2a..a635447c85 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,8 +1,10 @@ require "test_helper" describe Category do + + @CATEGORIES = %w[games toys books vitamins meditation] + describe 'validations' do - @CATEGORIES = %w[games toys books vitamins meditation] before do @category = Category.new(name: 'candies') end From 71eb65061469cbc5d0905055531ef06263c6beb6 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 10:02:38 -0700 Subject: [PATCH 062/347] passed all category tests --- app/models/category.rb | 2 +- test/models/category_test.rb | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index 2e4e4ed0f5..ca33e98b80 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -4,5 +4,5 @@ class Category < ApplicationRecord CATEGORIES = %w(toys books meditation apparel) validates_associated :products - validates :name, presence: true, inclusion: { in: CATEGORIES } + validates :name, presence: true, uniqueness: true end diff --git a/test/models/category_test.rb b/test/models/category_test.rb index a635447c85..558df88927 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,9 +1,8 @@ require "test_helper" +require 'pry' describe Category do - @CATEGORIES = %w[games toys books vitamins meditation] - describe 'validations' do before do @category = Category.new(name: 'candies') @@ -26,15 +25,14 @@ end - CATEGORIES = %w(games toys books vitamins meditation) + CATEGORIES = %w(toys books meditation apparel) it 'is invalid with a non-unique name' do - @category.name = CATEGORIES.first - + @category = Category.new(name: 'toys') result = @category.valid? expect( result ).wont_equal true - expect( @category ).errors.messages_must_include :name + expect( @category.errors.messages ).must_include :name end end From b35004a587c8d889c5c109880127a8c01f9ead77 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Fri, 19 Oct 2018 10:17:18 -0700 Subject: [PATCH 063/347] routes corrected --- config/routes.rb | 15 ++++- test/controllers/products_controller_test.rb | 62 ++++++++++++-------- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index a286aa0ee0..2e9b4c2077 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,8 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + root 'products#index', as: 'home' + get "/auth/:provider/callback", to: "sessions#create" resources :orders, only: [:show, :create, :update, :destroy] do @@ -9,12 +11,21 @@ get '/cart', to: 'orders#index', as: 'cart' + resources :products, except: [:new, :create, :destroy] do + + resources :reviews, only: [:index, :new, :create] + end + + + resources :categories, except: [:new, :create, :destroy] do + resources :products, only: [:index] + end + resources :merchants, except: [:index] do - resources :products, except: [:destroy] + resources :products, only: [:new, :create] resources :categories, only: [:new, :create] end - resources :reviews, only: [:new, :create] resources :sessions, only: [:new, :create] post '/sessions/logout', to: 'sessions#logout', as: 'logout' diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index a00ad0e288..d2e3b31304 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -2,38 +2,52 @@ describe ProductsController do it "should get index" do - get products_index_url - value(response).must_be :success? + get merchant_products_path + + must_response_with :success end it "should get show" do - get products_show_url - value(response).must_be :success? - end + id = products(:puzzle) - it "should get new" do - get products_new_url - value(response).must_be :success? - end + get merchant_product_path(id) - it "should get create" do - get products_create_url - value(response).must_be :success? + must_response_with :success end - it "should get edit" do - get products_edit_url - value(response).must_be :success? - end + it "should respond with not found for showing a non-existing product" do + id = products(:puzzle).id + id.destroy - it "should get update" do - get products_update_url - value(response).must_be :success? - end + get merchant_product_path(id) - it "should get destroy" do - get products_destroy_url - value(response).must_be :success? + must_response_with :not_found end - end +# +# it "should get new" do +# get products_new_url +# value(response).must_be :success? +# end +# +# it "should get create" do +# get products_create_url +# value(response).must_be :success? +# end +# +# it "should get edit" do +# get products_edit_url +# value(response).must_be :success? +# end +# +# it "should get update" do +# get products_update_url +# value(response).must_be :success? +# end +# +# it "should get destroy" do +# get products_destroy_url +# value(response).must_be :success? +# end +# +# end From 2982fad5d5807ce35b60512d4bee6eba9d417b4c Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 10:17:35 -0700 Subject: [PATCH 064/347] passed all model test for order_item test --- test/models/review_test.rb | 104 ++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 59 deletions(-) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 9810902652..96baee6efe 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,87 +1,73 @@ require "test_helper" +require 'pry' describe Review do - let(:review) { Review.new } - - it "must be valid" do - value(review).must_be :valid? + describe 'relations' do + it "belongs to a product" do + review = Review.first + product = review.product + product.must_be_instance_of Product + end end - describe 'relations' do + describe 'validations' do before do @review = Review.new( - product_id: 1, + product_id: Product.first.id, rating: 5, description: 'test-description' ) - end - it "belongs to a product" do - item = @review.product + it 'is invalid without a rating' do + @review.rating = nil + result = @review.valid? - expect( item ).must_be_instance_of Product + expect( result ).wont_equal true end - describe 'validations' do - before do - @review = Review.new( - product_id: 1, - rating: 5, - description: 'test-description' - ) - end - - it 'is invalid without a rating' do - @review.rating = nil - result = @review.valid? - - expect( result ).wont_equal true - end + it 'is invalid if rating is not an integer' do + @review.rating = 'five' - it 'is invalid if rating is not an integer' do - @review.rating = 'five' - - result = @review.valid? - expect( result ).wont_equal true - end - - it 'is valid when rating is between 1 and 5' do - result = @review.valid? - expect( result ).must_equal true - end + result = @review.valid? + expect( result ).wont_equal true + end - it 'is valid when rating is less than 1' do - @review.rating = -1 - result = @review.valid? + it 'is valid when rating is between 1 and 5' do + result = @review.valid? + expect( result ).must_equal true + end - expect( result ).must_equal true - end + it 'is invalid when rating is less than 1' do + @review.rating = -1 + result = @review.valid? - it 'is valid when rating is greater than 5' do - @review.rating = 6 - result = @review.valid? + expect( result ).wont_equal true + end - expect( result ).must_equal true - end + it 'is invalid when rating is greater than 5' do + @review.rating = 6 + result = @review.valid? - it 'is valid with product_id present' do - result = @review.valid? - expect( result ).must_equal true - end + expect( result ).wont_equal true + end - it 'is valid with a description' do - result = @review.valid? - expect( result ).must_equal true - end + it 'is valid with product_id present' do + result = @review.valid? + expect( result ).must_equal true + end - it 'is invalid without a description' do - @review.description = nil - result = @review.valid? + it 'is valid with a description' do + result = @review.valid? + expect( result ).must_equal true + end - expect( result ).wont_equal true - end + it 'is invalid without a description' do + @review.description = nil + result = @review.valid? + expect( result ).wont_equal true end + end end From 457cc97c1fc2eaa1cff01b8dd438adf8b11d6c02 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 10:21:19 -0700 Subject: [PATCH 065/347] working on categories controllers --- app/controllers/categories_controller.rb | 3 +++ app/models/category.rb | 2 ++ app/models/merchant.rb | 1 + .../controllers/categories_controller_test.rb | 26 ++++++++++++++----- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 0e3d845f08..da0bb53db6 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,5 +1,8 @@ class CategoriesController < ApplicationController + def new + puts params.to_h + @category = Category.new(params[:merchant_id]) end def create diff --git a/app/models/category.rb b/app/models/category.rb index 4b827d45de..9e9c76a015 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -2,4 +2,6 @@ class Category < ApplicationRecord has_and_belongs_to_many :products validates_associated :products validates :name, presence: true + + end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 82c620fc5a..25200e318a 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,5 +1,6 @@ class Merchant < ApplicationRecord has_many :products + has_many :categories has_many :order_items, through: :product validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness: true diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index f50efa8fb0..3d7253964d 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,14 +1,28 @@ require "test_helper" describe CategoriesController do - it "should get new" do - get categories_new_url - value(response).must_be :success? + describe "new" do + it "should get new category page" do + id = merchants(:one).id + get new_merchant_category_path(id) + + must_respond_with :success + end end - it "should get create" do - get categories_create_url - value(response).must_be :success? + describe "create" do + + it "should create new category with a valid data" do + expect { + post merchant_categories_path, params: {category: {name: "zombie food"}} + }.must_change('Category.count', +1) + + must_respond_with :redirect + must_redirect_to merchant_path + end + end + + end From 3f81d8e03914751f8620b2eb4700eeb95eb2cdd7 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 10:42:43 -0700 Subject: [PATCH 066/347] Remove .env file --- .env | 2 -- test/test_helper.rb | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index e7ba84e6e1..0000000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -GITHUB_CLIENT_ID: 2d12c0fab1c8a110c869 -GITHUB_CLIENT_SECRET: 6df336950ef58a98890cb61af5f9e01f9bf2796d diff --git a/test/test_helper.rb b/test/test_helper.rb index 10594a3248..3f25d0d573 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -23,4 +23,10 @@ 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... + def setup + # Once you have enabled test mode, all requests + # to OmniAuth will be short circuited to use the mock authentication hash. + # A request to /auth/provider will redirect immediately to /auth/provider/callback. + OmniAuth.config.test_mode = true + end end From b7a3be3c59f4ef8d42c146e847e2076cd46bbd1d Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 10:46:47 -0700 Subject: [PATCH 067/347] Update git ignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 18b43c9cd2..8bc6dc6b87 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ # Ignore master key for decrypting credentials and more. /config/master.key + +* Ignore .env file +/.env From af3bc5201099d20956a054abfc8ad7e515d370b4 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Fri, 19 Oct 2018 10:47:04 -0700 Subject: [PATCH 068/347] changed the .gitignore file to add env --- .gitignore | 2 ++ test/controllers/products_controller_test.rb | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 18b43c9cd2..931707d157 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ # Ignore master key for decrypting credentials and more. /config/master.key + +.env diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 513f6c3a45..7b3a929c24 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -4,7 +4,7 @@ it "should get index" do get products_path - must_response_with :success + must_respond_with :success end it "should get show" do @@ -12,7 +12,7 @@ get product_path(id) - must_response_with :success + must_respond_with :success end it "should respond with not found for showing a non-existing product" do @@ -21,7 +21,7 @@ get product_path(id) - must_response_with :not_found + must_respond_with :not_found end end # From 2966a2f54e13130c04c3af4acb2003300b56e06b Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 11:29:32 -0700 Subject: [PATCH 069/347] Work on sessions controller with tests --- app/controllers/sessions_controller.rb | 43 +++++++++++--------- test/controllers/sessions_controller_test.rb | 20 ++++++--- test/test_helper.rb | 11 +++++ 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 38c61c5939..43f5c87b26 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,30 +1,33 @@ class SessionsController < ApplicationController - def login + def create auth_hash = request.env['omniauth.auth'] + @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: 'github') - if auth_hash['uid'] - @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: 'github') - - if @merchant.nil? - @merchant = Merchant.build_from_github(auth_hash) - successful_save = @merchant.save - if successful_save - flash[:success] = "Logged in Successfully. Welcome #{@merchant.username}" - session[:merchant_id] = @merchant.id - redirect_to root_path - else - flash[:alert] = "Some error happened in Merchant creation" - redirect_to root_path - end + if @merchant + # User was found in the database + flash[:success] = "Logged in as returning user #{@merchant.name}" + else + # User doesn't match anything in the DB + # Attempt to create a new user + @merchant = Merchant.build_from_github(auth_hash) + successful_save = @merchant.save + if successful_save + flash[:success] = "Logged in Successfully. Welcome #{@merchant.username}" else - flash[:success] = "Logged in successfully" - session[:merchant_id] = @merchant.id + # Couldn't save the user for some reason. If we + # hit this it probably means there's a bug with the + # way we've configured GitHub. Our strategy will + # be to display error messages to make future + # debugging easier. + flash[:error] = "Could not create new user account: #{@merchant.errors.messages}" redirect_to root_path + return end - else - flash[:alert] = "Logging in through Github not successful" - redirect_to root_path end + + # If we get here, we have a valid user instance + session[:merchant_id] = user.id + redirect_to root_path end def logout diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 54d42acf8f..6e9a3443ed 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,12 +1,22 @@ require "test_helper" describe SessionsController do - def login_form - end + it " redirects to home page and displays a successful flash message when logging in Github is successful" do - def create - end + #Arrange + # Make sure that for some existing user, everything is configured + + merchant_one = merchants(:one) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new( mock_auth_hash( merchant_one ) ) + + + #Act + # Simulating logging in with github being successful (given the OmniAUth hash above) + get auth_callback_path(:github) - def destroy + # Assert + #Check that it redirects + must_redirect_to_root_path + expect(session[:merchant_id]).must_equal merchant_one.id end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 3f25d0d573..764cd9a000 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -29,4 +29,15 @@ def setup # A request to /auth/provider will redirect immediately to /auth/provider/callback. OmniAuth.config.test_mode = true end + + def mock_auth_hash(user) + return { + uid: user.id, + provider: user.provider, + info: { + nickname: user.username, + email: user.email + } + } + end end From bbfbe832681fac52762283eef29ba6c990869c4c Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 13:36:55 -0700 Subject: [PATCH 070/347] Setup sessions controller with passing tests --- app/controllers/sessions_controller.rb | 18 +++++++++++------- config/routes.rb | 2 +- test/controllers/sessions_controller_test.rb | 2 +- test/test_helper.rb | 7 ++++++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 43f5c87b26..b9b8c19e6a 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,16 +1,21 @@ class SessionsController < ApplicationController def create + auth_hash = request.env['omniauth.auth'] - @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: 'github') + @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: auth_hash[:provider]) if @merchant # User was found in the database - flash[:success] = "Logged in as returning user #{@merchant.name}" + flash[:success] = "Logged in as returning user #{@merchant.username}" + else # User doesn't match anything in the DB # Attempt to create a new user + @merchant = Merchant.build_from_github(auth_hash) successful_save = @merchant.save + + if successful_save flash[:success] = "Logged in Successfully. Welcome #{@merchant.username}" else @@ -20,19 +25,18 @@ def create # be to display error messages to make future # debugging easier. flash[:error] = "Could not create new user account: #{@merchant.errors.messages}" - redirect_to root_path + redirect_to home_path return end end - # If we get here, we have a valid user instance - session[:merchant_id] = user.id - redirect_to root_path + session[:merchant_id] = @merchant.id + redirect_to home_path end def logout session[:merchant_id] = nil flash[:success] = "Successfully logged out" - redirect_to root_path + redirect_to home_path end end diff --git a/config/routes.rb b/config/routes.rb index 2e9b4c2077..bcdfbdf399 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,7 +3,7 @@ root 'products#index', as: 'home' - get "/auth/:provider/callback", to: "sessions#create" +get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' resources :orders, only: [:show, :create, :update, :destroy] do resources :order_items, except: [:index, :show] diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 6e9a3443ed..81b7b25c3d 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -16,7 +16,7 @@ # Assert #Check that it redirects - must_redirect_to_root_path + must_redirect_to home_path expect(session[:merchant_id]).must_equal merchant_one.id end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 764cd9a000..aa6109d4f8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -32,7 +32,7 @@ def setup def mock_auth_hash(user) return { - uid: user.id, + uid: user.uid, provider: user.provider, info: { nickname: user.username, @@ -40,4 +40,9 @@ def mock_auth_hash(user) } } end + + def perform_login(user) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) + get auth_callback_path(:github) + end end From 12f5ac30acad89c5f574d9bb87c18d11998192c1 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 13:50:48 -0700 Subject: [PATCH 071/347] Add require login method --- app/controllers/application_controller.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 40253d91fb..e8311ae521 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,6 +1,7 @@ class ApplicationController < ActionController::Base before_action :current_merchant before_action :current_cart + skip_before_action :require_login, only: [:create] private @@ -8,6 +9,13 @@ def current_merchant @current_merchant = Merchant.find_by(id: session[:merchant_id]) end + def require_login + if @current_merchant.nil? + flash[:error] = "You must be logged in to view this section" + redirect_to session_path + end + end + def current_cart if session[:order_id] @shopping_cart = Order.find_by(id: session[:order_id]) From 798f25ddff99a389f50b2547dc391ed82eb76df3 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 13:54:48 -0700 Subject: [PATCH 072/347] Add require login, except for index/show --- app/controllers/categories_controller.rb | 2 ++ app/controllers/products_controller.rb | 1 + 2 files changed, 3 insertions(+) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 0e3d845f08..90166152ea 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,4 +1,6 @@ class CategoriesController < ApplicationController + before_action :require_login, except [:index, :show] + def new end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6cc58717c0..8891491d1f 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,4 +1,5 @@ class ProductsController < ApplicationController + before_action :require_login, except [:index, :show] def index end From df99d17168404f014f4f9c5609743b940b7affc2 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 13:54:55 -0700 Subject: [PATCH 073/347] Remove spacing --- app/controllers/sessions_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index b9b8c19e6a..c96a750814 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,6 +1,5 @@ class SessionsController < ApplicationController def create - auth_hash = request.env['omniauth.auth'] @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: auth_hash[:provider]) From 18c58a94d77b5e368cf97f12e1b62558882239c3 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 14:29:09 -0700 Subject: [PATCH 074/347] Remove nested route for creating category under merchant --- config/routes.rb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index bcdfbdf399..e93c35f8b9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,5 @@ Rails.application.routes.draw do - # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - - root 'products#index', as: 'home' - -get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' - + # For details on the DSL available within this file, see http://g resources :orders, only: [:show, :create, :update, :destroy] do resources :order_items, except: [:index, :show] end @@ -17,16 +12,14 @@ end - resources :categories, except: [:new, :create, :destroy] do + resources :categories, except: [:destroy] do resources :products, only: [:index] end resources :merchants, except: [:index] do resources :products, only: [:new, :create] - resources :categories, only: [:new, :create] end - resources :sessions, only: [:new, :create] post '/sessions/logout', to: 'sessions#logout', as: 'logout' end From 7339322cf6136d94f91605ba4f2a91b64194d950 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 14:35:16 -0700 Subject: [PATCH 075/347] working on controller categories --- app/controllers/categories_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index da0bb53db6..7a61c92fb5 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,8 +1,8 @@ class CategoriesController < ApplicationController def new - puts params.to_h - @category = Category.new(params[:merchant_id]) + # puts params.to_h + @category = Category.new end def create From eba72a21ad53bf508fe74be1d891832cdc6dc55a Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 15:00:49 -0700 Subject: [PATCH 076/347] dan fix: make application controller to require login, then change product and categories --- app/controllers/application_controller.rb | 2 +- app/controllers/categories_controller.rb | 3 +- app/controllers/products_controller.rb | 2 +- .../controllers/categories_controller_test.rb | 57 ++++++++++--------- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e8311ae521..3e2f145deb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,7 +1,7 @@ class ApplicationController < ActionController::Base before_action :current_merchant before_action :current_cart - skip_before_action :require_login, only: [:create] + before_action :require_login private diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 4202e0f9ce..130d5bcbc1 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,5 +1,6 @@ class CategoriesController < ApplicationController - before_action :require_login, except [:index, :show] + before_action :require_login, except: [:index, :show] + skip_before_action :require_login, only: [:create] def new # puts params.to_h diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 8891491d1f..2764193dd5 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,5 @@ class ProductsController < ApplicationController - before_action :require_login, except [:index, :show] + before_action :require_login, except: [:index, :show] def index end diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index ce58b81537..af484da93e 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -2,38 +2,43 @@ require 'pry' describe CategoriesController do - describe "new" do - # it "should get new category page for merchants that exist" do - # get new_merchant_category_path(merchants(:one).id) - # - # must_respond_with :success - # end - it "should not get new category page for merchants that do not exist" do + describe "logged in users" do + it "should get new category page for merchants that exist" do merchant = merchants(:one) - merchant.products.destroy_all - merchant.categories.destroy_all + perform_login(merchant) - merchant.destroy - get new_merchant_category_path(merchant.id) - - must_respond_with :not_found + get new_merchant_category_path(merchants(:one).id) + must_respond_with :success end - end - describe "create" do - - it "should create new category with a valid data" do - expect { - post merchant_categories_path, params: {category: {name: "zombie food"}} - }.must_change('Category.count', +1) - - must_respond_with :redirect - must_redirect_to merchant_path - end - - end + # describe "new" do + # it "should not get new category page for merchants that do not exist" do + # merchant = merchants(:one) + # merchant.products.destroy_all + # merchant.categories.destroy_all + # + # merchant.destroy + # get new_merchant_category_path(merchant.id) + # + # must_respond_with :not_found + # end + # + # end + # + # describe "create" do + # + # it "should create new category with a valid data" do + # expect { + # post merchant_categories_path, params: {category: {name: "zombie food"}} + # }.must_change('Category.count', +1) + # + # must_respond_with :redirect + # must_redirect_to merchant_path + # end + # + # end From 164d76de6a72915471150d5b4f39dee1612442fe Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 15:09:16 -0700 Subject: [PATCH 077/347] manual branch issue fix for routes --- config/routes.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index e93c35f8b9..d3b22a2c58 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,17 +1,18 @@ Rails.application.routes.draw do - # For details on the DSL available within this file, see http://g + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + + root 'products#index', as: 'root' + get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' + get '/cart', to: 'orders#index', as: 'cart' + resources :orders, only: [:show, :create, :update, :destroy] do resources :order_items, except: [:index, :show] end - get '/cart', to: 'orders#index', as: 'cart' - resources :products, except: [:new, :create, :destroy] do - resources :reviews, only: [:index, :new, :create] end - resources :categories, except: [:destroy] do resources :products, only: [:index] end From f928eb9cdae17ad000863a8f29d6599891df8a14 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 15:16:44 -0700 Subject: [PATCH 078/347] added tests and all failing for order item controller --- .gitignore | 2 + .../order_items_controller_test.rb | 91 ++++++++++++++++--- 2 files changed, 78 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 8bc6dc6b87..57f966605e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ /public/assets .byebug_history + +.env # Ignore master key for decrypting credentials and more. /config/master.key diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 51d5429c17..30df533880 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -1,29 +1,90 @@ require "test_helper" +require 'pry' describe OrderItemsController do - it "should get new" do - get order_items_new_url - value(response).must_be :success? + describe "new" do + order_item = OrderItem.first + + it "should get new" do + get new_order_order_item_path(order_item.id) + must_respond_with :success + end end - it "should get create" do - get order_items_create_url - value(response).must_be :success? + describe "create" do + order = Order.first + product = Product.first + order_item = OrderItem.new(quantity: 5, status: 'pending', order_id: order.id, product_id: product.id) + + it "succeeds for an existing order_item ID" do + order_item_count = OrderItem.count + + post order_order_items_path(order.id) + expect( order_item_count ).must_equal order_item_count + 1 + must_respond_with :success + end + + it "renders 404 not_found for a bogus order_item data" do + + end end - it "should get edit" do - get order_items_edit_url - value(response).must_be :success? + describe "edit" do + order_item = OrderItem.first + id = OrderItem.first.order_id + + it "succeeds for an existing order_item ID" do + get edit_order_order_item_path(order_item.id, id) + + must_respond_with :success + must_redirect_to order_order_item_path(order_item.id, id) + end + + it "renders 404 not_found for a bogus order_item ID" do + + end end - it "should get update" do - get order_items_update_url - value(response).must_be :success? + describe "update" do + order_item = OrderItem.first + id = OrderItem.first.order_id + + it "succeeds for valid data and an existing order_item ID" do + patch order_order_item_path(order_item.id, id) + + must_respond_with :success + must_redirect_to order_path(id) + end + + it "renders bad_request and does not update the DB for bogus data" do + + end + + + it "renders bad_request for bogus data" do + + end + + it "renders 404 not_found for a bogus order_item ID" do + + end + end - it "should get destroy" do - get order_items_destroy_url - value(response).must_be :success? + describe "delete" do + order_item = OrderItem.first + id = OrderItem.first.order_id + + it "succeeds for an existing order_item ID" do + delete order_order_item_path(order_item.id, id) + + must_respond_with :success + must_redirect_to order_path(id) + end + + it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do + + end end end From fd766ada343bdc3564061cb21ea2f1bf8bd88ab2 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Fri, 19 Oct 2018 15:18:13 -0700 Subject: [PATCH 079/347] added new form controller test --- test/controllers/products_controller_test.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 7b3a929c24..57e00d02cf 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -23,6 +23,12 @@ must_respond_with :not_found end + + it 'should get a new form to add products' do + get new_product_path + + must_respond_with :success + end end # # it "should get new" do From f7244e9f511e665b617ddbc40abf0a8887897487 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 15:23:30 -0700 Subject: [PATCH 080/347] Move require login filters --- app/controllers/application_controller.rb | 1 - app/controllers/sessions_controller.rb | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 3e2f145deb..f42b3306f9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,7 +1,6 @@ class ApplicationController < ActionController::Base before_action :current_merchant before_action :current_cart - before_action :require_login private diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index c96a750814..907f1b1b08 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,4 +1,7 @@ class SessionsController < ApplicationController + + skip_before_action :require_login, only: [:create] + def create auth_hash = request.env['omniauth.auth'] @merchant = Merchant.find_by(uid: auth_hash[:uid], provider: auth_hash[:provider]) From 86c58aab4804ada3ee111724fcbbdbea59e4bc18 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 15:23:42 -0700 Subject: [PATCH 081/347] Redefinte methods needed --- app/controllers/merchants_controller.rb | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index f8d1b1933a..56f840488a 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,19 +1,11 @@ class MerchantsController < ApplicationController - def show - end - - def new - end - def create + def index end - def edit + def show end - def update - end + def order_ - def destroy - end end From 9922f8ae57d17eb9618548cf3bd296015bca3c25 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 15:24:33 -0700 Subject: [PATCH 082/347] Change redirect to root_path --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f42b3306f9..4e2f951097 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -11,7 +11,7 @@ def current_merchant def require_login if @current_merchant.nil? flash[:error] = "You must be logged in to view this section" - redirect_to session_path + redirect_to root_path end end From c611897f0e598a701d4dbfbb066413a4f0c77370 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 15:32:49 -0700 Subject: [PATCH 083/347] change home_path to root_path --- app/controllers/sessions_controller.rb | 6 +++--- test/controllers/sessions_controller_test.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 907f1b1b08..5b4ce55ddc 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -27,18 +27,18 @@ def create # be to display error messages to make future # debugging easier. flash[:error] = "Could not create new user account: #{@merchant.errors.messages}" - redirect_to home_path + redirect_to root_path return end end # If we get here, we have a valid user instance session[:merchant_id] = @merchant.id - redirect_to home_path + redirect_to root_path end def logout session[:merchant_id] = nil flash[:success] = "Successfully logged out" - redirect_to home_path + redirect_to root_path end end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 81b7b25c3d..5f3c1f7b8d 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -16,7 +16,7 @@ # Assert #Check that it redirects - must_redirect_to home_path + must_redirect_to root_path expect(session[:merchant_id]).must_equal merchant_one.id end end From a99cf08ace7e7c56f55867a6a39b1a2d7c97dd64 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 15:55:50 -0700 Subject: [PATCH 084/347] make require_login run before all action in applications --- app/controllers/application_controller.rb | 1 + app/controllers/categories_controller.rb | 2 -- app/controllers/sessions_controller.rb | 1 - test/controllers/categories_controller_test.rb | 3 ++- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4e2f951097..62780d5690 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,6 +1,7 @@ class ApplicationController < ActionController::Base before_action :current_merchant before_action :current_cart + before_action :require_login private diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 130d5bcbc1..7a61c92fb5 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,6 +1,4 @@ class CategoriesController < ApplicationController - before_action :require_login, except: [:index, :show] - skip_before_action :require_login, only: [:create] def new # puts params.to_h diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 5b4ce55ddc..8fa80db18c 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,5 +1,4 @@ class SessionsController < ApplicationController - skip_before_action :require_login, only: [:create] def create diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index af484da93e..a6d8c54e20 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -8,9 +8,10 @@ merchant = merchants(:one) perform_login(merchant) - get new_merchant_category_path(merchants(:one).id) + get new_category_path must_respond_with :success end + end # describe "new" do From 9498d8cd91b34774dd444979e59836ae14588330 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 15:56:31 -0700 Subject: [PATCH 085/347] started writing controller methods and added skip_before_action --- app/controllers/order_items_controller.rb | 22 ++++++ test/controllers/reviews_controller_test.rb | 87 +++++++++++++++++++-- 2 files changed, 103 insertions(+), 6 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index d47c6f4389..81bb632bf1 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,8 +1,24 @@ class OrderItemsController < ApplicationController + skip_before_action :require_login + def new + @order_items = (OrderItem.all).sort_by do |order_item| + order_item.id + end end def create + @order_item = OrderItem.new(order_items_params) + if @order_item.save + flash[:status] = :success + flash[:result_text] = "Successfully created #{@order_item.singularize} #{@order_item.id}" + redirect_to order_item_path(@order_item) + else + flash[:status] = :failure + flash[:result_text] = "Could not create #{@order_item.singularize}" + flash[:messages] = @order_item.errors.messages + render :new, status: :bad_request + end end def edit @@ -13,4 +29,10 @@ def update def destroy end + + + private + def order_item_params + params.require(:order_item).permit(:quantity, :status, :order_id, :product_id) + end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index a0a226d82d..be250c1096 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,14 +1,89 @@ require "test_helper" describe ReviewsController do - it "should get new" do - get reviews_new_url - value(response).must_be :success? + describe "new" do + review = Review.first + + it "should get new" do + get new_order_order_item_path(order_item.id) + must_respond_with :success + end + end + + describe "create" do + order = Order.first + product = Product.first + review = Review.new(quantity: 5, status: 'pending', order_id: order.id, product_id: product.id) + + it "succeeds for an existing order_item ID" do + review_count = Review.count + + post order_order_items_path(order.id) + expect( order_item_count ).must_equal order_item_count + 1 + must_respond_with :success + end + + it "renders 404 not_found for a bogus order_item data" do + + end end - it "should get create" do - get reviews_create_url - value(response).must_be :success? + describe "edit" do + review = Review.first + id = Review.first.order_id + + it "succeeds for an existing order_item ID" do + get edit_order_order_item_path(order_item.id, id) + + must_respond_with :success + must_redirect_to order_order_item_path(order_item.id, id) + end + + it "renders 404 not_found for a bogus order_item ID" do + + end + end + + describe "update" do + review = Review.first + id = Review.first.order_id + + it "succeeds for valid data and an existing order_item ID" do + patch order_order_item_path(order_item.id, id) + + must_respond_with :success + must_redirect_to order_path(id) + end + + it "renders bad_request and does not update the DB for bogus data" do + + end + + + it "renders bad_request for bogus data" do + + end + + it "renders 404 not_found for a bogus order_item ID" do + + end + + end + + describe "delete" do + review = Review.first + id = Review.first.order_id + + it "succeeds for an existing order_item ID" do + delete order_order_item_path(order_item.id, id) + + must_respond_with :success + must_redirect_to order_path(id) + end + + it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do + + end end end From 6f187328e82eb705b4480dbeb977a5d8d2ca9132 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 17:03:08 -0700 Subject: [PATCH 086/347] can create new category for valid merchant? in progress --- app/controllers/categories_controller.rb | 18 ++++++++ .../controllers/categories_controller_test.rb | 46 ++++++++----------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 7a61c92fb5..d6040b874a 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -6,5 +6,23 @@ def new end def create + @category = Category.new(category_params) + # + # if @category.save + # flash[:status] = :success + # flash[:result_text] = "Successfully created new category: #{@category.name}" + # redirect_to category_path(@category) + # else + # flash[:status] = :failure + # flash[:result_text] = "Could not create #{@category.name}" + # flash[:messages] = @category.errors.messages + # render :new, status: bad_request + # end + + end + + private + def category_params + params.require(:category).permit(:name) end end diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index a6d8c54e20..cf04ed430b 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -4,7 +4,7 @@ describe CategoriesController do describe "logged in users" do - it "should get new category page for merchants that exist" do + it "should be able to access new category page" do merchant = merchants(:one) perform_login(merchant) @@ -12,34 +12,26 @@ must_respond_with :success end + it "should be able to create a new category with valid data" do + expect { + post categories_path, params: {category: {name: "zombie food"}} + }.must_change('Category.count', +1) + + must_respond_with :success + must_redirect_to root_path + end + + + end + + describe "guest users" do + it "should not be able to access new category page" do + get new_category_path + must_respond_with :redirect + must_redirect_to root_path + end end - # describe "new" do - # it "should not get new category page for merchants that do not exist" do - # merchant = merchants(:one) - # merchant.products.destroy_all - # merchant.categories.destroy_all - # - # merchant.destroy - # get new_merchant_category_path(merchant.id) - # - # must_respond_with :not_found - # end - # - # end - # - # describe "create" do - # - # it "should create new category with a valid data" do - # expect { - # post merchant_categories_path, params: {category: {name: "zombie food"}} - # }.must_change('Category.count', +1) - # - # must_respond_with :redirect - # must_redirect_to merchant_path - # end - # - # end From 206bbef0428565e2f08d9189e7aab1e387441374 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 17:03:32 -0700 Subject: [PATCH 087/347] add edit to products under merchant, remove edit from general products route --- config/routes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index d3b22a2c58..bb199fc8e2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,7 @@ resources :order_items, except: [:index, :show] end - resources :products, except: [:new, :create, :destroy] do + resources :products, except: [:new, :create, :edit, :destroy] do resources :reviews, only: [:index, :new, :create] end @@ -18,7 +18,7 @@ end resources :merchants, except: [:index] do - resources :products, only: [:new, :create] + resources :products, only: [:new, :create, :edit] end resources :sessions, only: [:new, :create] From 9d3d1debeaf860552c54969be03df05f80df889c Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 17:25:10 -0700 Subject: [PATCH 088/347] take out edit in nested order items --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index bb199fc8e2..897a6a523c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,7 +6,7 @@ get '/cart', to: 'orders#index', as: 'cart' resources :orders, only: [:show, :create, :update, :destroy] do - resources :order_items, except: [:index, :show] + resources :order_items, except: [:index, :show, :edit] end resources :products, except: [:new, :create, :edit, :destroy] do From 56eb146619eb73f1b140f9434f73891b3451783b Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 17:51:45 -0700 Subject: [PATCH 089/347] changes to order items controller - merge changes --- app/controllers/order_items_controller.rb | 6 ++---- test/controllers/order_items_controller_test.rb | 2 +- test/controllers/reviews_controller_test.rb | 8 +++++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 81bb632bf1..94536ee9e3 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -2,13 +2,11 @@ class OrderItemsController < ApplicationController skip_before_action :require_login def new - @order_items = (OrderItem.all).sort_by do |order_item| - order_item.id - end + @order_items = OrderItem.new end def create - @order_item = OrderItem.new(order_items_params) + @order_item = OrderItem.new(params( order_item_params) ) if @order_item.save flash[:status] = :success flash[:result_text] = "Successfully created #{@order_item.singularize} #{@order_item.id}" diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 30df533880..22551e78bc 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -73,7 +73,7 @@ describe "delete" do order_item = OrderItem.first - id = OrderItem.first.order_id + id = OrderItem.first.id it "succeeds for an existing order_item ID" do delete order_order_item_path(order_item.id, id) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index be250c1096..9786b4f314 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -71,11 +71,13 @@ end describe "delete" do - review = Review.first - id = Review.first.order_id + before do + review = Review.first + id = Review.first.order_id + end it "succeeds for an existing order_item ID" do - delete order_order_item_path(order_item.id, id) + delete order_order_item_path(id) must_respond_with :success must_redirect_to order_path(id) From a18bc24208e7a592def6ead22d297ccf43d4bca2 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Fri, 19 Oct 2018 17:53:13 -0700 Subject: [PATCH 090/347] more product controller testing --- app/controllers/products_controller.rb | 3 +- app/models/category.rb | 6 ++-- app/models/product.rb | 3 +- config/routes.rb | 9 +++-- test/controllers/products_controller_test.rb | 36 ++++++++++++++++---- test/fixtures/categories.yml | 8 ++--- test/fixtures/products.yml | 10 ++++-- test/models/product_test.rb | 2 +- 8 files changed, 52 insertions(+), 25 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4b8a7af201..2ded0ac6a3 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,5 @@ class ProductsController < ApplicationController - before_action :require_login, except: [:index, :show] + # skip_before_action :require_login, only: [:index, :show] def index @products = Product.all end @@ -12,6 +12,7 @@ def show end def new + @product = Product.new end diff --git a/app/models/category.rb b/app/models/category.rb index f28cf8054a..1e502c3fd5 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,9 +1,7 @@ class Category < ApplicationRecord has_and_belongs_to_many :products - CATEGORIES = %w(toys books meditation apparel) - validates_associated :products - validates :category, presence: true - validates :category, inclusion: { in: CATEGORIES } + validates :name, presence: true + end diff --git a/app/models/product.rb b/app/models/product.rb index ff3a76fdc2..b47edb28ad 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,7 +4,8 @@ class Product < ApplicationRecord has_many :order_items, dependent: :destroy has_many :reviews, dependent: :destroy - validates :name, presence: true, uniqueness: true + validates :name, presence: true + validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 end diff --git a/config/routes.rb b/config/routes.rb index 1d56eab7db..ffaa9cc970 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,18 +2,17 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'products#index', as: 'root' + get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' - get '/cart', to: 'orders#index', as: 'cart' + resources :orders, only: [:show, :create, :update, :destroy] do resources :order_items, except: [:index, :show] end -<<<<<<< HEAD - get '/cart', to: 'orders#index', as: 'cart' + get '/cart', to: 'orders#index', as: 'cart' + -======= ->>>>>>> master resources :products, except: [:new, :create, :destroy] do resources :reviews, only: [:index, :new, :create] end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 57e00d02cf..b67a138d68 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,4 +1,5 @@ require "test_helper" +require 'pry' describe ProductsController do it "should get index" do @@ -25,16 +26,39 @@ end it 'should get a new form to add products' do - get new_product_path + merchant = merchants(:one) + + get new_merchant_product_path(merchant.id) must_respond_with :success end + + it 'it can create a product with valid data' do + product_info = { + mazze: { + name: "Brain Puzzle", + price: 25, + description: "An integlligent brain plushie", + inventory: 10, + category_ids: [Category.first.id], + merchant: merchants(:one) + } + } + + test_product = Product.new(product_info[:mazze]) + # binding.pry + valid = test_product.valid? + valid.must_equal true, "Product data was invalid: #{test_product.errors.messages}, please come fix this test" + + + expect{ + post merchant_products_path(merchants(:one).id), params: product_info + }.must_change('Product.count', +1) + + must_redirect_to product_path(Product.last.id) + end end -# -# it "should get new" do -# get products_new_url -# value(response).must_be :success? -# end + # # it "should get create" do # get products_create_url diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml index 79b85f1ff0..9a5d032e34 100644 --- a/test/fixtures/categories.yml +++ b/test/fixtures/categories.yml @@ -1,10 +1,10 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -toys: - name: toys +toy: + name: toy -books: - name: books +book: + name: book meditation: name: meditation diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index f479cfbad0..11fb79ac78 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,6 +5,7 @@ plushie: price: 15 description: A beautiful integlligent brain plushie inventory: 10 + categories: toy merchant: one puzzle: @@ -13,18 +14,21 @@ puzzle: description: improve ur mind! merchant: two inventory: 2 + categories: toy puddy: name: Brain Puddy - price: 4.75 + price: 14 description: puddy for ur brain! inventory: 5 merchant: two + categories: toy -puddy: - name: Brain Puddy +yoga: + name: Yoga mat price: 475 description: puddy for ur brain! inventory: 100 merchant: three + categories: toy diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 938c9227e9..7f7b7405ba 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -19,7 +19,7 @@ it 'has many categories' do product = Product.first product.categories.each do |category| - category.must_be_instance_of Product + category.must_be_instance_of Category end end From 95a7a40051505e936f35aa1df5661bc5dab9570e Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 17:55:57 -0700 Subject: [PATCH 091/347] working on categories controller test --- app/controllers/categories_controller.rb | 27 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index d6040b874a..e7eadeacc3 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -7,17 +7,26 @@ def new def create @category = Category.new(category_params) - # - # if @category.save - # flash[:status] = :success - # flash[:result_text] = "Successfully created new category: #{@category.name}" - # redirect_to category_path(@category) + + if @category.save + flash[:status] = :success + flash[:result_text] = "Successfully created new category: #{@category.name}" + redirect_to category_path(@category) + else + flash[:status] = :failure + flash[:result_text] = "Could not create #{@category.name}" + flash[:messages] = @category.errors.messages + render :new, status: bad_request + end + # else # flash[:status] = :failure - # flash[:result_text] = "Could not create #{@category.name}" - # flash[:messages] = @category.errors.messages - # render :new, status: bad_request - # end + # flash[:result_text] = "Could not create #{@media_category.singularize}" + # flash[:messages] = @work.errors.messages + # render :new, status: :bad_request + # end + + end From 7d55e6179348a844164980b91ebe985dc8703e02 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 18:05:03 -0700 Subject: [PATCH 092/347] Modify validations and test to pass --- app/models/category.rb | 5 +---- test/models/category_test.rb | 3 --- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index f28cf8054a..5f7cabae43 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,9 +1,6 @@ class Category < ApplicationRecord has_and_belongs_to_many :products - CATEGORIES = %w(toys books meditation apparel) - validates_associated :products - validates :category, presence: true - validates :category, inclusion: { in: CATEGORIES } + validates :name, presence: true, uniqueness: true end diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 558df88927..423ff49c2b 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -24,9 +24,6 @@ expect( @category.errors.messages ).must_include :name end - - CATEGORIES = %w(toys books meditation apparel) - it 'is invalid with a non-unique name' do @category = Category.new(name: 'toys') result = @category.valid? From c3c1d11ccae444b22500a756fb6602c778678b6d Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Fri, 19 Oct 2018 18:36:08 -0700 Subject: [PATCH 093/347] Make changes --- test/fixtures/products.yml | 4 ++++ test/models/product_test.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index f479cfbad0..26e9fc73f3 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -6,6 +6,7 @@ plushie: description: A beautiful integlligent brain plushie inventory: 10 merchant: one + categories: toy puzzle: name: Brain Puzzle @@ -13,6 +14,7 @@ puzzle: description: improve ur mind! merchant: two inventory: 2 + categories: toy puddy: name: Brain Puddy @@ -20,6 +22,7 @@ puddy: description: puddy for ur brain! inventory: 5 merchant: two + categories: toy puddy: @@ -28,3 +31,4 @@ puddy: description: puddy for ur brain! inventory: 100 merchant: three + categories: toy diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 938c9227e9..7f7b7405ba 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -19,7 +19,7 @@ it 'has many categories' do product = Product.first product.categories.each do |category| - category.must_be_instance_of Product + category.must_be_instance_of Category end end From f910d77ddf45f6d2dc6545fbf7eb300978cb4b36 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Fri, 19 Oct 2018 18:38:20 -0700 Subject: [PATCH 094/347] some minior changes --- app/models/product.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index b47edb28ad..9d7da76296 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,8 +4,8 @@ class Product < ApplicationRecord has_many :order_items, dependent: :destroy has_many :reviews, dependent: :destroy - validates :name, presence: true - + validates :name, presence: true, uniqueness: true + validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 end From cfe74d6e5fae20b1be6070c41018ed40f238aa46 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 18:48:53 -0700 Subject: [PATCH 095/347] can create new category as a logged in merchant --- app/controllers/categories_controller.rb | 12 +--------- .../controllers/categories_controller_test.rb | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index e7eadeacc3..b30df8fdae 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -11,23 +11,13 @@ def create if @category.save flash[:status] = :success flash[:result_text] = "Successfully created new category: #{@category.name}" - redirect_to category_path(@category) + redirect_to categories_path(@category) else flash[:status] = :failure flash[:result_text] = "Could not create #{@category.name}" flash[:messages] = @category.errors.messages render :new, status: bad_request end - - # else - # flash[:status] = :failure - # flash[:result_text] = "Could not create #{@media_category.singularize}" - # flash[:messages] = @work.errors.messages - # render :new, status: :bad_request - # end - - - end private diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index cf04ed430b..f3cb866c5c 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -2,8 +2,12 @@ require 'pry' describe CategoriesController do - describe "logged in users" do + before do + merchant = merchants(:one) + perform_login(merchant) + end + it "should be able to access new category page" do merchant = merchants(:one) perform_login(merchant) @@ -13,15 +17,21 @@ end it "should be able to create a new category with valid data" do + data = { + category: { + name: 'zombie food' + } + } + + category = Category.new(data[:category]) + category.must_be :valid? expect { - post categories_path, params: {category: {name: "zombie food"}} + post categories_path, params: data }.must_change('Category.count', +1) - must_respond_with :success - must_redirect_to root_path + must_respond_with :redirect + must_redirect_to categories_path(Category.last) end - - end describe "guest users" do From e956b9dcdb65a93294faded9357bf084ebf2d36e Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Fri, 19 Oct 2018 18:51:05 -0700 Subject: [PATCH 096/347] minior change in category_test.rb --- test/models/category_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 423ff49c2b..f7d04d4d17 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -25,7 +25,7 @@ end it 'is invalid with a non-unique name' do - @category = Category.new(name: 'toys') + @category = Category.new(name: 'toy') result = @category.valid? expect( result ).wont_equal true From 0854866522c254357a4464945c18f19fc1b8541e Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 19:14:55 -0700 Subject: [PATCH 097/347] changes to controller tests --- app/controllers/order_items_controller.rb | 11 -------- .../order_items_controller_test.rb | 28 +++++++++++-------- test/models/category_test.rb | 3 +- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 94536ee9e3..5f878734cd 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -6,17 +6,6 @@ def new end def create - @order_item = OrderItem.new(params( order_item_params) ) - if @order_item.save - flash[:status] = :success - flash[:result_text] = "Successfully created #{@order_item.singularize} #{@order_item.id}" - redirect_to order_item_path(@order_item) - else - flash[:status] = :failure - flash[:result_text] = "Could not create #{@order_item.singularize}" - flash[:messages] = @order_item.errors.messages - render :new, status: :bad_request - end end def edit diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 22551e78bc..9943ef5858 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -14,14 +14,24 @@ describe "create" do order = Order.first product = Product.first - order_item = OrderItem.new(quantity: 5, status: 'pending', order_id: order.id, product_id: product.id) - - it "succeeds for an existing order_item ID" do + order_item_data = { + order_item1: { + quantity: 5, + status: 'pending', + order_id: order.id, + product_id: product.id + } + } + + it "creates an new order item" do order_item_count = OrderItem.count - post order_order_items_path(order.id) - expect( order_item_count ).must_equal order_item_count + 1 - must_respond_with :success + expect { + post new_order_order_item_path, params: order_item_data + }.must_change('OrderItem.count', +1) + + #Assert + must_redirect_to cart_path(OrderItem.last) end it "renders 404 not_found for a bogus order_item data" do @@ -31,13 +41,9 @@ describe "edit" do order_item = OrderItem.first - id = OrderItem.first.order_id + id = order_item.id it "succeeds for an existing order_item ID" do - get edit_order_order_item_path(order_item.id, id) - - must_respond_with :success - must_redirect_to order_order_item_path(order_item.id, id) end it "renders 404 not_found for a bogus order_item ID" do diff --git a/test/models/category_test.rb b/test/models/category_test.rb index f7d04d4d17..61db0cb9ed 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require 'pry' describe Category do @@ -10,7 +9,7 @@ it 'is valid when name is present and unique' do result = @category.valid? - +binding.pry expect( result ).must_equal true end From d6ce13938f632f8422c422dbdb459b908b95eaf8 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Fri, 19 Oct 2018 19:49:14 -0700 Subject: [PATCH 098/347] changed login session methods --- app/controllers/merchants_controller.rb | 4 ++-- app/controllers/products_controller.rb | 6 +++++- test/controllers/products_controller_test.rb | 13 ++++++++----- test/fixtures/products.yml | 1 - test/test_helper.rb | 2 +- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 56f840488a..3749823a62 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -6,6 +6,6 @@ def index def show end - def order_ - + def order + end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 2ded0ac6a3..d536570609 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,9 @@ class ProductsController < ApplicationController - # skip_before_action :require_login, only: [:index, :show] + skip_before_action :require_login, only: [:index, :show] + + before_action :require_login, only: [:new, :create] + + def index @products = Product.all end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index b67a138d68..736ffa4f6d 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -2,6 +2,8 @@ require 'pry' describe ProductsController do + let(:one) {merchants(:one)} + it "should get index" do get products_path @@ -26,17 +28,19 @@ end it 'should get a new form to add products' do - merchant = merchants(:one) + login(one) + # merchant = merchants(:one) - get new_merchant_product_path(merchant.id) + get new_merchant_product_path(one.id) must_respond_with :success end it 'it can create a product with valid data' do + login(one) product_info = { mazze: { - name: "Brain Puzzle", + name: "some toy", price: 25, description: "An integlligent brain plushie", inventory: 10, @@ -46,13 +50,12 @@ } test_product = Product.new(product_info[:mazze]) - # binding.pry valid = test_product.valid? valid.must_equal true, "Product data was invalid: #{test_product.errors.messages}, please come fix this test" expect{ - post merchant_products_path(merchants(:one).id), params: product_info + post merchant_products_path(one.id), params: product_info }.must_change('Product.count', +1) must_redirect_to product_path(Product.last.id) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index ed343aaec1..c30a671e29 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,7 +5,6 @@ plushie: price: 15 description: A beautiful integlligent brain plushie inventory: 10 - categories: toy merchant: one categories: toy diff --git a/test/test_helper.rb b/test/test_helper.rb index aa6109d4f8..42d79e2e88 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -41,7 +41,7 @@ def mock_auth_hash(user) } end - def perform_login(user) + def login(user) OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) get auth_callback_path(:github) end From f22252f2b0745aef1ea53471ef7010d67972213f Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 19:50:33 -0700 Subject: [PATCH 099/347] Work in progress --- app/controllers/categories_controller.rb | 2 +- app/controllers/merchants_controller.rb | 3 ++- app/models/category.rb | 1 - .../controllers/categories_controller_test.rb | 23 +++++++++++++++++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index b30df8fdae..3970a72f72 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -16,7 +16,7 @@ def create flash[:status] = :failure flash[:result_text] = "Could not create #{@category.name}" flash[:messages] = @category.errors.messages - render :new, status: bad_request + render :new, status: :bad_request end end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 56f840488a..3c457282b4 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -6,6 +6,7 @@ def index def show end - def order_ + def order + end end diff --git a/app/models/category.rb b/app/models/category.rb index 85fed3f7bd..ca3cae6f23 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -4,5 +4,4 @@ class Category < ApplicationRecord validates_associated :products validates :name, presence: true, uniqueness: true - end diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index f3cb866c5c..ceff5cebcf 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -32,17 +32,36 @@ must_respond_with :redirect must_redirect_to categories_path(Category.last) end + + it "should be responded with a bad request for a non-unique category name" do + data = {category: {name: 'toy'}} + + category = Category.new(data[:category]) + expect { + post categories_path, params: data + }.wont_change('Category.count') + + must_respond_with :bad_request + end end describe "guest users" do + it "should not be able to access new category page" do get new_category_path must_respond_with :redirect must_redirect_to root_path end - end - + it "should not be able to create a new category" do + data = {category: {name: 'toy'}} + category = Category.new(data[:category]) + expect { + post categories_path, params: data + }.wont_change('Category.count') + must_respond_with :bad_request + end + end end From 73b7d75acab18279f8327eed9363c7f9796f47f7 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 20:10:09 -0700 Subject: [PATCH 100/347] test guest users should not be able to create a new category --- .../controllers/categories_controller_test.rb | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index ceff5cebcf..5199a68f60 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -2,21 +2,17 @@ require 'pry' describe CategoriesController do + let(:one) { merchants(:one) } describe "logged in users" do - before do - merchant = merchants(:one) - perform_login(merchant) - end it "should be able to access new category page" do - merchant = merchants(:one) - perform_login(merchant) - + login(one) get new_category_path must_respond_with :success end it "should be able to create a new category with valid data" do + login(one) data = { category: { name: 'zombie food' @@ -30,12 +26,12 @@ }.must_change('Category.count', +1) must_respond_with :redirect - must_redirect_to categories_path(Category.last) + must_redirect_to categories_path(Category.last.id) end it "should be responded with a bad request for a non-unique category name" do + login(one) data = {category: {name: 'toy'}} - category = Category.new(data[:category]) expect { post categories_path, params: data @@ -46,7 +42,6 @@ end describe "guest users" do - it "should not be able to access new category page" do get new_category_path must_respond_with :redirect @@ -54,14 +49,16 @@ end it "should not be able to create a new category" do - data = {category: {name: 'toy'}} + data = {category: {name: 'bad category'}} category = Category.new(data[:category]) + expect { post categories_path, params: data }.wont_change('Category.count') - must_respond_with :bad_request + must_respond_with :redirect + must_redirect_to root_path end end end From ef4a29f4072c23cd9931c9029fd58e95d35cd7f3 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 19 Oct 2018 20:11:31 -0700 Subject: [PATCH 101/347] spacing in category controllers test --- test/controllers/categories_controller_test.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 5199a68f60..c0cbf275e8 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,10 +1,10 @@ require "test_helper" -require 'pry' describe CategoriesController do let(:one) { merchants(:one) } - describe "logged in users" do + + describe "logged in users" do it "should be able to access new category page" do login(one) get new_category_path @@ -41,6 +41,7 @@ end end + describe "guest users" do it "should not be able to access new category page" do get new_category_path From 743075615d71ce0b5dc0931b9898c8dd5832ee77 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Fri, 19 Oct 2018 23:21:30 -0700 Subject: [PATCH 102/347] passed new and create tests for order_item controller tests --- app/controllers/order_items_controller.rb | 12 +- .../order_items_controller_test.rb | 144 +++++++++--------- 2 files changed, 87 insertions(+), 69 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 5f878734cd..9378c7328e 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -6,6 +6,16 @@ def new end def create + @order_item = OrderItem.new(order_item_params) + @order_item.save + + if @order_item.save + flash[:status] = :success + flash[:result_text] = "Successfully created" + redirect_to order_path(@order_item.order.id) + else + render :new, status: :bad_request + end end def edit @@ -20,6 +30,6 @@ def destroy private def order_item_params - params.require(:order_item).permit(:quantity, :status, :order_id, :product_id) + params.require(:order_item).permit(:quantity, :status, :product_id, :order_id) end end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 9943ef5858..710c7cffd9 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -12,85 +12,93 @@ end describe "create" do - order = Order.first - product = Product.first - order_item_data = { - order_item1: { - quantity: 5, - status: 'pending', - order_id: order.id, - product_id: product.id + before do + @product = Product.first + @order = Order.first + @orderitem_data = { + order_item: { + quantity: 5, + status: 'pending', + product_id: @product.id, + order_id: @order.id + } } - } - - it "creates an new order item" do - order_item_count = OrderItem.count - - expect { - post new_order_order_item_path, params: order_item_data - }.must_change('OrderItem.count', +1) - - #Assert - must_redirect_to cart_path(OrderItem.last) end - it "renders 404 not_found for a bogus order_item data" do + it "will create a new order item with valid data" do + new_order_item = OrderItem.new(@orderitem_data[:order_item]) + new_order_item.must_be :valid?, "Order item data was invalid. Please come fix this test" - end - end - describe "edit" do - order_item = OrderItem.first - id = order_item.id - it "succeeds for an existing order_item ID" do + expect{ post order_order_items_path(@order.id), params: @orderitem_data }.must_change('OrderItem.count', +1) + must_respond_with :redirect + must_redirect_to order_path(@order.id) end - it "renders 404 not_found for a bogus order_item ID" do + it "does not create a new order item if data is invalid" do + @orderitem_data[:order_item][:product_id] = 1 - end - end + OrderItem.new(@orderitem_data[:order_item]).wont_be :valid?, "Order item data wasn't invalid. Please come fix this test" - describe "update" do - order_item = OrderItem.first - id = OrderItem.first.order_id - - it "succeeds for valid data and an existing order_item ID" do - patch order_order_item_path(order_item.id, id) - - must_respond_with :success - must_redirect_to order_path(id) - end - - it "renders bad_request and does not update the DB for bogus data" do - - end - - - it "renders bad_request for bogus data" do - - end - - it "renders 404 not_found for a bogus order_item ID" do - - end - - end - - describe "delete" do - order_item = OrderItem.first - id = OrderItem.first.id - - it "succeeds for an existing order_item ID" do - delete order_order_item_path(order_item.id, id) - - must_respond_with :success - must_redirect_to order_path(id) - end - - it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do + # Act + expect{ post order_order_items_path(@order.id), params: @orderitem_data }.wont_change('OrderItem.count') + # Assert + must_respond_with :bad_request end end - end +# describe "edit" do +# order_item = OrderItem.first +# id = order_item.id +# +# it "succeeds for an existing order_item ID" do +# end +# +# it "renders 404 not_found for a bogus order_item ID" do +# +# end +# end +# +# describe "update" do +# order_item = OrderItem.first +# id = OrderItem.first.order_id +# +# it "succeeds for valid data and an existing order_item ID" do +# patch order_order_item_path(order_item.id, id) +# +# must_respond_with :success +# must_redirect_to order_path(id) +# end +# +# it "renders bad_request and does not update the DB for bogus data" do +# +# end +# +# +# it "renders bad_request for bogus data" do +# +# end +# +# it "renders 404 not_found for a bogus order_item ID" do +# +# end +# +# end +# +# describe "delete" do +# order_item = OrderItem.first +# id = OrderItem.first.id +# +# it "succeeds for an existing order_item ID" do +# delete order_order_item_path(order_item.id, id) +# +# must_respond_with :success +# must_redirect_to order_path(id) +# end +# +# it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do +# +# end +# end From a71e49c3b302f9feca141ea0bdf1a3fe9ba6de98 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 08:32:05 -0700 Subject: [PATCH 103/347] Add active status to products and status to orders --- db/migrate/20181020152805_add_active_status_to_products.rb | 5 +++++ db/migrate/20181020153054_add__status_to_orders.rb | 5 +++++ db/schema.rb | 4 +++- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20181020152805_add_active_status_to_products.rb create mode 100644 db/migrate/20181020153054_add__status_to_orders.rb diff --git a/db/migrate/20181020152805_add_active_status_to_products.rb b/db/migrate/20181020152805_add_active_status_to_products.rb new file mode 100644 index 0000000000..268720166b --- /dev/null +++ b/db/migrate/20181020152805_add_active_status_to_products.rb @@ -0,0 +1,5 @@ +class AddActiveStatusToProducts < ActiveRecord::Migration[5.2] + def change + add_column :products, :is_active, :boolean, default: true + end +end diff --git a/db/migrate/20181020153054_add__status_to_orders.rb b/db/migrate/20181020153054_add__status_to_orders.rb new file mode 100644 index 0000000000..1f61361081 --- /dev/null +++ b/db/migrate/20181020153054_add__status_to_orders.rb @@ -0,0 +1,5 @@ +class AddStatusToOrders < ActiveRecord::Migration[5.2] + def change + add_column :orders, :status, :string, default: 'pending' + end +end diff --git a/db/schema.rb b/db/schema.rb index fe7dbb0801..e566b80b20 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: 2018_10_19_023824) do +ActiveRecord::Schema.define(version: 2018_10_20_153054) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -57,6 +57,7 @@ t.string "zip" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "status", default: "pending" end create_table "products", force: :cascade do |t| @@ -67,6 +68,7 @@ t.integer "inventory" t.text "description" t.bigint "merchant_id" + t.boolean "is_active", default: true t.index ["merchant_id"], name: "index_products_on_merchant_id" end From c0df7d43f5e6acdeeb527faaae5616ceee3ebd5f Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 08:43:13 -0700 Subject: [PATCH 104/347] Add default status to order items - pending --- .../20181020154111_add_default_status_to_order_item.rb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 db/migrate/20181020154111_add_default_status_to_order_item.rb diff --git a/db/migrate/20181020154111_add_default_status_to_order_item.rb b/db/migrate/20181020154111_add_default_status_to_order_item.rb new file mode 100644 index 0000000000..4064352183 --- /dev/null +++ b/db/migrate/20181020154111_add_default_status_to_order_item.rb @@ -0,0 +1,5 @@ +class AddDefaultStatusToOrderItem < ActiveRecord::Migration[5.2] + def change + change_column :order_items, :status, :string, default: 'pending' + end +end From d53c4b7925365ad402d141fe88cf48b1990a33c5 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sat, 20 Oct 2018 08:58:49 -0700 Subject: [PATCH 105/347] Some more tests for product controller --- app/controllers/products_controller.rb | 16 ++++--- app/models/product.rb | 4 +- test/controllers/products_controller_test.rb | 50 +++++++++++++++----- test/fixtures/products.yml | 2 +- 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d536570609..c30d87a4c4 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -42,12 +42,12 @@ def update end end - def destroy - @product = Product.find_by(id: params[:id]) - @product.destroy - - redirect_to merchant_products_path - end + # def destroy + # @product = Product.find_by(id: params[:id]) + # @product.destroy + # + # redirect_to merchant_products_path + # end private def product_params @@ -55,7 +55,9 @@ def product_params :name, :price, :inventory, - :description + :merchant_id, + :description, + :category_ids, ) end end diff --git a/app/models/product.rb b/app/models/product.rb index 9d7da76296..d810ac6bd1 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,7 +4,9 @@ class Product < ApplicationRecord has_many :order_items, dependent: :destroy has_many :reviews, dependent: :destroy - validates :name, presence: true, uniqueness: true + validates :name, presence: true, uniqueness: { + scope: :merchant + } validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 736ffa4f6d..c05aec7861 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -3,6 +3,7 @@ describe ProductsController do let(:one) {merchants(:one)} + let(:bad_product_id) {Product.first.destroy.id} it "should get index" do get products_path @@ -29,7 +30,6 @@ it 'should get a new form to add products' do login(one) - # merchant = merchants(:one) get new_merchant_product_path(one.id) @@ -38,27 +38,57 @@ it 'it can create a product with valid data' do login(one) + + product_info = { - mazze: { + product: { name: "some toy", price: 25, description: "An integlligent brain plushie", inventory: 10, - category_ids: [Category.first.id], - merchant: merchants(:one) + merchant: merchants(:one), + category_ids: [categories(:toy).id] } } - test_product = Product.new(product_info[:mazze]) + test_product = Product.new(product_info[:product]) + # test_product.must_be :valid?, "Product data was invalid. fix this test" +# binding.pry valid = test_product.valid? valid.must_equal true, "Product data was invalid: #{test_product.errors.messages}, please come fix this test" - expect{ - post merchant_products_path(one.id), params: product_info + post(merchant_products_path(one.id), params: product_info) }.must_change('Product.count', +1) - must_redirect_to product_path(Product.last.id) + must_redirect_to product_path(Product.last) + end + + it 'does not create a new product with invalid data' do + login(one) + + product_data = { + product: { + merchant: merchants(:one), + category_ids: [categories(:toy).id] + } + } + + Product.new(product_data[:product]).wont_be :valid? + + expect { + post(merchant_products_path(one.id), params: product_data) + }.wont_change('Product.count') + + must_respond_with :bad_request + end + + it 'responds with success for an existing product' do + login(one) + + get edit_merchant_product_path(Product.first) + + must_respond_with :success end end @@ -78,9 +108,5 @@ # value(response).must_be :success? # end # -# it "should get destroy" do -# get products_destroy_url -# value(response).must_be :success? -# end # # end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index c30a671e29..6c629e5a36 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -31,4 +31,4 @@ yoga: description: puddy for ur brain! inventory: 100 merchant: three - categories: toy + categories: meditation, apparel From 39597294bf51f9cc1ccbb6cd5c37a55731c907d0 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sat, 20 Oct 2018 09:00:33 -0700 Subject: [PATCH 106/347] run db:migrate to add the columnsfor status --- db/schema.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index e566b80b20..df5a5ac1bc 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: 2018_10_20_153054) do +ActiveRecord::Schema.define(version: 2018_10_20_154111) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -38,7 +38,7 @@ create_table "order_items", force: :cascade do |t| t.integer "quantity" - t.string "status" + t.string "status", default: "pending" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "product_id" From 8e40ea46345f94a32e49fc80f9e26db144d2a280 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sat, 20 Oct 2018 09:18:03 -0700 Subject: [PATCH 107/347] removed the binding.pry from category model --- test/models/category_test.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 61db0cb9ed..5e9af8da53 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -9,7 +9,6 @@ it 'is valid when name is present and unique' do result = @category.valid? -binding.pry expect( result ).must_equal true end From 48caf8b389cc072446ba9ab7a1e596e97eb1993e Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 09:18:49 -0700 Subject: [PATCH 108/347] Modify schema and remove binding.pry --- db/schema.rb | 4 ++-- test/models/category_test.rb | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index e566b80b20..df5a5ac1bc 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: 2018_10_20_153054) do +ActiveRecord::Schema.define(version: 2018_10_20_154111) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -38,7 +38,7 @@ create_table "order_items", force: :cascade do |t| t.integer "quantity" - t.string "status" + t.string "status", default: "pending" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "product_id" diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 61db0cb9ed..5e9af8da53 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -9,7 +9,6 @@ it 'is valid when name is present and unique' do result = @category.valid? -binding.pry expect( result ).must_equal true end From 7fd2ed2854ed7abf3d6aff472abd653a5580bcec Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 11:20:52 -0700 Subject: [PATCH 109/347] Edit routes for updating product --- config/routes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 9c0883de22..bd2d23593b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,7 +11,7 @@ end get '/cart', to: 'orders#index', as: 'cart' - resources :products, except: [:new, :create, :edit, :destroy] do + resources :products, except: [:new, :create, :edit, :update, :destroy] do resources :reviews, only: [:index, :new, :create] end @@ -20,7 +20,7 @@ end resources :merchants, except: [:index] do - resources :products, only: [:new, :create, :edit] + resources :products, only: [:new, :create, :edit, :update] end resources :sessions, only: [:new, :create] From ce93cac53f9ee0ccb1b8671b2f7ff5aeb3009cae Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 11:21:19 -0700 Subject: [PATCH 110/347] Add helper method to render 404 --- app/controllers/application_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 62780d5690..b3dbe5f290 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -24,4 +24,8 @@ def current_cart session[:order_id] = @shopping_cart.id end end + + def render_404 + render file: "/public/404.html", status: 404 + end end From 584f6357b67f2b6897c1c54f4105955e97d9f17f Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 11:22:15 -0700 Subject: [PATCH 111/347] Edit methods as needed based on tests --- app/controllers/products_controller.rb | 40 ++++++++++++-------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index c30d87a4c4..309f78243b 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,55 +1,53 @@ class ProductsController < ApplicationController skip_before_action :require_login, only: [:index, :show] - before_action :require_login, only: [:new, :create] - - def index @products = Product.all end def show @product = Product.find_by(id: params[:id]) - if @product.nil? - head :not_found - end + render_404 if @product.nil? end def new - - @product = Product.new + merchant = Merchant.find_by(id: params[:merchant_id]) + @product = merchant.products.new end def create - @product = Product.new(product_params()) - if @product.save + filtered_product_params = product_params() + @product = Product.new(filtered_product_params) + + is_successful_save = @product.save + + if is_successful_save + flash[:success] = "Successfully created new product with title \"#{@product.name}\"" redirect_to product_path(@product.id) else + flash.now[:error] = "Invalid product data" render :new, status: :bad_request end end def edit @product = Product.find_by(id: params[:id]) - + render_404 if @product.nil? end def update @product = Product.find_by(id: params[:id]) - if @product.update(product_params) - redirect_to merchant_product_path(@product.id) + flash[:success] = "Successfully updated product \"#{@product.name}\"" + redirect_to product_path(@product.id) + else + flash.now[:error] = "Invalid product data" + render(:edit, status: :bad_request) end end - # def destroy - # @product = Product.find_by(id: params[:id]) - # @product.destroy - # - # redirect_to merchant_products_path - # end - private + def product_params return params.require(:product).permit( :name, @@ -57,7 +55,7 @@ def product_params :inventory, :merchant_id, :description, - :category_ids, + category_ids: [], ) end end From 2ec9c62c0db4178035de39ecde7820c909660fb6 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 11:22:44 -0700 Subject: [PATCH 112/347] Write tests to take into account guest and logged in user which pass --- test/controllers/products_controller_test.rb | 202 +++++++++++-------- 1 file changed, 123 insertions(+), 79 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index c05aec7861..4fc66dbdff 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,112 +1,156 @@ require "test_helper" -require 'pry' describe ProductsController do let(:one) {merchants(:one)} let(:bad_product_id) {Product.first.destroy.id} - it "should get index" do - get products_path - - must_respond_with :success + describe 'index' do + it "should get index for a guest" do + get products_path + must_respond_with :success + end + + it "should get index for a logged-in user" do + login(one) + get products_path + must_respond_with :success + end end - it "should get show" do - id = products(:puzzle) - - get product_path(id) - - must_respond_with :success + describe 'show' do + it "should get show for a guest" do + id = products(:puzzle) + get product_path(id) + must_respond_with :success + end + + it "should get show for a logged-in user" do + login(one) + id = products(:puzzle) + get product_path(id) + must_respond_with :success + end + + it "should respond with not found for showing a non-existing product for a guest" do + get product_path(bad_product_id) + must_respond_with :not_found + end + + it "should respond with not found for showing a non-existing product for a logged-in user" do + login(one) + get product_path(bad_product_id) + must_respond_with :not_found + end end - it "should respond with not found for showing a non-existing product" do - id = products(:puzzle) - id.destroy - - get product_path(id) - - must_respond_with :not_found + describe 'new' do + it 'should get a new form to add products' do + login(one) + get new_merchant_product_path(one.id) + must_respond_with :success + end end - it 'should get a new form to add products' do - login(one) + describe 'create' do + it 'it can create a product with valid data' do + login(one) + product_data = { + product: { + name: "some toy", + price: 25, + inventory: 10, + merchant_id: one.id, + description: "An integlligent brain plushie", + category_ids: [categories(:toy).id] + } + } - get new_merchant_product_path(one.id) + test_product = Product.new(product_data[:product]) + valid = test_product.valid? + valid.must_equal true, "Product data was invalid: #{test_product.errors.messages}, please come fix this test" - must_respond_with :success - end + expect{ + post merchant_products_path(one.id), params: product_data + }.must_change('Product.count', +1) - it 'it can create a product with valid data' do - login(one) + must_redirect_to product_path(Product.last) + end + it 'does not create a new product with invalid data' do + login(one) - product_info = { - product: { - name: "some toy", - price: 25, - description: "An integlligent brain plushie", - inventory: 10, - merchant: merchants(:one), - category_ids: [categories(:toy).id] + product_data = { + product: { + merchant: merchants(:one), + category_ids: [categories(:toy).id] + } } - } - test_product = Product.new(product_info[:product]) - # test_product.must_be :valid?, "Product data was invalid. fix this test" -# binding.pry - valid = test_product.valid? - valid.must_equal true, "Product data was invalid: #{test_product.errors.messages}, please come fix this test" + Product.new(product_data[:product]).wont_be :valid? - expect{ - post(merchant_products_path(one.id), params: product_info) - }.must_change('Product.count', +1) + expect { + post(merchant_products_path(one.id), params: product_data) + }.wont_change('Product.count') - must_redirect_to product_path(Product.last) + must_respond_with :bad_request + end end - it 'does not create a new product with invalid data' do - login(one) + describe "edit" do + it "responds with success for an existing book" do + login(one) + product = Product.first + get edit_merchant_product_path(one.id, product.id) + must_respond_with :success + end + + it "responds with not_found for a book that D.N.E." do + login(one) + get edit_merchant_product_path(one.id, bad_product_id) + must_respond_with :not_found + end + end + + describe 'update' do + it "updates with valid data with a logged-in user" do + login(one) - product_data = { - product: { - merchant: merchants(:one), - category_ids: [categories(:toy).id] + existing_product = products(:puddy) + + put merchant_product_path(one.id, existing_product.id), params: { + product: { + name: "Brain Puddy UPDATED", + price: 14, + description: "Updated Description!", + inventory: 100 + } } - } - Product.new(product_data[:product]).wont_be :valid? + updated_product = Product.find_by(id: existing_product.id) - expect { - post(merchant_products_path(one.id), params: product_data) - }.wont_change('Product.count') + updated_product.name.must_equal "Brain Puddy UPDATED" + must_respond_with :redirect + must_redirect_to product_path(updated_product.id) + end - must_respond_with :bad_request - end + it "fails for bogus data and aproduct with a logged-in user" do + login(one) - it 'responds with success for an existing product' do - login(one) + existing_product = products(:puddy) - get edit_merchant_product_path(Product.first) + put merchant_product_path(one.id, existing_product.id), params: { + product: { + name: "", + price: 14, + description: "Updated Description!", + inventory: 100 + } + } + + unchanged_product = Product.find_by(id: existing_product.id) - must_respond_with :success + unchanged_product.name.must_equal "Brain Puddy" + must_respond_with :bad_request + end end end - -# -# it "should get create" do -# get products_create_url -# value(response).must_be :success? -# end -# -# it "should get edit" do -# get products_edit_url -# value(response).must_be :success? -# end -# -# it "should get update" do -# get products_update_url -# value(response).must_be :success? -# end -# -# -# end From 96e6e6ed8c0071b982e6c57c2572b5c82569ebb8 Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 11:23:35 -0700 Subject: [PATCH 113/347] Chance validations --- app/models/product.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index d810ac6bd1..c4e6e6442a 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,9 +4,7 @@ class Product < ApplicationRecord has_many :order_items, dependent: :destroy has_many :reviews, dependent: :destroy - validates :name, presence: true, uniqueness: { - scope: :merchant - } + validates :name, presence: true, uniqueness: true validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 From be98c49e8d9e940a721d00b42fce1abc7c9332bc Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 11:44:29 -0700 Subject: [PATCH 114/347] Add coverage directory to .gitignore file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b2f0befc52..25a897ceb3 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ * Ignore .env file /.env >>>>>>> master +coverage From 0481ab39dcc87bf6471ecf63a6c320792c6c87e3 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 11:47:24 -0700 Subject: [PATCH 115/347] scrapped old test --- .../order_items_controller_test.rb | 49 +++++++------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 710c7cffd9..cfaf8900bd 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -12,48 +12,38 @@ end describe "create" do - before do - @product = Product.first - @order = Order.first - @orderitem_data = { - order_item: { - quantity: 5, - status: 'pending', - product_id: @product.id, - order_id: @order.id - } - } - end - - it "will create a new order item with valid data" do - new_order_item = OrderItem.new(@orderitem_data[:order_item]) - new_order_item.must_be :valid?, "Order item data was invalid. Please come fix this test" - + @order = Order.first + @product = Product.first + @order_item = OrderItem.new(quantity: 5, status: 'pending', order_id: @order.id, product_id: @product.id) + it "succeeds for an existing order_item ID" do + order_item_count = OrderItem.count - expect{ post order_order_items_path(@order.id), params: @orderitem_data }.must_change('OrderItem.count', +1) - must_respond_with :redirect - must_redirect_to order_path(@order.id) + post order_order_items_path(@order.id) + expect( order_item_count ).must_equal order_item_count + 1 + must_respond_with :success end - it "does not create a new order item if data is invalid" do - @orderitem_data[:order_item][:product_id] = 1 - - OrderItem.new(@orderitem_data[:order_item]).wont_be :valid?, "Order item data wasn't invalid. Please come fix this test" + it "renders 404 not_found for a bogus order_item data" do + @order.id = 12 + order_item_count = OrderItem.count - # Act - expect{ post order_order_items_path(@order.id), params: @orderitem_data }.wont_change('OrderItem.count') + post order_order_items_path(@order.id) + expect( order_item_count ).must_equal order_item_count + 1 + must_respond_with :not_found - # Assert - must_respond_with :bad_request end end end # describe "edit" do # order_item = OrderItem.first -# id = order_item.id +# id = OrderItem.first.order_id # # it "succeeds for an existing order_item ID" do +# get edit_order_order_item_path(order_item.id, id) +# +# must_respond_with :success +# must_redirect_to order_order_item_path(order_item.id, id) # end # # it "renders 404 not_found for a bogus order_item ID" do @@ -101,4 +91,3 @@ # it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do # # end -# end From 855c315cdbb409cbb549b4eedb998d2d220a017e Mon Sep 17 00:00:00 2001 From: Madaleine Shields Date: Sat, 20 Oct 2018 11:50:10 -0700 Subject: [PATCH 116/347] set up simple cov --- Gemfile | 1 + Gemfile.lock | 8 ++++++++ test/test_helper.rb | 3 +++ 3 files changed, 12 insertions(+) diff --git a/Gemfile b/Gemfile index 0b4ea22cac..d0cdad1ea8 100644 --- a/Gemfile +++ b/Gemfile @@ -86,4 +86,5 @@ end group :test do gem 'minitest-rails' gem 'minitest-reporters' + gem 'simplecov', require: false end diff --git a/Gemfile.lock b/Gemfile.lock index 9329e248c0..288f1b8e52 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,6 +81,7 @@ GEM concurrent-ruby (1.0.5) crass (1.0.4) debug_inspector (0.0.3) + docile (1.3.1) dotenv (2.5.0) dotenv-rails (2.5.0) dotenv (= 2.5.0) @@ -120,6 +121,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + json (2.1.0) jwt (2.1.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) @@ -230,6 +232,11 @@ GEM childprocess (~> 0.5) rubyzip (~> 1.2, >= 1.2.2) shellany (0.0.1) + 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) @@ -292,6 +299,7 @@ DEPENDENCIES rails (~> 5.2.1) sass-rails (~> 5.0) selenium-webdriver + simplecov spring spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) diff --git a/test/test_helper.rb b/test/test_helper.rb index 42d79e2e88..3d6879c238 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,6 @@ +require 'simplecov' +SimpleCov.start 'rails' + ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" From fb5f58c6d94a36c60554cb0a79dd44fd79e22e68 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 13:19:52 -0700 Subject: [PATCH 117/347] debugging order_item and review controller tests --- .../order_items_controller_test.rb | 16 +++-- test/controllers/reviews_controller_test.rb | 59 +++---------------- 2 files changed, 21 insertions(+), 54 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index cfaf8900bd..df157ee58b 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -12,16 +12,24 @@ end describe "create" do - @order = Order.first - @product = Product.first - @order_item = OrderItem.new(quantity: 5, status: 'pending', order_id: @order.id, product_id: @product.id) + before do + @order = Order.first + @product = Product.first + end + it "can existing order_item ID" do + order_item = OrderItem.new(quantity: 5, status: 'pending', order_id: @order.id, product_id: @product.id) + result = order_item.valid? + + binding.pry - it "succeeds for an existing order_item ID" do order_item_count = OrderItem.count post order_order_items_path(@order.id) + + expect( result ).must_equal true expect( order_item_count ).must_equal order_item_count + 1 must_respond_with :success + must_redirect_to cart_path end it "renders 404 not_found for a bogus order_item data" do diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 9786b4f314..df5d7c16df 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -3,84 +3,43 @@ describe ReviewsController do describe "new" do review = Review.first + product = Review.first.product_id it "should get new" do - get new_order_order_item_path(order_item.id) + get new_product_reviews_path(product.id) must_respond_with :success end end describe "create" do - order = Order.first product = Product.first - review = Review.new(quantity: 5, status: 'pending', order_id: order.id, product_id: product.id) + review = Review.new(rating: 3, description: "test-description", product_id: product.id) it "succeeds for an existing order_item ID" do review_count = Review.count - post order_order_items_path(order.id) - expect( order_item_count ).must_equal order_item_count + 1 + post product_reviews_path(product.id) + expect( review_count ).must_change('Review.count' +1) must_respond_with :success end it "renders 404 not_found for a bogus order_item data" do - + must_respond_with :failure end end - describe "edit" do - review = Review.first - id = Review.first.order_id - - it "succeeds for an existing order_item ID" do - get edit_order_order_item_path(order_item.id, id) - - must_respond_with :success - must_redirect_to order_order_item_path(order_item.id, id) - end - - it "renders 404 not_found for a bogus order_item ID" do - - end - end - - describe "update" do - review = Review.first - id = Review.first.order_id - - it "succeeds for valid data and an existing order_item ID" do - patch order_order_item_path(order_item.id, id) - - must_respond_with :success - must_redirect_to order_path(id) - end - - it "renders bad_request and does not update the DB for bogus data" do - - end - - - it "renders bad_request for bogus data" do - - end - - it "renders 404 not_found for a bogus order_item ID" do - - end - - end describe "delete" do before do review = Review.first - id = Review.first.order_id + id = Review.first.product_id end it "succeeds for an existing order_item ID" do - delete order_order_item_path(id) + delete product_review_path(id) must_respond_with :success - must_redirect_to order_path(id) + must_redirect_to reviews_path end it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do From 84a9535fc584b3a5fea2ce508dfe132827d63c0c Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 14:07:13 -0700 Subject: [PATCH 118/347] passed create order_item controller test --- app/controllers/order_items_controller.rb | 18 +++-- .../order_items_controller_test.rb | 67 +++++++++++++------ 2 files changed, 61 insertions(+), 24 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 9378c7328e..6988aaf993 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -11,17 +11,25 @@ def create if @order_item.save flash[:status] = :success - flash[:result_text] = "Successfully created" - redirect_to order_path(@order_item.order.id) + flash[:result_text] = "Successfully added to cart" + redirect_to cart_path else + flash[:status] = :failure + flash[:result_text] = "Could not add to cart" + flash[:messages] = @order_item.errors.messages render :new, status: :bad_request end end - def edit - end - def update + # if @order_item.update(order_item_params) + # flash[:status] = :success + # flash[:result_text] = "Successfully updated item" + # redirect_to cart_path + # else + # flash.now[:error] = "Invalid book data" + # # render(:edit, status: :bad_request) + # end end def destroy diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index df157ee58b..876f3d20ee 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -12,34 +12,63 @@ end describe "create" do - before do - @order = Order.first - @product = Product.first - end it "can existing order_item ID" do - order_item = OrderItem.new(quantity: 5, status: 'pending', order_id: @order.id, product_id: @product.id) - result = order_item.valid? - - binding.pry + order = Order.first + product = Product.first + order_item_data = { + order_item: { + quantity: 5, + status: 'pending', + order_id: order.id, + product_id: product.id + } + } - order_item_count = OrderItem.count + new_order_item = OrderItem.new(order_item_data[:order_item]) + expect { + post order_order_items_path(order.id), params: order_item_data + }.must_change('OrderItem.count', +1) - post order_order_items_path(@order.id) - - expect( result ).must_equal true - expect( order_item_count ).must_equal order_item_count + 1 - must_respond_with :success + must_respond_with :redirect must_redirect_to cart_path end it "renders 404 not_found for a bogus order_item data" do - @order.id = 12 - order_item_count = OrderItem.count + order = Order.first + product = Product.first + order_item_data = { + order_item: { + quantity: 0, + status: 'pending', + order_id: order.id, + product_id: product.id + } + } - post order_order_items_path(@order.id) - expect( order_item_count ).must_equal order_item_count + 1 - must_respond_with :not_found + OrderItem.new(order_item_data[:order_item]).wont_be :valid?, "Order data wasn't invalid. Please come fix this test" + # Act + expect { + post order_order_items_path(order.id), params: order_item_data + }.wont_change('OrderItem.count') + + # Assert + must_respond_with :bad_request + end + end + + describe "update" do + it "succeeds in updating existing order_item" do + order = Order.first + order_item = OrderItem.first + + + patch order_order_item_path(order.id, order_item.id), params: { + order_item: {quantity: 4} + } + + must_respond_with :success + must_redirect_to cart_path end end end From b35e4414bf8f6901d6e6306ffff52954fb58f54e Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 14:31:24 -0700 Subject: [PATCH 119/347] passed more order item controller tests - create update --- app/controllers/order_items_controller.rb | 31 +++++++++---- .../order_items_controller_test.rb | 45 ++++++++++++------- 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 6988aaf993..f92c86907b 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -22,17 +22,32 @@ def create end def update - # if @order_item.update(order_item_params) - # flash[:status] = :success - # flash[:result_text] = "Successfully updated item" - # redirect_to cart_path - # else - # flash.now[:error] = "Invalid book data" - # # render(:edit, status: :bad_request) - # end + @order_item = OrderItem.find_by(id: params[:id]) + + if @order_item.update(order_item_params) + # @order_item.save + flash[:status] = :success + flash[:result_text] = "Successfully updated item" + redirect_to cart_path + else + flash[:status] = :error + flash[:result_text] = "Invalid book data" + flash[:messages] = @order_item.errors.messages + render :new, status: :bad_request + end end def destroy + if @current_user.id == session[:user_id] + @work.destroy + + flash[:success] = "Successfully destroyed work \"#{@work.title}\"" + redirect_to works_path + else + flash[:error] = "You must be logged in as a work's user in order to delete it!" + + redirect_back(fallback_location: root_path) + end end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 876f3d20ee..c910a90006 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -58,7 +58,7 @@ end describe "update" do - it "succeeds in updating existing order_item" do + it "succeeds updates an existing order_item" do order = Order.first order_item = OrderItem.first @@ -67,9 +67,37 @@ order_item: {quantity: 4} } - must_respond_with :success must_redirect_to cart_path end + + it "renders a 404 not_found for bogus order item data" do + order = Order.first + order_item = OrderItem.first + + + patch order_order_item_path(order.id, order_item.id), params: { + order_item: {quantity: 'four'} + } + + must_respond_with :bad_request + end + + end + + describe "delete" do + # order_item = OrderItem.first + # id = OrderItem.first.id + # + # it "succeeds for an existing order_item ID" do + # delete order_order_item_path(order_item.id, id) + # + # must_respond_with :success + # must_redirect_to order_path(id) + # end + # + # it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do + # + # end end end # describe "edit" do @@ -114,17 +142,4 @@ # # end # -# describe "delete" do -# order_item = OrderItem.first -# id = OrderItem.first.id -# -# it "succeeds for an existing order_item ID" do -# delete order_order_item_path(order_item.id, id) # -# must_respond_with :success -# must_redirect_to order_path(id) -# end -# -# it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do -# -# end From c909a078bca5091c6dbc77a271cd1151aba45417 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 15:24:04 -0700 Subject: [PATCH 120/347] updated order items controller tests --- app/controllers/order_items_controller.rb | 12 ++++++++++++ test/controllers/order_items_controller_test.rb | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index f92c86907b..a0acf784fb 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -38,6 +38,7 @@ def update end def destroy +<<<<<<< Updated upstream if @current_user.id == session[:user_id] @work.destroy @@ -48,6 +49,17 @@ def destroy redirect_back(fallback_location: root_path) end +======= + @order_item = OrderItem.find_by(order_id: params[:id]) + if @order_item.status == 'pending' + @order_item.destroy + + flash[:status] = :success + flash[:result_text] = "Successfully deleted item from cart" + must_redirect_to cart_path + end + +>>>>>>> Stashed changes end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index c910a90006..bf74fed9be 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -81,7 +81,6 @@ must_respond_with :bad_request end - end describe "delete" do @@ -100,6 +99,7 @@ # end end end + # describe "edit" do # order_item = OrderItem.first # id = OrderItem.first.order_id From 634dc66931594c2cb8473f0adf3ff32fee16f767 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 20 Oct 2018 15:48:39 -0700 Subject: [PATCH 121/347] tests for new in reviews controller pass --- app/controllers/reviews_controller.rb | 15 ++++++ test/controllers/reviews_controller_test.rb | 52 ++++++++------------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 102b3bb888..2127902fd6 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,7 +1,22 @@ class ReviewsController < ApplicationController + skip_before_action :require_login + def new + product = Product.find_by(id: params[:product_id]) + if product + @review = product.reviews.new + else + render_404 + end + end def create end + + private + + def review_params + params.require(:review).permit(:rating, :product_id, :description) + end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index df5d7c16df..3fd982faaf 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,50 +1,38 @@ require "test_helper" describe ReviewsController do - describe "new" do - review = Review.first - product = Review.first.product_id + let(:one) { merchants(:one)} + let(:plushie) { products(:plushie) } - it "should get new" do - get new_product_reviews_path(product.id) + describe "new" do + it "logged in users can get to a new review page" do + login(one) + get new_product_review_path(plushie.id) must_respond_with :success end - end - - describe "create" do - product = Product.first - review = Review.new(rating: 3, description: "test-description", product_id: product.id) - it "succeeds for an existing order_item ID" do - review_count = Review.count + it "logged in users can't get to a new review page for non-existent product" do + login(one) + plushie.destroy + get new_product_review_path(plushie.id) + must_respond_with :not_found + end - post product_reviews_path(product.id) - expect( review_count ).must_change('Review.count' +1) + it "guest users can get to a new review page" do + get new_product_review_path(plushie.id) must_respond_with :success end - it "renders 404 not_found for a bogus order_item data" do - must_respond_with :failure + it "guest users can't get to a new review page for non-existent product" do + plushie.destroy + get new_product_review_path(plushie.id) + must_respond_with :not_found end end + describe "create" do - describe "delete" do - before do - review = Review.first - id = Review.first.product_id - end - - it "succeeds for an existing order_item ID" do - delete product_review_path(id) - - must_respond_with :success - must_redirect_to reviews_path - end - - it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do - - end end + end From 536c56280f7e61977605ae82e533ea2f71f6210d Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 16:08:06 -0700 Subject: [PATCH 122/347] passing all test in order_item controller --- app/controllers/order_items_controller.rb | 21 ++--- .../order_items_controller_test.rb | 86 ++++++------------- 2 files changed, 31 insertions(+), 76 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index a0acf784fb..e118ed7aa2 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -38,28 +38,19 @@ def update end def destroy -<<<<<<< Updated upstream - if @current_user.id == session[:user_id] - @work.destroy - - flash[:success] = "Successfully destroyed work \"#{@work.title}\"" - redirect_to works_path - else - flash[:error] = "You must be logged in as a work's user in order to delete it!" + @order_item = OrderItem.find_by(id: params[:id]) - redirect_back(fallback_location: root_path) - end -======= - @order_item = OrderItem.find_by(order_id: params[:id]) if @order_item.status == 'pending' @order_item.destroy flash[:status] = :success flash[:result_text] = "Successfully deleted item from cart" - must_redirect_to cart_path + redirect_to cart_path + else + flash[:status] = :failure + flash[:result_text] = "Could not delete item from cart due to status being \'#{@order_item.status}\'" + render :new, status: :bad_request end - ->>>>>>> Stashed changes end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index bf74fed9be..cb16c988cf 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -47,7 +47,6 @@ OrderItem.new(order_item_data[:order_item]).wont_be :valid?, "Order data wasn't invalid. Please come fix this test" - # Act expect { post order_order_items_path(order.id), params: order_item_data }.wont_change('OrderItem.count') @@ -74,72 +73,37 @@ order = Order.first order_item = OrderItem.first - patch order_order_item_path(order.id, order_item.id), params: { order_item: {quantity: 'four'} } - must_respond_with :bad_request end end describe "delete" do - # order_item = OrderItem.first - # id = OrderItem.first.id - # - # it "succeeds for an existing order_item ID" do - # delete order_order_item_path(order_item.id, id) - # - # must_respond_with :success - # must_redirect_to order_path(id) - # end - # - # it "renders 404 not_found and does not delete the DB for a bogus order_item ID" do - # - # end + it "deletes an order item when status is pending" do + order_item = OrderItem.find_by(status: "pending") + order = order_item.order + + expect{ + delete order_order_item_path(order.id, order_item.id) + }.must_change('order.order_items.count', -1) + + must_respond_with :redirect + must_redirect_to cart_path + end + + it "does not delete order item if status not pending" do + order_item = OrderItem.first + order = order_item.order + + order_item.status = "shipped" + + expect { + delete order_order_item_path(order.id, order_item.id)}.wont_change('order.order_items.count') + + must_respond_with :bad_request + end + end + end -end - -# describe "edit" do -# order_item = OrderItem.first -# id = OrderItem.first.order_id -# -# it "succeeds for an existing order_item ID" do -# get edit_order_order_item_path(order_item.id, id) -# -# must_respond_with :success -# must_redirect_to order_order_item_path(order_item.id, id) -# end -# -# it "renders 404 not_found for a bogus order_item ID" do -# -# end -# end -# -# describe "update" do -# order_item = OrderItem.first -# id = OrderItem.first.order_id -# -# it "succeeds for valid data and an existing order_item ID" do -# patch order_order_item_path(order_item.id, id) -# -# must_respond_with :success -# must_redirect_to order_path(id) -# end -# -# it "renders bad_request and does not update the DB for bogus data" do -# -# end -# -# -# it "renders bad_request for bogus data" do -# -# end -# -# it "renders 404 not_found for a bogus order_item ID" do -# -# end -# -# end -# -# From eb7dbf269ecd13e0d71965a9a942ad5fe6e3630b Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 20 Oct 2018 16:08:17 -0700 Subject: [PATCH 123/347] take out index for reviews --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index bd2d23593b..027a377745 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,7 +12,7 @@ get '/cart', to: 'orders#index', as: 'cart' resources :products, except: [:new, :create, :edit, :update, :destroy] do - resources :reviews, only: [:index, :new, :create] + resources :reviews, only: [:new, :create] end resources :categories, except: [:destroy] do From d82bf763502437315acc1f339138323d680022b5 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 16:25:29 -0700 Subject: [PATCH 124/347] completeed order_item tests --- test/controllers/order_items_controller_test.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index cb16c988cf..a638625169 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -100,10 +100,11 @@ order_item.status = "shipped" expect { - delete order_order_item_path(order.id, order_item.id)}.wont_change('order.order_items.count') + delete order_order_item_path(order.id, order_item.id) + }.wont_change('order.order_items.count') - must_respond_with :bad_request - end + must_respond_with :bad_request end - end + +end From cb8d9786fca883c146c9b507d75af32fe89c6ccb Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 20 Oct 2018 16:38:26 -0700 Subject: [PATCH 125/347] add nominal and general reject tests to create in review controller --- app/controllers/reviews_controller.rb | 17 +++- test/controllers/reviews_controller_test.rb | 95 ++++++++++++++++----- 2 files changed, 91 insertions(+), 21 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 2127902fd6..c6cb03f480 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -6,12 +6,25 @@ def new if product @review = product.reviews.new else - render_404 + render_404 end - end def create + product = Product.find_by(id: params[:product_id]) + @review = product.reviews.new(review_params) + + if @review.save + flash[:status] = :success + flash[:result_text] = "Successfully submitted review for: #{product.name}" + redirect_to products_path(product) + else + flash[:status] = :failure + flash[:result_text] = "Could not submit review for: #{product.name}" + flash[:messages] = @review.errors.messages + render :new, status: :bad_request + end + end private diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 3fd982faaf..1f54405042 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -5,34 +5,91 @@ let(:plushie) { products(:plushie) } describe "new" do - it "logged in users can get to a new review page" do - login(one) - get new_product_review_path(plushie.id) - must_respond_with :success - end + describe "logged in users" do + it "get to a new review page" do + login(one) + get new_product_review_path(plushie.id) + must_respond_with :success + end - it "logged in users can't get to a new review page for non-existent product" do - login(one) - plushie.destroy - get new_product_review_path(plushie.id) - must_respond_with :not_found + it "can't get to a new review page for non-existent product" do + login(one) + plushie.destroy + get new_product_review_path(plushie.id) + must_respond_with :not_found + end end - it "guest users can get to a new review page" do - get new_product_review_path(plushie.id) - must_respond_with :success - end + describe "guest users" do + it "can get to a new review page" do + get new_product_review_path(plushie.id) + must_respond_with :success + end - it "guest users can't get to a new review page for non-existent product" do - plushie.destroy - get new_product_review_path(plushie.id) - must_respond_with :not_found + it "can't get to a new review page for non-existent product" do + plushie.destroy + get new_product_review_path(plushie.id) + must_respond_with :not_found + end end + end describe "create" do + let (:good_data) { {review: {rating: 5, product: plushie, description: 'luv it!!'} } } + let (:bad_data) { {review: {rating: -5, product: plushie, description: 'hate it!! :( '} } } + let (:bad_data2) { {review: {rating: 1, product: plushie, description: ''} } } - end + describe "logged in users" do + it "can submit review" do + login(one) + expect{ + post product_reviews_path(plushie.id), params: good_data + }.must_change('Review.count', +1) + must_redirect_to products_path(plushie.id) + end + + it "can't submit review with invalid rating" do + login(one) + expect{ + post product_reviews_path(plushie.id), params: bad_data + }.wont_change('Review.count') + must_respond_with :bad_request + end + + it "can't submit review with invalid description" do + login(one) + expect{ + post product_reviews_path(plushie.id), params: bad_data2 + }.wont_change('Review.count') + must_respond_with :bad_request + end + end + describe "guest users" do + it "guest users can submit review" do + expect{ + post product_reviews_path(plushie.id), params: good_data + }.must_change('Review.count', +1) + + must_redirect_to products_path(plushie.id) + end + + it "can't submit review with invalid rating" do + expect{ + post product_reviews_path(plushie.id), params: bad_data + }.wont_change('Review.count') + must_respond_with :bad_request + end + + it "can't submit review with invalid description" do + expect{ + post product_reviews_path(plushie.id), params: bad_data2 + }.wont_change('Review.count') + must_respond_with :bad_request + end + end + + end end From 6d5ee54a9068080d16fe99690fcfb5bf9d78ea4f Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 20 Oct 2018 17:31:51 -0700 Subject: [PATCH 126/347] review controller doesn't allow merchant to review their own product, test green --- app/controllers/reviews_controller.rb | 25 ++++++++++++--------- test/controllers/reviews_controller_test.rb | 20 +++++++++++++---- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index c6cb03f480..766d4a347d 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -12,19 +12,24 @@ def new def create product = Product.find_by(id: params[:product_id]) - @review = product.reviews.new(review_params) - - if @review.save - flash[:status] = :success - flash[:result_text] = "Successfully submitted review for: #{product.name}" - redirect_to products_path(product) - else + + if @current_merchant == product.merchant flash[:status] = :failure - flash[:result_text] = "Could not submit review for: #{product.name}" - flash[:messages] = @review.errors.messages + flash[:result_text] = "You cannot submit a review for your own product: #{product.name}" render :new, status: :bad_request + else + @review = product.reviews.new(review_params) + if @review.save + flash[:status] = :success + flash[:result_text] = "Successfully submitted review for: #{product.name}" + redirect_to products_path(product) + else + flash[:status] = :failure + flash[:result_text] = "Could not submit review for: #{product.name}" + flash[:messages] = @review.errors.messages + render :new, status: :bad_request + end end - end private diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 1f54405042..4924960618 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -2,6 +2,7 @@ describe ReviewsController do let(:one) { merchants(:one)} + let (:two) {merchants(:two)} let(:plushie) { products(:plushie) } describe "new" do @@ -41,8 +42,8 @@ let (:bad_data2) { {review: {rating: 1, product: plushie, description: ''} } } describe "logged in users" do - it "can submit review" do - login(one) + it "can submit review for products they don't sell" do + login(two) expect{ post product_reviews_path(plushie.id), params: good_data }.must_change('Review.count', +1) @@ -51,7 +52,7 @@ end it "can't submit review with invalid rating" do - login(one) + login(two) expect{ post product_reviews_path(plushie.id), params: bad_data }.wont_change('Review.count') @@ -59,12 +60,23 @@ end it "can't submit review with invalid description" do - login(one) + login(two) expect{ post product_reviews_path(plushie.id), params: bad_data2 }.wont_change('Review.count') must_respond_with :bad_request end + + it "can't submit a review for products they sell" do + login(one) + + expect{ + post product_reviews_path(plushie.id), params: good_data + }.wont_change('Review.count') + + must_respond_with :bad_request + + end end describe "guest users" do From 24ac36cf9273a36fe309ea41e5f7b1c56680ad82 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sat, 20 Oct 2018 23:04:15 -0700 Subject: [PATCH 127/347] wrote controller tests for merchant. since session plays heavily on creating and destroying a session, those were left to session controller and a custom method for merchants to access their custom dashboard what created --- test/controllers/merchants_controller_test.rb | 79 +++++++++++++------ 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index ce4b465d1f..e7f0df35af 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,34 +1,69 @@ require "test_helper" +require 'pry' describe MerchantsController do - it "should get show" do - get merchants_show_url - value(response).must_be :success? - end + describe "dashboard" do + it "goes to dashboard view" do + merchant_one = merchants(:one) + post dashboard_path(merchant_one.id) - it "should get new" do - get merchants_new_url - value(response).must_be :success? - end + #if merchant is signed it...how does test know that? + #if merchant is signed in, does it go to the dashboard page? + #if merchant is signed in, does it respond with success? + must_respond_with :success + end - it "should get create" do - get merchants_create_url - value(response).must_be :success? - end + it "does not render dashboard if merchant is not valid" do + @merchant = Merchant.first + @merchant.id = 0 + #if the merchant is not a real merchant, does it return bad_request? + #if merchant is not a real merchant, does it redirect to root? + #if the merchant is not a real merchant, does it display errors(the whys?)? + result = @merchant.valid? + expect( result ).wont_equal true - it "should get edit" do - get merchants_edit_url - value(response).must_be :success? - end + expect{ + post merchants_path(id: params[:id] ) + }.must_respond_with :bad_request + # expect( @merchant.errors.messages ).must_include :id + end - it "should get update" do - get merchants_update_url - value(response).must_be :success? + it "does not render dashboard if merchant is not signed in" do + @merchant = Merchant.first + # what happens when merchant isn't signed-in; inside a session? + # if session[:user_id] != @merchant.id + expect{ + post merchants_path(id: params[:id] ) + }.must_respond_to :bad_request + # expect( @merchant.errors.messages ).must_include 'not logged in' + # end + #if the merchant is not signed in, does it redirect to sign-in? + #if the merchant is not signed in, does it display errors(the whys?)? + end end - it "should get destroy" do - get merchants_destroy_url - value(response).must_be :success? + describe "create" do + it "succeeds when all data entered is valid" do + skip + #when all data in form is correct does it give a -succeed? + #when it succeeds, where does the data go? + #when it succeeds, where does the page go? + end + + it "increases the total number of merchants by 1 if data is valid" do + skip + #when merchant is created, does merchant save? + #when merchant is created, does Merchant.count increase by 1? + #when merchant is created, does new form redirect to new merchant's dashboard? + end + + it "does not succeed when any data entered is invalid" do + skip + #when any data in form is incorrect does it give bad_request? + #when it does not succeed, where does the page go? + #when merchant is created, does Merchant.count increase by 1? + #when merchant is created, does new form redirect to new merchant's dashboard? + end end end From 179c81e7423465482a58cb9dc9d945dcb712cda9 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sun, 21 Oct 2018 01:30:49 -0700 Subject: [PATCH 128/347] made changes to merchant show and merchant controller / controller tests --- app/controllers/merchants_controller.rb | 3 +- app/views/merchants/show.html.erb | 53 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 3749823a62..da846c6063 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,6 +1,7 @@ class MerchantsController < ApplicationController - def index + def dashboard + end def show diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index cbb0f02bfe..dcd0abd431 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,2 +1,55 @@

Merchants#show

Find me in app/views/merchants/show.html.erb

+ +
+
+ +

Merchant Summary: <%= @merchant.username %>

+

Joined site on: <%= @merchant.created_at.strftime("%B %d, %Y") %>

+
+ + +
+ +
+ + +

Merchant <%= @merchant.username %>'s Dashboard

+ + + + + + + + <% @merchant.orders.each do |order| %> + <% i = 0 %> + <%= i += 1 %> + + + + + + <% end %> + +
Order #sGenerated Order RevenueCreated on:Order Status
<%= order.email %><%= order.id %><%= order.created_at.strftime("%B %d, %Y") %><%= order.status %>
+
+ + + From 0fd776ccdc6ecec4544e943547b2c5a91e996688 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sun, 21 Oct 2018 09:12:09 -0700 Subject: [PATCH 129/347] started on merchant views and working through merchant controller tests --- app/assets/images/sherlock-game.jpg | Bin 0 -> 43709 bytes app/controllers/merchants_controller.rb | 31 ++++++++++++++++++++++-- app/views/products/index.html.erb | 18 ++++++++++++++ app/views/products/show.html.erb | 21 ++++++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/sherlock-game.jpg diff --git a/app/assets/images/sherlock-game.jpg b/app/assets/images/sherlock-game.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97b9150b376f3cf041f9912d16e9c2e3262b16dc GIT binary patch literal 43709 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 Zu?u!oTM%v-fpcx*QC0UH%n6+*|Jgf{bi@Dv literal 0 HcmV?d00001 diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index da846c6063..f7de3e52a9 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,12 +1,39 @@ class MerchantsController < ApplicationController def dashboard - + @merchant = Merchant.find_by(id: session[:id] ) + end + + if @merchant.id == session[:id] || session[:id] != nil + flash[:status] = :success + flash[:result_text] = "Successfully made it to the dashboard" + else + flash[:status] = :failure + flash[:result_text] = "Could not pull up your dashboard" + flash[:messages] = @merchant.errors.messages + redirect_to root_path + else end def show + @merchant = Merchant.find_by(id: params[:id] ) + if @merchant == nil + flash[:status] = :failure + flash[:result_text] = "Merchant could not be found" + flash[:messages] = @merchant.errors.messages + redirect_to root_path + else + @products = @merchants.products + end end - def order + def order_summary + @merchant = Merchant.find_by(id: params[:id] ) + # if @merchant == nil + # flash[:status] = :failure + # flash[:result_text] = "Merchant could not be found" + # flash[:messages] = @merchant.errors.messages + # redirect_to root_path + # else end end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index f8eeb82674..6e9023f1e6 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,2 +1,20 @@

Products#index

Find me in app/views/products/index.html.erb

+ +
+ +

List of All Products

+ + <% @products.each do |product| %> +
+
+ <%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %> +
+ <% end %> +

+ from: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %> +

+
+ <% end %> + +
diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 5f44ec44d2..671af7480b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,2 +1,23 @@

Products#show

Find me in app/views/products/show.html.erb

+ +
+ +

List of All Products

+ +
    + <% @products.each do |product| %> +
  • +
    + <%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %> + <% end %> +
    + <% end %> +

    + from: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %> +

    +
  • + <% end %> +
+ +
From 3aeab2138c19b4186395d53056e45442521c2350 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sun, 21 Oct 2018 09:13:38 -0700 Subject: [PATCH 130/347] Wrote session controller tests --- app/controllers/sessions_controller.rb | 2 +- test/controllers/sessions_controller_test.rb | 63 ++++++++++++++++---- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 8fa80db18c..7b86b8bbe3 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -25,7 +25,7 @@ def create # way we've configured GitHub. Our strategy will # be to display error messages to make future # debugging easier. - flash[:error] = "Could not create new user account: #{@merchant.errors.messages}" + flash[:error] = "Could not create new account: #{@merchant.errors.messages}" redirect_to root_path return end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 5f3c1f7b8d..7696a7cb07 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,22 +1,61 @@ require "test_helper" describe SessionsController do - it " redirects to home page and displays a successful flash message when logging in Github is successful" do + describe "loggin" do + it "can successfully log in with githun as an exisiting user and redirects to root path" do - #Arrange - # Make sure that for some existing user, everything is configured + #Arrange + # Make sure that for some existing user, everything is configured - merchant_one = merchants(:one) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new( mock_auth_hash( merchant_one ) ) + merchant_one = merchants(:one) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new( mock_auth_hash( merchant_one ) ) - #Act - # Simulating logging in with github being successful (given the OmniAUth hash above) - get auth_callback_path(:github) + #Act + # Simulating logging in with github being successful (given the OmniAUth hash above) + get auth_callback_path(:github) - # Assert - #Check that it redirects - must_redirect_to root_path - expect(session[:merchant_id]).must_equal merchant_one.id + # Assert + #Check that it redirects + must_redirect_to root_path + expect(session[:merchant_id]).must_equal merchant_one.id + expect(flash[:success]).must_equal "Logged in as returning user #{merchant_one.username}" + end + + it 'creates a new user successfully when logging in with a new valid merchant' do + + start_merch_count = Merchant.count + + new_merchant = Merchant.new(username: "nicodimos", uid: 56, provider: :github, email: "nico@zzz.com") + + expect(new_merchant.valid?).must_equal true + + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new( mock_auth_hash( new_merchant) ) + + get auth_callback_path(:github) + + must_redirect_to root_path + expect( Merchant.count ).must_equal start_merch_count + 1 + expect( session[:merchant_id] ).must_equal Merchant.last.id + expect( flash[:success] ).must_equal "Logged in Successfully. Welcome #{new_merchant.username}" + end + + it 'does not create a new merchant when logging in with a new invalid merchant' do + + start_merch_count = Merchant.count + + invalid_new_merchant = Merchant.new(username: nil, uid: nil, provider: :github, email: "nico@zzz.com") + + expect(invalid_new_merchant.valid?).must_equal false + + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new( mock_auth_hash( invalid_new_merchant ) ) + + get auth_callback_path(:github) + + must_redirect_to root_path + expect( Merchant.count ).must_equal start_merch_count + expect( session[:merchant_id] ).must_equal nil + expect( flash[:error] ).must_equal "Could not create new account: #{invalid_new_merchant.errors.messages}" + end end end From b476aaf221277be0ea419de5133938d2e4b71c49 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sun, 21 Oct 2018 09:50:26 -0700 Subject: [PATCH 131/347] started a stub for testing loggin out from a session --- test/controllers/sessions_controller_test.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 7696a7cb07..71328f2713 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,7 +1,9 @@ require "test_helper" describe SessionsController do - describe "loggin" do + let(:one) { merchants(:one)} + + describe "login" do it "can successfully log in with githun as an exisiting user and redirects to root path" do #Arrange @@ -58,4 +60,15 @@ expect( flash[:error] ).must_equal "Could not create new account: #{invalid_new_merchant.errors.messages}" end end + describe 'logout' do + login(one) + + it 'can successfully logout by clearing the session' do + # session[:merchant_id] + # delete :logout + # session[:merchant_id].must_equal nil + end + it 'should redirect to the root page' do + end + end end From 2666809e82db4ff89f5317f8609e097f7dbcea9a Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sun, 21 Oct 2018 09:54:04 -0700 Subject: [PATCH 132/347] cleaning up the session controller --- test/controllers/sessions_controller_test.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 71328f2713..2e47ede8a0 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,7 +1,6 @@ require "test_helper" describe SessionsController do - let(:one) { merchants(:one)} describe "login" do it "can successfully log in with githun as an exisiting user and redirects to root path" do @@ -61,14 +60,13 @@ end end describe 'logout' do - login(one) it 'can successfully logout by clearing the session' do - # session[:merchant_id] - # delete :logout - # session[:merchant_id].must_equal nil + end + it 'should redirect to the root page' do + end end end From bc8267e5f2884223baefeeaaa86ec55a2ae784ba Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sun, 21 Oct 2018 10:02:26 -0700 Subject: [PATCH 133/347] added product details to product index --- app/controllers/merchants_controller.rb | 5 +---- app/views/products/index.html.erb | 6 ++---- config/routes.rb | 1 + 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index f7de3e52a9..1ffd865f0b 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -30,10 +30,7 @@ def show def order_summary @merchant = Merchant.find_by(id: params[:id] ) # if @merchant == nil - # flash[:status] = :failure - # flash[:result_text] = "Merchant could not be found" - # flash[:messages] = @merchant.errors.messages - # redirect_to root_path + # else end end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 6e9023f1e6..f31ca2c69e 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -10,11 +10,9 @@
<%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %>
+

from: <%= product.merchant.username %>

+
$<%= product.price.to_f %>
<% end %> -

- from: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %> -

- <% end %> diff --git a/config/routes.rb b/config/routes.rb index 027a377745..84f05063af 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,4 +25,5 @@ resources :sessions, only: [:new, :create] post '/sessions/logout', to: 'sessions#logout', as: 'logout' + post '/merchants/:id/dashboard', to: 'merchants#dashboard', as: 'dashboard' end From 8135020180a0f66f1ed17206d0aeeab92c879d21 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sun, 21 Oct 2018 10:16:29 -0700 Subject: [PATCH 134/347] wrote session logout test and passing --- test/controllers/sessions_controller_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 2e47ede8a0..4f74476f85 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -60,13 +60,25 @@ end end describe 'logout' do + before do + merchant_one = merchants(:one) + + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new( mock_auth_hash( merchant_one ) ) + get auth_callback_path(:github) + end it 'can successfully logout by clearing the session' do + post logout_path(session[:merchant_id]) + + expect( session[:merchant_id]).must_equal nil + expect( flash[:success] ).must_equal "Successfully logged out" end it 'should redirect to the root page' do + post logout_path(session[:merchant_id]) + must_redirect_to root_path end end end From f3601da0ac5f9a97654973e29fbd9da659a06913 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sun, 21 Oct 2018 13:42:06 -0700 Subject: [PATCH 135/347] added merchant and categorydata in csv for seeding and wrote sending data for merchant and category --- db/seed_data/categories.csv | 14 ++++++ db/seed_data/merchants.csv | 11 +++++ db/seed_data/order_items.csv | 11 +++++ db/seed_data/orders.csv | 0 db/seed_data/products.csv | 0 db/seed_data/reviews.csv | 0 db/seeds.rb | 86 +++++++++++++++++++++++++++++++++--- 7 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 db/seed_data/categories.csv create mode 100644 db/seed_data/merchants.csv create mode 100644 db/seed_data/order_items.csv create mode 100644 db/seed_data/orders.csv create mode 100644 db/seed_data/products.csv create mode 100644 db/seed_data/reviews.csv diff --git a/db/seed_data/categories.csv b/db/seed_data/categories.csv new file mode 100644 index 0000000000..55b1016980 --- /dev/null +++ b/db/seed_data/categories.csv @@ -0,0 +1,14 @@ +name +toy +book +meditation +apparel +puzzle +Family +Physical +Active +Creative +Dexterity +Party +Skilled +Strategic diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv new file mode 100644 index 0000000000..674cabd5ea --- /dev/null +++ b/db/seed_data/merchants.csv @@ -0,0 +1,11 @@ +id,username,email,uid,provider +1,Angela,angelab@someemail.com,12234,github +2,susan,susan@someemail.com,45678,github +3,lula,lulasam@someemail.com,56777,github +4,James,james@someemail.com,65933,github +5,Guest,guest_email@someemail.com +6,Samantha,samantha@someemail.com,45982,github +7,Guest3,guest3@someemail.com +8,Michael,m_james@someemail.com,98129,github +9,David,d_smith@someemail.com,87234,github +10,Guest2,guest2@someemail.com diff --git a/db/seed_data/order_items.csv b/db/seed_data/order_items.csv new file mode 100644 index 0000000000..270167a9b4 --- /dev/null +++ b/db/seed_data/order_items.csv @@ -0,0 +1,11 @@ +order_id,product_id,quantity,status +1,3,10,"paid" +1,8,5,"paid" +1,20,5,"shipped" +2,10,50,"pending" +2,11,15,"shipped" +3,20,7,"paid" +3,5,100,"paid" +4,12,1,"pending" +3,15,1,"paid" +5,15,6,"shipped" diff --git a/db/seed_data/orders.csv b/db/seed_data/orders.csv new file mode 100644 index 0000000000..e69de29bb2 diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv new file mode 100644 index 0000000000..e69de29bb2 diff --git a/db/seed_data/reviews.csv b/db/seed_data/reviews.csv new file mode 100644 index 0000000000..e69de29bb2 diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..d893a9b851 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,7 +1,79 @@ -# 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) +require 'csv' + +MERCHANT_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') +puts "Loading raw merchant data from #{MERCHANT_FILE}" + +merchant_failures = [] + +CSV.foreach(MERCHANT_FILE, :headers => true) do |row| + merchant = Merchant.new + merchant.id = row['id'] + merchant.username = row['username'] + merchant.email = row['email'] + merchant.uid = row['uid'] + merchant.provider = row['provider'] + + succesful = merchant.save + if !successful + merchant_failures << merchant + puts "Failed to save merchants: #{merchant.inspect}" + + else + puts "Created merchant: #{merchant.inspect}" + end +end + +puts "Added #{Merchant.count} merchant records" +puts "#{merchant_failures.length} merchants failed to save" + + + +CATEGORY_FILE = Rails.root.join('db', 'seed_data', 'categories.csv') +puts "Loading raw category data from #{CATEGORY_FILE}" + +category_failures = [] + +CSV.foreach(CATEGORY_FILE, :headers => true) do |row| + category = Category.new + category.name = row['name'] + + succesful = category.save + if !successful + category_failures << category + puts "Failed to save categories: #{category.inspect}" + + else + puts "Created category: #{category.inspect}" + end +end + +puts "Added #{Category.count} category records" +puts "#{category_failures.length} categories failed to save" + + + +ORDERITEMS_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') +puts "Loading raw merchant data from #{ORDERITEMS_FILE}" + +merchant_failures = [] + +CSV.foreach(ORDERITEMS_FILE, :headers => true) do |row| + merchant = Merchant.new + merchant.id = row['id'] + merchant.username = row['username'] + merchant.email = row['email'] + merchant.uid = row['uid'] + merchant.provider = row['provider'] + + succesful = merchant.save + if !successful + merchant_failures << merchant + puts "Failed to save merchants: #{merchant.inspect}" + + else + puts "Created merchant: #{merchant.inspect}" + end +end + +puts "Added #{Merchant.count} merchant records" +puts "#{merchant_failures.length} merchants failed to save" From 899b978098dbdd75d900eab8835f85351fe58c0f Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sun, 21 Oct 2018 13:47:28 -0700 Subject: [PATCH 136/347] added some order items seed data in csv and wrote code to seed order item data --- db/seeds.rb | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index d893a9b851..41b6a533da 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -52,28 +52,27 @@ -ORDERITEMS_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') -puts "Loading raw merchant data from #{ORDERITEMS_FILE}" +ORDERITEMS_FILE = Rails.root.join('db', 'seed_data', 'order_items.csv') +puts "Loading raw order item data from #{ORDERITEMS_FILE}" -merchant_failures = [] +order_items_failures = [] CSV.foreach(ORDERITEMS_FILE, :headers => true) do |row| - merchant = Merchant.new - merchant.id = row['id'] - merchant.username = row['username'] - merchant.email = row['email'] - merchant.uid = row['uid'] - merchant.provider = row['provider'] + order_item = OrderItem.new + order_item.order_id = row['order_id'] + order_item.product_id = row['product_id'] + order_item.quantity = row['quantity'] + order_item.status = row['status'] - succesful = merchant.save + succesful = order_item.save if !successful - merchant_failures << merchant - puts "Failed to save merchants: #{merchant.inspect}" + order_item_failures << order_item + puts "Failed to save order_items: #{order_item.inspect}" else - puts "Created merchant: #{merchant.inspect}" + puts "Created order_item: #{order_item.inspect}" end end -puts "Added #{Merchant.count} merchant records" -puts "#{merchant_failures.length} merchants failed to save" +puts "Added #{OrderItem.count} order_item records" +puts "#{order_item_failures.length} order_items failed to save" From ecb5055c8536a5763ae3f7839eb4aa5ad3cd53cc Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sun, 21 Oct 2018 13:54:37 -0700 Subject: [PATCH 137/347] added number_to_currency to html products.index --- app/controllers/merchants_controller.rb | 5 ++++- app/controllers/products_controller.rb | 2 ++ app/models/product.rb | 7 ++++++- app/views/products/index.html.erb | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 1ffd865f0b..f7de3e52a9 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -30,7 +30,10 @@ def show def order_summary @merchant = Merchant.find_by(id: params[:id] ) # if @merchant == nil - + # flash[:status] = :failure + # flash[:result_text] = "Merchant could not be found" + # flash[:messages] = @merchant.errors.messages + # redirect_to root_path # else end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 309f78243b..a9c6684924 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -3,6 +3,8 @@ class ProductsController < ApplicationController def index @products = Product.all + @product = @products.map do |product| + end end def show diff --git a/app/models/product.rb b/app/models/product.rb index c4e6e6442a..89312363ad 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,8 +4,13 @@ class Product < ApplicationRecord has_many :order_items, dependent: :destroy has_many :reviews, dependent: :destroy - validates :name, presence: true, uniqueness: true + validates :name, presence: true, uniqueness: true validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } validates_numericality_of :inventory, :only_integer => true, :greater_than_or_equal_to => 0 + + def self.currency(price) + price *= 0.01 + return number_to_currency(price) + end end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index f31ca2c69e..2bb8450d17 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -11,7 +11,7 @@ <%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %>

from: <%= product.merchant.username %>

-
$<%= product.price.to_f %>
+
<%= number_to_currency(product.price) %>
<% end %> From cd7b1c69d5724d0e52dd5596e1df213de2a32f6c Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Sun, 21 Oct 2018 14:50:05 -0700 Subject: [PATCH 138/347] added an index to review view, added add_to_cart button on product show page (functionality TBA) --- app/helpers/products_helper.rb | 4 ++ app/views/merchants/dashboard.html.erb | 52 +++++++++++++++++++ app/views/merchants/show.html.erb | 70 +++++++------------------- app/views/products/index.html.erb | 2 +- app/views/products/show.html.erb | 35 ++++++------- app/views/reviews/index.html.erb | 1 + config/routes.rb | 2 +- 7 files changed, 94 insertions(+), 72 deletions(-) create mode 100644 app/views/merchants/dashboard.html.erb create mode 100644 app/views/reviews/index.html.erb diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb index ab5c42b325..c5bb1cb3be 100644 --- a/app/helpers/products_helper.rb +++ b/app/helpers/products_helper.rb @@ -1,2 +1,6 @@ module ProductsHelper + + def print_price(price) + number_to_currency price + end end diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb new file mode 100644 index 0000000000..b41381382b --- /dev/null +++ b/app/views/merchants/dashboard.html.erb @@ -0,0 +1,52 @@ +
+
+ +

Merchant Summary: <%= @merchant.username %>

+

Joined site on: <%= @merchant.created_at.strftime("%B %d, %Y") %>

+
+ + +
+ +
+ + +

Merchant <%= @merchant.username %>'s Dashboard

+ + + + + + + + <% @merchant.orders.each do |order| %> + <% i = 0 %> + <%= i += 1 %> + + + + + + <% end %> + +
Order #sGenerated Order RevenueCreated on:Order Status
<%= order.email %><%= order.id %><%= order.created_at.strftime("%B %d, %Y") %><%= order.status %>
+
+ + + diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index dcd0abd431..c59eb329fa 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,55 +1,23 @@

Merchants#show

Find me in app/views/merchants/show.html.erb

-
-
- -

Merchant Summary: <%= @merchant.username %>

-

Joined site on: <%= @merchant.created_at.strftime("%B %d, %Y") %>

-
- - +

Merchant details

+ +<%= @merchant.name %> + +
+

Genres

+

+ Products: + <% @merchant.products.each do |product| %> +

    +
  • <%= product.name %>
  • +
  • <%= product.price %>
  • +
  • <%= product.inventory %>
  • + +
+

- -
- - -

Merchant <%= @merchant.username %>'s Dashboard

- - - - - - - - <% @merchant.orders.each do |order| %> - <% i = 0 %> - <%= i += 1 %> - - - - - - <% end %> - -
Order #sGenerated Order RevenueCreated on:Order Status
<%= order.email %><%= order.id %><%= order.created_at.strftime("%B %d, %Y") %><%= order.status %>
-
- - - diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 2bb8450d17..8522d96c95 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -10,7 +10,7 @@
<%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %>
-

from: <%= product.merchant.username %>

+

from: <%= link_to product.merchant.username, merchant_path(product.merchant_id)%>

<%= number_to_currency(product.price) %>
<% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 671af7480b..ff927f06c9 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,23 +1,20 @@ -

Products#show

-

Find me in app/views/products/show.html.erb

+<%= image_tag "sherlock-game.jpg", alt: "sherlock game", class: "sherlock-cover-image" %> -
+

+ <%= @product.name %> +

+

<%= @product.description %>

-

List of All Products

- -
    - <% @products.each do |product| %> -
  • -
    - <%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %> - <% end %> -
    - <% end %> -

    - from: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %> -

    -
  • - <% end %> -
+

+ Price + <%= number_to_currency(@product.price) %> +

+
+
+

<%= link_to "Add to Cart", new_merchant_product_path(@product.merchant_id) %>

+
+ + +<%= link_to "Go Back to All Products", root_path, class: "homepage" %> diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb new file mode 100644 index 0000000000..d845d3c2e4 --- /dev/null +++ b/app/views/reviews/index.html.erb @@ -0,0 +1 @@ +

Individual Product's Review Page

diff --git a/config/routes.rb b/config/routes.rb index 84f05063af..cea7dbee02 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,7 +12,7 @@ get '/cart', to: 'orders#index', as: 'cart' resources :products, except: [:new, :create, :edit, :update, :destroy] do - resources :reviews, only: [:new, :create] + resources :reviews, only: [:new, :create, :index] end resources :categories, except: [:destroy] do From d9fae5f8f05680a77fa2f7a74ecf9bc4607b960b Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Sun, 21 Oct 2018 15:18:05 -0700 Subject: [PATCH 139/347] added review seed data in csv and wrote code to seed data in db for reviews --- db/seed_data/merchants.csv | 22 +++++++++++----------- db/seed_data/reviews.csv | 12 ++++++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 674cabd5ea..7051273ebf 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,11 +1,11 @@ -id,username,email,uid,provider -1,Angela,angelab@someemail.com,12234,github -2,susan,susan@someemail.com,45678,github -3,lula,lulasam@someemail.com,56777,github -4,James,james@someemail.com,65933,github -5,Guest,guest_email@someemail.com -6,Samantha,samantha@someemail.com,45982,github -7,Guest3,guest3@someemail.com -8,Michael,m_james@someemail.com,98129,github -9,David,d_smith@someemail.com,87234,github -10,Guest2,guest2@someemail.com +username,email,uid,provider +Angela,angelab@someemail.com,12234,github +susan,susan@someemail.com,45678,github +lula,lulasam@someemail.com,56777,github +James,james@someemail.com,65933,github +Guest,guest_email@someemail.com +Samantha,samantha@someemail.com,45982,github +Sally,sally3@someemail.com,65389,github +Michael,m_james@someemail.com,98129,github +David,d_smith@someemail.com,87234,github +Guest2,guest2@someemail.com diff --git a/db/seed_data/reviews.csv b/db/seed_data/reviews.csv index e69de29bb2..785e20a594 100644 --- a/db/seed_data/reviews.csv +++ b/db/seed_data/reviews.csv @@ -0,0 +1,12 @@ +rating,product_id,description +2,3,"this game wasn't as challenging as I hoped for." +5,5,"I love this game. We played it as children with my siblings and it was so much fun." +3,10,"It was okay. I was hoping my kids would be into it but they don't enjoy it as much." +1,14,"It broke the minute I took it out of the packaging. Its made with cheap material.",14 +5,23,"Loads of fun" +1,45,"not challenging enough" +1,6, +4,5, +4,8, +1,90,"too expensive and not boring" +4,56,"love it" From 07a2e58950fa0bcd54577c10190e01238c038d70 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Mon, 22 Oct 2018 06:57:44 -0700 Subject: [PATCH 140/347] add simplecov --- .gitignore | 1 + test/test_helper.rb | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index b2f0befc52..e813fc2705 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ /.bundle # Ignore all logfiles and tempfiles. +coverage /log/* /tmp/* !/log/.keep diff --git a/test/test_helper.rb b/test/test_helper.rb index 42d79e2e88..41717726f8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,7 @@ +require 'simplecov' +SimpleCov.start + + ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" From a918f8c250f01472c3334d439550bb4661c420d0 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Mon, 22 Oct 2018 07:08:28 -0700 Subject: [PATCH 141/347] redo simplecov setup --- Gemfile | 1 + Gemfile.lock | 8 ++++++++ test/test_helper.rb | 7 +++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 0b4ea22cac..2959579458 100644 --- a/Gemfile +++ b/Gemfile @@ -84,6 +84,7 @@ group :development do end group :test do + gem 'simplecov', require: false gem 'minitest-rails' gem 'minitest-reporters' end diff --git a/Gemfile.lock b/Gemfile.lock index 9329e248c0..288f1b8e52 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,6 +81,7 @@ GEM concurrent-ruby (1.0.5) crass (1.0.4) debug_inspector (0.0.3) + docile (1.3.1) dotenv (2.5.0) dotenv-rails (2.5.0) dotenv (= 2.5.0) @@ -120,6 +121,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + json (2.1.0) jwt (2.1.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) @@ -230,6 +232,11 @@ GEM childprocess (~> 0.5) rubyzip (~> 1.2, >= 1.2.2) shellany (0.0.1) + 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) @@ -292,6 +299,7 @@ DEPENDENCIES rails (~> 5.2.1) sass-rails (~> 5.0) selenium-webdriver + simplecov spring spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) diff --git a/test/test_helper.rb b/test/test_helper.rb index 41717726f8..f2842b62bc 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,6 +1,9 @@ require 'simplecov' -SimpleCov.start - +SimpleCov.start 'rails' do + add_filter '/bin/' + add_filter '/db/' + add_filter '/test/' +end ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) From 66b2fc1392291eb7cb8af07a215f24c1a529c2f7 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Mon, 22 Oct 2018 09:22:47 -0700 Subject: [PATCH 142/347] changes to routes and updates to merchant and product controller --- app/controllers/merchants_controller.rb | 43 ++++++++++------------- app/controllers/order_items_controller.rb | 12 ++++++- app/controllers/orders_controller.rb | 4 +++ app/controllers/products_controller.rb | 2 -- app/views/orders/index.html.erb | 0 app/views/products/show.html.erb | 2 +- config/routes.rb | 2 +- 7 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 app/views/orders/index.html.erb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index f7de3e52a9..6039d73943 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,10 +1,6 @@ class MerchantsController < ApplicationController def dashboard - @merchant = Merchant.find_by(id: session[:id] ) - end - - if @merchant.id == session[:id] || session[:id] != nil flash[:status] = :success flash[:result_text] = "Successfully made it to the dashboard" else @@ -12,28 +8,27 @@ def dashboard flash[:result_text] = "Could not pull up your dashboard" flash[:messages] = @merchant.errors.messages redirect_to root_path - else end +end - def show - @merchant = Merchant.find_by(id: params[:id] ) - if @merchant == nil - flash[:status] = :failure - flash[:result_text] = "Merchant could not be found" - flash[:messages] = @merchant.errors.messages - redirect_to root_path - else - @products = @merchants.products - end +def show + @merchant = Merchant.find_by(id: params[:id] ) + if @merchant == nil + flash[:status] = :failure + flash[:result_text] = "Merchant could not be found" + flash[:messages] = @merchant.errors.messages + redirect_to root_path + else + @products = @merchants.products end +end - def order_summary - @merchant = Merchant.find_by(id: params[:id] ) - # if @merchant == nil - # flash[:status] = :failure - # flash[:result_text] = "Merchant could not be found" - # flash[:messages] = @merchant.errors.messages - # redirect_to root_path - # else - end +def order_summary + @merchant = Merchant.find_by(id: params[:id] ) + # if @merchant == nil + # flash[:status] = :failure + # flash[:result_text] = "Merchant could not be found" + # flash[:messages] = @merchant.errors.messages + # redirect_to root_path + # else end diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index e118ed7aa2..8c5b6c1b1a 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,12 +1,14 @@ class OrderItemsController < ApplicationController skip_before_action :require_login + before_action :load_order, only: [:create] + def new @order_items = OrderItem.new end def create - @order_item = OrderItem.new(order_item_params) + @order_item = OrderItem.new(product_id: params[:product_id]) @order_item.save if @order_item.save @@ -58,4 +60,12 @@ def destroy def order_item_params params.require(:order_item).permit(:quantity, :status, :product_id, :order_id) end + + def load_order + @order = Order.find(session[:order_id]) + if @order + @order = Order.create(status: "unsubmitted") + session[:order_id] = @order.id + end + end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index b8e0acd9b7..336af53e9f 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,4 +1,8 @@ class OrdersController < ApplicationController + + def index + end + def show end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a9c6684924..309f78243b 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -3,8 +3,6 @@ class ProductsController < ApplicationController def index @products = Product.all - @product = @products.map do |product| - end end def show diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index ff927f06c9..90056139ae 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -12,7 +12,7 @@
-

<%= link_to "Add to Cart", new_merchant_product_path(@product.merchant_id) %>

+

<%= button_to "Add to Cart", cart_path %>

diff --git a/config/routes.rb b/config/routes.rb index cea7dbee02..325e601bd8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,7 +6,7 @@ get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' - resources :orders, only: [:show, :create, :update, :destroy] do + resources :orders, only: [:index, :show, :create, :update, :destroy] do resources :order_items, except: [:index, :show, :edit] end get '/cart', to: 'orders#index', as: 'cart' From a26c18a02a6369c01efd6c487345ed8e45800c58 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Mon, 22 Oct 2018 09:31:36 -0700 Subject: [PATCH 143/347] some product info in csv. --- db/seed_data/products.csv | 5 +++++ db/seeds.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index e69de29bb2..c3b87e62b2 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -0,0 +1,5 @@ +name,price,inventory,description,merchant_id,image +"Tic Tac Toe",20,50,"Beloved childhood game making space in a 3x3 grid. Player wins when they succeeds in placing three of their marks in horizontal, vertical or diagonal row.",2 +"Otrio",50,20,"This is an excellent 2-4 player head strategy game that will fire everyones competitive side",3 +"Hasbro Monopoly Classic Game",15,50,"Buy, sell, dream and scheme your way to riches",2 +"Kanoodle - Brain Twisting Solitaire game",7,50,"Perfect for developing problem solving and strategic thinking skills.",3 diff --git a/db/seeds.rb b/db/seeds.rb index 41b6a533da..d0898d965f 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -76,3 +76,30 @@ puts "Added #{OrderItem.count} order_item records" puts "#{order_item_failures.length} order_items failed to save" + + + +REVIEWS_FILE = Rails.root.join('db', 'seed_data', 'reviews.csv') +puts "Loading raw review data from #{REVIEWS_FILE}" + +review_failures = [] + +CSV.foreach(REVIEWS_FILE, :headers => true) do |row| + review = Review.new + review.rating = row['rating'] + review.product_id = row['product_id'] + oreview.description = row['description'] + + + succesful = review.save + if !successful + review_failures << review + puts "Failed to save reviews: #{review.inspect}" + + else + puts "Created reviews: #{review.inspect}" + end +end + +puts "Added #{Review.count} review records" +puts "#{review_failures.length} reviews failed to save" From 2e223d486a091a2a930e032fe91f7f8d74209d94 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Mon, 22 Oct 2018 09:32:38 -0700 Subject: [PATCH 144/347] messing around --- app/controllers/merchants_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index f7de3e52a9..b44720287c 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -30,10 +30,10 @@ def show def order_summary @merchant = Merchant.find_by(id: params[:id] ) # if @merchant == nil - # flash[:status] = :failure - # flash[:result_text] = "Merchant could not be found" - # flash[:messages] = @merchant.errors.messages - # redirect_to root_path + # flash[:status] = :failure + # flash[:result_text] = "Merchant could not be found" + # flash[:messages] = @merchant.errors.messages + # redirect_to root_path # else end end From c21cdcb3a7d597671bb38969613cfc12646a9b0b Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Mon, 22 Oct 2018 09:50:28 -0700 Subject: [PATCH 145/347] there was a merge conflict in the ignore file that got resolved --- .gitignore | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index e813fc2705..67d188983b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,9 +29,6 @@ coverage # Ignore master key for decrypting credentials and more. /config/master.key -<<<<<<< HEAD -.env -======= + * Ignore .env file /.env ->>>>>>> master From 777b574043f86505899e90bb37a92df14cad53bf Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Mon, 22 Oct 2018 10:23:40 -0700 Subject: [PATCH 146/347] changes routes and added a show test for merchant controller --- app/controllers/merchants_controller.rb | 49 ++++---- app/views/merchants/show.html.erb | 25 +--- config/routes.rb | 3 +- test/controllers/merchants_controller_test.rb | 117 +++++++++--------- 4 files changed, 83 insertions(+), 111 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 6039d73943..e2c58cb777 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,34 +1,27 @@ class MerchantsController < ApplicationController - def dashboard - flash[:status] = :success - flash[:result_text] = "Successfully made it to the dashboard" - else - flash[:status] = :failure - flash[:result_text] = "Could not pull up your dashboard" - flash[:messages] = @merchant.errors.messages - redirect_to root_path - end -end + def show + @merchant = Merchant.find_by(id: params[:id] ) -def show - @merchant = Merchant.find_by(id: params[:id] ) - if @merchant == nil - flash[:status] = :failure - flash[:result_text] = "Merchant could not be found" - flash[:messages] = @merchant.errors.messages - redirect_to root_path - else - @products = @merchants.products + if @merchant.id != session[:merchant_id] + flash[:status] = :failure + flash[:result_text] = "You are not authorized to view this dashboard" + elsif @merchant == nil + flash[:status] = :failure + flash[:result_text] = "Merchant could not be found" + flash[:messages] = @merchant.errors.messages + redirect_to root_path + end + @products = @merchant.products end -end -def order_summary - @merchant = Merchant.find_by(id: params[:id] ) - # if @merchant == nil - # flash[:status] = :failure - # flash[:result_text] = "Merchant could not be found" - # flash[:messages] = @merchant.errors.messages - # redirect_to root_path - # else + def order_summary + @merchant = Merchant.find_by(id: params[:id] ) + # if @merchant == nil + # flash[:status] = :failure + # flash[:result_text] = "Merchant could not be found" + # flash[:messages] = @merchant.errors.messages + # redirect_to root_path + # else + end end diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index c59eb329fa..f173707ec4 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,23 +1,2 @@ -

Merchants#show

-

Find me in app/views/merchants/show.html.erb

- -

Merchant details

- -<%= @merchant.name %> - -
-

Genres

-

- Products: - <% @merchant.products.each do |product| %> -

    -
  • <%= product.name %>
  • -
  • <%= product.price %>
  • -
  • <%= product.inventory %>
  • - -
-

-
+

Merchant Dashboard

+

aka merchant show html

diff --git a/config/routes.rb b/config/routes.rb index 325e601bd8..8a4c32cd38 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,11 +19,10 @@ resources :products, only: [:index] end - resources :merchants, except: [:index] do + resources :merchants, only: [:show] do resources :products, only: [:new, :create, :edit, :update] end resources :sessions, only: [:new, :create] post '/sessions/logout', to: 'sessions#logout', as: 'logout' - post '/merchants/:id/dashboard', to: 'merchants#dashboard', as: 'dashboard' end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index e7f0df35af..de7a557e93 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,69 +1,70 @@ require "test_helper" -require 'pry' describe MerchantsController do - describe "dashboard" do - it "goes to dashboard view" do - merchant_one = merchants(:one) - post dashboard_path(merchant_one.id) + describe "show" do + let(:one) { merchants(:one) } + + it "goes to merchant's dashboard view when logged in" do + login(one) + + get merchant_path(one.id) #if merchant is signed it...how does test know that? #if merchant is signed in, does it go to the dashboard page? #if merchant is signed in, does it respond with success? must_respond_with :success end - - it "does not render dashboard if merchant is not valid" do - @merchant = Merchant.first - @merchant.id = 0 - #if the merchant is not a real merchant, does it return bad_request? - #if merchant is not a real merchant, does it redirect to root? - #if the merchant is not a real merchant, does it display errors(the whys?)? - result = @merchant.valid? - expect( result ).wont_equal true - - expect{ - post merchants_path(id: params[:id] ) - }.must_respond_with :bad_request - # expect( @merchant.errors.messages ).must_include :id - end - - it "does not render dashboard if merchant is not signed in" do - @merchant = Merchant.first - # what happens when merchant isn't signed-in; inside a session? - # if session[:user_id] != @merchant.id - expect{ - post merchants_path(id: params[:id] ) - }.must_respond_to :bad_request - # expect( @merchant.errors.messages ).must_include 'not logged in' - # end - #if the merchant is not signed in, does it redirect to sign-in? - #if the merchant is not signed in, does it display errors(the whys?)? - end end - - describe "create" do - it "succeeds when all data entered is valid" do - skip - #when all data in form is correct does it give a -succeed? - #when it succeeds, where does the data go? - #when it succeeds, where does the page go? - end - - it "increases the total number of merchants by 1 if data is valid" do - skip - #when merchant is created, does merchant save? - #when merchant is created, does Merchant.count increase by 1? - #when merchant is created, does new form redirect to new merchant's dashboard? - end - - it "does not succeed when any data entered is invalid" do - skip - #when any data in form is incorrect does it give bad_request? - #when it does not succeed, where does the page go? - #when merchant is created, does Merchant.count increase by 1? - #when merchant is created, does new form redirect to new merchant's dashboard? - end - end - end +# +# it "does not render dashboard if merchant is not valid" do +# @merchant = Merchant.first +# @merchant.id = 0 +# #if the merchant is not a real merchant, does it return bad_request? +# #if merchant is not a real merchant, does it redirect to root? +# #if the merchant is not a real merchant, does it display errors(the whys?)? +# result = @merchant.valid? +# expect( result ).wont_equal true +# +# expect{ +# post merchants_path(id: params[:id] ) +# }.must_respond_with :bad_request +# # expect( @merchant.errors.messages ).must_include :id +# end +# +# it "does not render dashboard if merchant is not signed in" do +# @merchant = Merchant.first +# # what happens when merchant isn't signed-in; inside a session? +# # if session[:user_id] != @merchant.id +# expect{ +# post merchants_path(id: params[:id] ) +# }.must_respond_to :bad_request +# # expect( @merchant.errors.messages ).must_include 'not logged in' +# # end +# #if the merchant is not signed in, does it redirect to sign-in? +# #if the merchant is not signed in, does it display errors(the whys?)? +# end +# end +# +# describe "create" do +# it "succeeds when all data entered is valid" do +# skip +# #when all data in form is correct does it give a -succeed? +# #when it succeeds, where does the data go? +# #when it succeeds, where does the page go? +# end +# +# it "increases the total number of merchants by 1 if data is valid" do +# skip +# #when merchant is created, does merchant save? +# #when merchant is created, does Merchant.count increase by 1? +# #when merchant is created, does new form redirect to new merchant's dashboard? +# end +# +# it "does not succeed when any data entered is invalid" do +# skip +# #when any data in form is incorrect does it give bad_request? +# #when it does not succeed, where does the page go? +# #when merchant is created, does Merchant.count increase by 1? +# #when merchant is created, does new form redirect to new merchant's dashboard? +# end From a76c9ed2f649d11e9be2a14c9ae37fa5e2cbfd72 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Mon, 22 Oct 2018 10:39:48 -0700 Subject: [PATCH 147/347] added more test to merchant show --- app/controllers/merchants_controller.rb | 1 + config/routes.rb | 2 +- test/controllers/merchants_controller_test.rb | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index e2c58cb777..8d5ae12303 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -6,6 +6,7 @@ def show if @merchant.id != session[:merchant_id] flash[:status] = :failure flash[:result_text] = "You are not authorized to view this dashboard" + redirect_to merchant_products_path(@merchant.id) elsif @merchant == nil flash[:status] = :failure flash[:result_text] = "Merchant could not be found" diff --git a/config/routes.rb b/config/routes.rb index 8a4c32cd38..bb3682ff72 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -20,7 +20,7 @@ end resources :merchants, only: [:show] do - resources :products, only: [:new, :create, :edit, :update] + resources :products, except: [:show, :destroy] end resources :sessions, only: [:new, :create] diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index de7a557e93..d2a379c0a9 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -3,6 +3,7 @@ describe MerchantsController do describe "show" do let(:one) { merchants(:one) } + let(:two) { merchants(:two) } it "goes to merchant's dashboard view when logged in" do login(one) @@ -14,6 +15,19 @@ #if merchant is signed in, does it respond with success? must_respond_with :success end + + it "redirects to homepage when not logged in" do + + end + + it "redirects when merchant tries to access other dashboards" do + login(two) + + get merchant_path(one.id) + + must_redirect_to merchant_products_path(one.id) + expect(flash[:result_text]).must_include "You are not authorized to view this dashboard" + end end end # From fed43a60f413086273463f89b1fdf60520b278db Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Mon, 22 Oct 2018 11:22:33 -0700 Subject: [PATCH 148/347] completed merchant show controller testing --- app/controllers/merchants_controller.rb | 4 ++++ test/controllers/merchants_controller_test.rb | 10 ++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 8d5ae12303..4c571492ae 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,4 +1,5 @@ class MerchantsController < ApplicationController + skip_before_action :require_login def show @merchant = Merchant.find_by(id: params[:id] ) @@ -13,9 +14,12 @@ def show flash[:messages] = @merchant.errors.messages redirect_to root_path end + @products = @merchant.products + flash[:status] = :success end + def order_summary @merchant = Merchant.find_by(id: params[:id] ) # if @merchant == nil diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index d2a379c0a9..7dda32458e 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -9,15 +9,13 @@ login(one) get merchant_path(one.id) - - #if merchant is signed it...how does test know that? - #if merchant is signed in, does it go to the dashboard page? - #if merchant is signed in, does it respond with success? must_respond_with :success end - it "redirects to homepage when not logged in" do - + it "redirects to merchant products when not logged in" do + get merchant_path(one.id) + must_redirect_to merchant_products_path(one.id) + expect(flash[:result_text]).must_include "You are not authorized to view this dashboard" end it "redirects when merchant tries to access other dashboards" do From 1d8cf5d035656b906990d4f0073439a74cf473f2 Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Mon, 22 Oct 2018 12:24:30 -0700 Subject: [PATCH 149/347] completed merchant testing --- app/controllers/merchants_controller.rb | 32 +++++++------------ test/controllers/merchants_controller_test.rb | 12 ++++++- test/fixtures/merchants.yml | 6 ++++ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 4c571492ae..a1b2d77349 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -4,29 +4,21 @@ class MerchantsController < ApplicationController def show @merchant = Merchant.find_by(id: params[:id] ) - if @merchant.id != session[:merchant_id] - flash[:status] = :failure - flash[:result_text] = "You are not authorized to view this dashboard" - redirect_to merchant_products_path(@merchant.id) - elsif @merchant == nil + if @merchant == nil flash[:status] = :failure flash[:result_text] = "Merchant could not be found" - flash[:messages] = @merchant.errors.messages redirect_to root_path + elsif @merchant.id != session[:merchant_id] + flash[:status] = :failure + flash[:result_text] = "You are not authorized to view this dashboard" + redirect_to merchant_products_path(@merchant.id) + else + @products = @merchant.products + @order_items = [] + @products.each do |product| + @order_items << OrderItem.find_by(product_id: product.id ) + flash[:status] = :success + end end - - @products = @merchant.products - flash[:status] = :success - end - - - def order_summary - @merchant = Merchant.find_by(id: params[:id] ) - # if @merchant == nil - # flash[:status] = :failure - # flash[:result_text] = "Merchant could not be found" - # flash[:messages] = @merchant.errors.messages - # redirect_to root_path - # else end end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 7dda32458e..c65736c1d0 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -7,7 +7,6 @@ it "goes to merchant's dashboard view when logged in" do login(one) - get merchant_path(one.id) must_respond_with :success end @@ -26,6 +25,17 @@ must_redirect_to merchant_products_path(one.id) expect(flash[:result_text]).must_include "You are not authorized to view this dashboard" end + + it "redirects when merchant does not exit" do + deadmerch = merchants(:four) + deadmerch.destroy + + get merchant_path(deadmerch) + must_respond_with :redirect + expect(flash[:result_text]).must_include "Merchant could not be found" + must_redirect_to root_path + + end end end # diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index e7ec7a2a8f..2cb3fe49a1 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -17,3 +17,9 @@ three: email: maddiemaxwell@yahoo.com uid: 23456789 provider: github + +four: + username: boing + email: boing@yahoo.com + uid: 23456732 + provider: github From 3abb55312045b3fb8addf21779bfc655b495486f Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Mon, 22 Oct 2018 12:26:42 -0700 Subject: [PATCH 150/347] more products seeds data --- .DS_Store | Bin 0 -> 8196 bytes app/.DS_Store | Bin 0 -> 6148 bytes app/assets/.DS_Store | Bin 0 -> 6148 bytes app/assets/images/.DS_Store | Bin 0 -> 6148 bytes app/assets/images/Otrio.jpeg | Bin 0 -> 360514 bytes app/assets/images/drink_tac_toe.jpg | Bin 0 -> 20828 bytes app/assets/images/image_not_available.jpg | Bin 0 -> 19482 bytes app/assets/images/kanoodle.jpg | Bin 0 -> 32466 bytes app/assets/images/monopoly.jpg | Bin 0 -> 41496 bytes coverage/.last_run.json | 5 + coverage/.resultset.json | 497 ++ coverage/.resultset.json.lock | 0 coverage/assets/0.10.2/application.css | 799 ++++ coverage/assets/0.10.2/application.js | 1707 +++++++ coverage/assets/0.10.2/colorbox/border.png | Bin 0 -> 163 bytes coverage/assets/0.10.2/colorbox/controls.png | Bin 0 -> 2033 bytes coverage/assets/0.10.2/colorbox/loading.gif | Bin 0 -> 9427 bytes .../0.10.2/colorbox/loading_background.png | Bin 0 -> 166 bytes coverage/assets/0.10.2/favicon_green.png | Bin 0 -> 1009 bytes coverage/assets/0.10.2/favicon_red.png | Bin 0 -> 1009 bytes coverage/assets/0.10.2/favicon_yellow.png | Bin 0 -> 1009 bytes coverage/assets/0.10.2/loading.gif | Bin 0 -> 7247 bytes coverage/assets/0.10.2/magnify.png | Bin 0 -> 1301 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes coverage/index.html | 4000 +++++++++++++++++ db/seed_data/order_items.csv | 20 +- db/seed_data/orders.csv | 5 + db/seed_data/products.csv | 11 +- db/seed_data/reviews.csv | 16 +- 41 files changed, 7037 insertions(+), 23 deletions(-) create mode 100644 .DS_Store create mode 100644 app/.DS_Store create mode 100644 app/assets/.DS_Store create mode 100644 app/assets/images/.DS_Store create mode 100644 app/assets/images/Otrio.jpeg create mode 100644 app/assets/images/drink_tac_toe.jpg create mode 100644 app/assets/images/image_not_available.jpg create mode 100644 app/assets/images/kanoodle.jpg create mode 100644 app/assets/images/monopoly.jpg create mode 100644 coverage/.last_run.json create mode 100644 coverage/.resultset.json create mode 100644 coverage/.resultset.json.lock create mode 100644 coverage/assets/0.10.2/application.css create mode 100644 coverage/assets/0.10.2/application.js create mode 100644 coverage/assets/0.10.2/colorbox/border.png create mode 100644 coverage/assets/0.10.2/colorbox/controls.png create mode 100644 coverage/assets/0.10.2/colorbox/loading.gif create mode 100644 coverage/assets/0.10.2/colorbox/loading_background.png create mode 100644 coverage/assets/0.10.2/favicon_green.png create mode 100644 coverage/assets/0.10.2/favicon_red.png create mode 100644 coverage/assets/0.10.2/favicon_yellow.png create mode 100644 coverage/assets/0.10.2/loading.gif create mode 100644 coverage/assets/0.10.2/magnify.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 coverage/index.html diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..69f184862a527627ec67709a91fba66eb288d752 GIT binary patch literal 8196 zcmeHM&2G~`5S~p!;-p37fM|}sAaSTrD^Od6kU~g>dO$)1!2wWfCnk04*in8OAOz*Y zI{@JnPNvQnz9%GB@ov2yFTY?7u?{$$wK zRsIjZABDrw*49sv%NMQ`OO8`SE$P43OAjx4T0Oa+{FzzIiMly~&LwTK+T5z1QQ$DQLrqjKhy-oM-oqMxQ zce=Z~#p9jXtn6&u+K@tIAvGX9rzV=jZ)5jC6Wutw9_maTha;&XZ3e z#fCKBv67aiNNq|ernkU$vskfVV9RMN-KGJJ4aR4K;Yh|A1;BdLrNF@dGVnR-ke|g6 zZ|0ZOX09RD0DnN@nr%8oBt7aFEY35{D$!$bdNR*wAr8(ojb6{9;UR)b@Rju48LUIk;NuipuFNlkF9W|%52;B{V3+L__E)@1ip2M7jNOBO;L`LzyDuG zXx67yz$$P-3W!3p)oj4o-|xq!U#_)X97i~~F>bD`q@a`KIIJwkVbA|zh_MSObL!g8 TmBkF2{UJcgU^}b8g(~m|9ra8l literal 0 HcmV?d00001 diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..dd6a74021eafdf3222321051c405ca7563f79e43 GIT binary patch literal 6148 zcmeHK!EVz)5S?w^#z}?90jWLug2bVRRG_v9RkA`k^oC>v2SBaeSj5QjMzK>1(p0|i z55OPrDSQDR!Uw>c-37&QdPNc1v1Z@w?#y`iS-a~cBGI1?4v4x$RE~o3vs7M2sf-%lw!t!B8CW+4cg$&`g(uJlzm%w<*Lvj@!A@c^eF685ChL&HLfxHP@bp#V|7V3n|mTb{M@(;_|$E z@2Sj+Fv;SH3Qh(wT;9A&vVko7a+(ctl_$_0uG@Co=iR;8?D+6_-+T1%@qFK#9Ub-9 zKAg|n?(Y4Ale3G_hmW)C`OOzK4HDR}l-xD=2fo6nP4X(3WU0*Fp`Bw~x}+fp%kadM z);2sQ>>G5EupRhI_!cw)rg&mli`yik#O_j53-93U(3>>7L73S zWc3)-r~X{~)FWga+&are-z~aA-k8e97YICd140n5M|F~IwS z2W9jPRvOjTfkIsYfDW3Kz~)nsV?2Yt!Ac`~AVP-%b*L~`457o(?ioMdV5L!qlQ5SL zVcsmv4MnK8BfqEIN%$IVX&JB#)EU^+)h?g^&u+i}*Mn@$GGH0_uNV-{X>i)dl+4-M xm>i$A9`pjr!hV%T6@tPX$I9TNcn_)seI6S?-(aN?EfD)7plGm#W#FGO@Ea(lxf%cf literal 0 HcmV?d00001 diff --git a/app/assets/.DS_Store b/app/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..acda24e21f55b64e92fb2500cfa12775aa929dc2 GIT binary patch literal 6148 zcmeHK!EO^V5FMu>IEfHBR0>C5kT~R!s1+4LNUKl|y&)}v1E6-dS&~KDb(GySDj{eu z`~!Rff5IQ|Iq=3dRnrvI6GGsT#?KzV@$Nob_L_*qa6TFkb%;p98EZ`xR~YxRZ&=Mm z8bD#jNNIeK>Ek%l@dn!m{ze6O?izGVnsRzW>+{Ep;vxLrcVp)D8{nK!L}N;*xG>ku z{qj3*yeOt_U3`tFSz46+{x?zEs^4hbl(HpTw_2~miC%3DqXd*!FVcLZ7ehVIM}-+Dv>j45W%IDpT`nICdTM8P zuJ793b(;7>5MW~m?kKbE3!Ub%0kndSHLUa6}YwnZeNq_ zYiD?(SHLUqzbL@_gMu>#4l9dh>p)?y0KhuJ#!%;9LC#SQ1BaDG^uUBo1=>{Mt{B3m zBd#1Ta9CNi=_K6cL%1gkcS8~8=@?%bI*GudFTDa@fprD8Y_r4X|C3+e|JRdz%PZg& z_@@*Q_5E;vh);57>&D0NS*zeja5m;u7SB^qF-I}Dd=%e-8$(=i1sFK2EFuE)KLSPu LUw8%nr~*F#K^=!a literal 0 HcmV?d00001 diff --git a/app/assets/images/.DS_Store b/app/assets/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e7ab71a6093bffe0dcf7c8e3eafac023ef944143 GIT binary patch literal 6148 zcmeHKJx>EM41F#gDp<+{V@4K`m|0F$8JHOO0njU_QaCtNJ{FeyJN!y`c8qj|Lt;V# z*;4#`i5(|Tx+Df5lc&o=U<_cyrYLIkh<5i54cvKyC^kohbKIf9Bk^yDu6+kf++v0W zy6d0enSD#t)FpL=16<=Ci<7#UmvvJzQfYf-+j}#i1#IG!`(H7#@rdek%wUUtFP)fe zJm88MR?O32jvMTAH8Za2yR1i?p_^4RhXez`Krj#t1Oq=|fOodaNN=N%U?3O>2D%LB z`HRp@IF4$DmuT_IWd+iax4?RbAZ7`1~wdq$lwi$I6?YD4ZJOqr8P{F`2Fz^ocY(3ln literal 0 HcmV?d00001 diff --git a/app/assets/images/Otrio.jpeg b/app/assets/images/Otrio.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a5ad8df0390740f0eb52819dbaa2d60865558640 GIT binary patch literal 360514 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 z�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 )3qY#%*7*>S*H4}jB9fPn{tpMD0-)_g>*hg-2u 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≷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�^e7#H;Rw93#_rrwK|;`t=3-{9Sf(0= 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%0ATJ9pYp#mNMG8)k0E0}kk6FHg3R#c*oI1Na7bWe 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
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); +var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/"}while(x.length||y.length){var u=t().splice(0,1)[0];v+=l(w.substr(q,u.offset-q));q=u.offset;if(u.event=="start"){v+=r(u.node);s.push(u.node)}else{if(u.event=="stop"){var p=s.length;do{p--;var o=s[p];v+=("")}while(o!=u.node);s.splice(p,1);while(p'+l(K[0])+""}else{M+=l(K[0])}O=N.lR.lastIndex;K=N.lR.exec(L)}M+=l(L.substr(O,L.length-O));return M}function J(r,L){if(L.sL&&d[L.sL]){var K=f(L.sL,r);s+=K.keyword_count;return K.value}else{return E(r,L)}}function H(L,r){var K=L.cN?'':"";if(L.rB){p+=K;L.buffer=""}else{if(L.eB){p+=l(r)+K;L.buffer=""}else{p+=K;L.buffer=r}}B.push(L);A+=L.r}function D(N,K,P){var Q=B[B.length-1];if(P){p+=J(Q.buffer+N,Q);return false}var L=y(K,Q);if(L){p+=J(Q.buffer+N,Q);H(L,K);return L.rB}var r=v(B.length-1,K);if(r){var M=Q.cN?"":"";if(Q.rE){p+=J(Q.buffer+N,Q)+M}else{if(Q.eE){p+=J(Q.buffer+N,Q)+M+l(K)}else{p+=J(Q.buffer+N+K,Q)+M}}while(r>1){M=B[B.length-2].cN?"":"";p+=M;r--;B.length--}var O=B[B.length-1];B.length--;B[B.length-1].buffer="";if(O.starts){H(O.starts,"")}return Q.rE}if(w(K,Q)){throw"Illegal"}}var G=d[I];var B=[G.dM];var A=0;var s=0;var p="";try{var u=0;G.dM.buffer="";do{var x=q(C,u);var t=D(x[0],x[1],x[2]);u+=x[0].length;if(!t){u+=x[1].length}}while(!x[2]);if(B.length>1){throw"Illegal"}return{language:I,r:A,keyword_count:s,value:p}}catch(F){if(F=="Illegal"){return{language:null,r:0,keyword_count:0,value:l(C)}}else{throw F}}}function h(){function o(t,s,u){if(t.compiled){return}if(!u){t.bR=c(s,t.b?t.b:"\\B|\\b");if(!t.e&&!t.eW){t.e="\\B|\\b"}if(t.e){t.eR=c(s,t.e)}}if(t.i){t.iR=c(s,t.i)}if(t.r==undefined){t.r=1}if(t.k){t.lR=c(s,t.l||hljs.IR,true)}for(var r in t.k){if(!t.k.hasOwnProperty(r)){continue}if(t.k[r] instanceof Object){t.kG=t.k}else{t.kG={keyword:t.k}}break}if(!t.c){t.c=[]}t.compiled=true;for(var q=0;qx.keyword_count+x.r){x=u}if(u.keyword_count+u.r>w.keyword_count+w.r){x=w;w=u}}}var s=t.className;if(!s.match(w.language)){s=s?(s+" "+w.language):w.language}var o=b(t);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=k(o,b(q),A)}if(y){w.value=w.value.replace(/^((<[^>]+>|\t)+)/gm,function(B,E,D,C){return E.replace(/\t/g,y)})}if(p){w.value=w.value.replace(/\n/g,"
")}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){var q=t.parentNode;var v=document.createElement("div");v.innerHTML="
"+w.value+"
";t=v.firstChild.firstChild;v.firstChild.cN=q.cN;q.parentNode.replaceChild(v.firstChild,q)}else{t.innerHTML=w.value}t.className=s;t.dataset={};t.dataset.result={language:w.language,kw:w.keyword_count,re:w.r};if(x&&x.language){t.dataset.second_best={language:x.language,kw:x.keyword_count,re:x.r}}}function j(){if(j.called){return}j.called=true;e();var q=document.getElementsByTagName("pre");for(var o=0;o|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(o,r){var q={};for(var p in o){q[p]=o[p]}if(r){for(var p in r){q[p]=r[p]}}return q}}();hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}(); +/*! + Colorbox v1.5.13 - 2014-08-04 + jQuery lightbox and modal window plugin + (c) 2014 Jack Moore - http://www.jacklmoore.com/colorbox + license: http://www.opensource.org/licenses/mit-license.php + */ + +(function ($, document, window) { + var + // Default settings object. + // See http://jacklmoore.com/colorbox for details. + defaults = { + // data sources + html: false, + photo: false, + iframe: false, + inline: false, + + // behavior and appearance + transition: "elastic", + speed: 300, + fadeOut: 300, + width: false, + initialWidth: "600", + innerWidth: false, + maxWidth: false, + height: false, + initialHeight: "450", + innerHeight: false, + maxHeight: false, + scalePhotos: true, + scrolling: true, + opacity: 0.9, + preloading: true, + className: false, + overlayClose: true, + escKey: true, + arrowKey: true, + top: false, + bottom: false, + left: false, + right: false, + fixed: false, + data: undefined, + closeButton: true, + fastIframe: true, + open: false, + reposition: true, + loop: true, + slideshow: false, + slideshowAuto: true, + slideshowSpeed: 2500, + slideshowStart: "start slideshow", + slideshowStop: "stop slideshow", + photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i, + + // alternate image paths for high-res displays + retinaImage: false, + retinaUrl: false, + retinaSuffix: '@2x.$1', + + // internationalization + current: "image {current} of {total}", + previous: "previous", + next: "next", + close: "close", + xhrError: "This content failed to load.", + imgError: "This image failed to load.", + + // accessbility + returnFocus: true, + trapFocus: true, + + // callbacks + onOpen: false, + onLoad: false, + onComplete: false, + onCleanup: false, + onClosed: false, + + rel: function() { + return this.rel; + }, + href: function() { + // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container') + return $(this).attr('href'); + }, + title: function() { + return this.title; + } + }, + + // Abstracting the HTML and event identifiers for easy rebranding + colorbox = 'colorbox', + prefix = 'cbox', + boxElement = prefix + 'Element', + + // Events + event_open = prefix + '_open', + event_load = prefix + '_load', + event_complete = prefix + '_complete', + event_cleanup = prefix + '_cleanup', + event_closed = prefix + '_closed', + event_purge = prefix + '_purge', + + // Cached jQuery Object Variables + $overlay, + $box, + $wrap, + $content, + $topBorder, + $leftBorder, + $rightBorder, + $bottomBorder, + $related, + $window, + $loaded, + $loadingBay, + $loadingOverlay, + $title, + $current, + $slideshow, + $next, + $prev, + $close, + $groupControls, + $events = $(''), // $({}) would be prefered, but there is an issue with jQuery 1.4.2 + + // Variables for cached values or use across multiple functions + settings, + interfaceHeight, + interfaceWidth, + loadedHeight, + loadedWidth, + index, + photo, + open, + active, + closing, + loadingTimer, + publicMethod, + div = "div", + requests = 0, + previousCSS = {}, + init; + + // **************** + // HELPER FUNCTIONS + // **************** + + // Convenience function for creating new jQuery objects + function $tag(tag, id, css) { + var element = document.createElement(tag); + + if (id) { + element.id = prefix + id; + } + + if (css) { + element.style.cssText = css; + } + + return $(element); + } + + // Get the window height using innerHeight when available to avoid an issue with iOS + // http://bugs.jquery.com/ticket/6724 + function winheight() { + return window.innerHeight ? window.innerHeight : $(window).height(); + } + + function Settings(element, options) { + if (options !== Object(options)) { + options = {}; + } + + this.cache = {}; + this.el = element; + + this.value = function(key) { + var dataAttr; + + if (this.cache[key] === undefined) { + dataAttr = $(this.el).attr('data-cbox-'+key); + + if (dataAttr !== undefined) { + this.cache[key] = dataAttr; + } else if (options[key] !== undefined) { + this.cache[key] = options[key]; + } else if (defaults[key] !== undefined) { + this.cache[key] = defaults[key]; + } + } + + return this.cache[key]; + }; + + this.get = function(key) { + var value = this.value(key); + return $.isFunction(value) ? value.call(this.el, this) : value; + }; + } + + // Determine the next and previous members in a group. + function getIndex(increment) { + var + max = $related.length, + newIndex = (index + increment) % max; + + return (newIndex < 0) ? max + newIndex : newIndex; + } + + // Convert '%' and 'px' values to integers + function setSize(size, dimension) { + return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); + } + + // Checks an href to see if it is a photo. + // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. + function isImage(settings, url) { + return settings.get('photo') || settings.get('photoRegex').test(url); + } + + function retinaUrl(settings, url) { + return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url; + } + + function trapFocus(e) { + if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) { + e.stopPropagation(); + $box.focus(); + } + } + + function setClass(str) { + if (setClass.str !== str) { + $box.add($overlay).removeClass(setClass.str).addClass(str); + setClass.str = str; + } + } + + function getRelated(rel) { + index = 0; + + if (rel && rel !== false && rel !== 'nofollow') { + $related = $('.' + boxElement).filter(function () { + var options = $.data(this, colorbox); + var settings = new Settings(this, options); + return (settings.get('rel') === rel); + }); + index = $related.index(settings.el); + + // Check direct calls to Colorbox. + if (index === -1) { + $related = $related.add(settings.el); + index = $related.length - 1; + } + } else { + $related = $(settings.el); + } + } + + function trigger(event) { + // for external use + $(document).trigger(event); + // for internal use + $events.triggerHandler(event); + } + + var slideshow = (function(){ + var active, + className = prefix + "Slideshow_", + click = "click." + prefix, + timeOut; + + function clear () { + clearTimeout(timeOut); + } + + function set() { + if (settings.get('loop') || $related[index + 1]) { + clear(); + timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed')); + } + } + + function start() { + $slideshow + .html(settings.get('slideshowStop')) + .unbind(click) + .one(click, stop); + + $events + .bind(event_complete, set) + .bind(event_load, clear); + + $box.removeClass(className + "off").addClass(className + "on"); + } + + function stop() { + clear(); + + $events + .unbind(event_complete, set) + .unbind(event_load, clear); + + $slideshow + .html(settings.get('slideshowStart')) + .unbind(click) + .one(click, function () { + publicMethod.next(); + start(); + }); + + $box.removeClass(className + "on").addClass(className + "off"); + } + + function reset() { + active = false; + $slideshow.hide(); + clear(); + $events + .unbind(event_complete, set) + .unbind(event_load, clear); + $box.removeClass(className + "off " + className + "on"); + } + + return function(){ + if (active) { + if (!settings.get('slideshow')) { + $events.unbind(event_cleanup, reset); + reset(); + } + } else { + if (settings.get('slideshow') && $related[1]) { + active = true; + $events.one(event_cleanup, reset); + if (settings.get('slideshowAuto')) { + start(); + } else { + stop(); + } + $slideshow.show(); + } + } + }; + + }()); + + + function launch(element) { + var options; + + if (!closing) { + + options = $(element).data(colorbox); + + settings = new Settings(element, options); + + getRelated(settings.get('rel')); + + if (!open) { + open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. + + setClass(settings.get('className')); + + // Show colorbox so the sizes can be calculated in older versions of jQuery + $box.css({visibility:'hidden', display:'block', opacity:''}); + + $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden'); + $content.css({width:'', height:''}).append($loaded); + + // Cache values needed for size calculations + interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); + interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); + loadedHeight = $loaded.outerHeight(true); + loadedWidth = $loaded.outerWidth(true); + + // Opens inital empty Colorbox prior to content being loaded. + var initialWidth = setSize(settings.get('initialWidth'), 'x'); + var initialHeight = setSize(settings.get('initialHeight'), 'y'); + var maxWidth = settings.get('maxWidth'); + var maxHeight = settings.get('maxHeight'); + + settings.w = (maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth; + settings.h = (maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight; + + $loaded.css({width:'', height:settings.h}); + publicMethod.position(); + + trigger(event_open); + settings.get('onOpen'); + + $groupControls.add($title).hide(); + + $box.focus(); + + if (settings.get('trapFocus')) { + // Confine focus to the modal + // Uses event capturing that is not supported in IE8- + if (document.addEventListener) { + + document.addEventListener('focus', trapFocus, true); + + $events.one(event_closed, function () { + document.removeEventListener('focus', trapFocus, true); + }); + } + } + + // Return focus on closing + if (settings.get('returnFocus')) { + $events.one(event_closed, function () { + $(settings.el).focus(); + }); + } + } + + var opacity = parseFloat(settings.get('opacity')); + $overlay.css({ + opacity: opacity === opacity ? opacity : '', + cursor: settings.get('overlayClose') ? 'pointer' : '', + visibility: 'visible' + }).show(); + + if (settings.get('closeButton')) { + $close.html(settings.get('close')).appendTo($content); + } else { + $close.appendTo('
'); // replace with .detach() when dropping jQuery < 1.4 + } + + load(); + } + } + + // Colorbox's markup needs to be added to the DOM prior to being called + // so that the browser will go ahead and load the CSS background images. + function appendHTML() { + if (!$box && document.body) { + init = false; + $window = $(window); + $box = $tag(div).attr({ + id: colorbox, + 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. + role: 'dialog', + tabindex: '-1' + }).hide(); + $overlay = $tag(div, "Overlay").hide(); + $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]); + $wrap = $tag(div, "Wrapper"); + $content = $tag(div, "Content").append( + $title = $tag(div, "Title"), + $current = $tag(div, "Current"), + $prev = $('

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 literal 0 HcmV?d00001 diff --git a/app/assets/images/drink_tac_toe.jpg b/app/assets/images/drink_tac_toe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc5772eaf37728dd8f699aa7dce93fb0b6561f1e GIT binary patch literal 20828 zcmb4qWmFVi^zG2y-5o>ckRmM%J#>krbfX}Gbob2A%?#b$odY5aB_Rz;DJ2RbzTf}7 z5AS__=YHI0om=bPd)D6f{QLZG7eEfy)Yb%GU|;~W{%e4LPXHw~h=z)Z0YsktwUe;B zuk&m6H{v2UOh5sL_Lk_^e#Ky+L!o$ZUz{2^@4FeMkfQ>_eOUWUw zVq{On>4!%x5t&)mLc=Ag3h^IVq~+$3a>!CMb_|FrZ{53;Ho4+ehgOWz{TGY@1Az5E z>-zuLf6=gU{)2=m0GOB<*cjND7?^nf2gksqz{38YUZ^-FjHvA+RsC?dBwI!nFaK=- zi2ob#e=r5$IiRyv8b>6^3v0{!AwaCh89s}A9pphFTDSytKi+S+5a$yS7FjsV{0De; zHNV5B;ro{Rl2?j=cP*7BhPy#?MyrRH-ELAUn+4c+*3tr@@ViQc>P#QtiDal_q%12R z1aD;RHQ%H^iQkV!Ce_40`~w{R0|dim|H4mZzZJ}dOy02Ka>Vge^4kc1I*d)x(A$*% z2goA1`a_cbEr-aoE9HV_ZrpI38cjA|{UK)5G{G&AagO4N3isz76WgL_kYk>mm*ngmr1P!7IGNcID~T(BLeGIw2SuQJ<5c`AeUuy0 zUXKa&4Z`+|Lm-!UCK?w87eBa8&enAy982hZ#GeC2>eF>W8$JBPUkEg(R92uTY@Yn` zL+uVyrYAeU>OUw79=-GVdpmS9YHa81>6GrdtCSf_5c{`+!lgy;`Jej_U&+hND=&+4 zp8UxC|7SYT8+aP8^jDqZuoi~v2E`&ih9_5Z6omV;zU1R&*VFjk1NS&;YE|j;PLXKd z-FR>bR6$SjaUaCTWAJoT@|FD8(?r{?lB9Q71>?<>tN;_oxLhqQoHS16G&3=XUCKlBvC3tv#CR7IIo#ehhRy8T<7yzK@SH zPtxyob;NH;ek%XQk2AWTDH*KJbNt5mE#uiJ*G$DXH%l)cbcr(|$_&tbMUL}K&EK|& zns7c**TR%8V>~%s)-%Tam0M!mS2GuVBzMeCMB4iqP~fW$CNALTH!p2rJrdLhDAq)y z<`dE{6`iLeIp1$_ujrEfD3D@#E;QM0hgrz5n47BvUB09okrP;fpwNSDL!)6x^>xBV z<^ZT(j9LcMliFuh+{FB8%V1V9F(#Q@FLEhCf&R2TWlAg5DD9XiU-BQoTTUe79{@*1 z-%x+C3X@6SK|0Y-qjFdvRm7gObJ3Dv9)X{mJ$8F+P0}DDd(l{4r8iXosgTs*pSKXC{P>d zrI#8>@BPW69r!@_J$ZYPdFzpq#r?}N;v+SS#D{`iU zpPC^kBZuWf?56j@wmM|;*<2>I`4lx9CWmUK_yiuZn$1e zcK^Q7tM@|CkA|U@ zwE_Py+LP3XMBO@r`nDYnLB5T^{MGN511rwe_G_)LNVF~OEgfZbZN^R7N?>d-M~MB- zdG!m{VS`|Sj{jC)YSUU$V`x&!;s6^*km^J$0+numK2y0iv6iPIU;kWqfL%-S9jXy{((O|f|8J5oDiATNPZ^$>(eAJ<02v$KR)2ZCH(&P_|gZ} z^j?k-;H`#3;Bl!QUr~I&vK}aShIQuqHNkC<%7t5rY^CDohw=C77<$?@Na}jGc{$0d z-o>S=oX&W7uT(>LA&4|GuS>YK_cl%ztZHVJd)r%p8$=|m$KhxgOoqkc*5(ci>^$MY zGr;#VfrnH<&8oP8cZ=}J$xmI=KM%q)%9lWI;LN&Xxu%bY4JZ|hmL6Vam$g@IP~D@r+tT@w`>)AAz()t* z2660b>RLD9?Uy!|`_M0bd&9vb2fF*f{Ps3V$ee=cbFnX9EcK$j{f>^118AsT;p`i3a$H9C{F=7*KasEA`mN!zM-gf5 z81>zW&djrydZk zE&4mTzNS%V47-=l{UojIdfo2#n%+wOy7qV*hC$za2P;yf7*mxour zbndY2f)?n%FysQ&M5ohgiDd}9x_LuDnk*(lt@yO{#b8{8fxG$)xqnqrz)xY8XKjJp zn(8Lh{EMxzAEG_8!Ii4jx8kOMh7}>sm2kA&TX6;iftG{S15?m>c1}ZT9@l5gAJ5@! z4WZ=`TO68&`F=BZb|$%A>fA@m)nUeuijNMnWvij4B4%C~d6lU}9+`jC@^w{pDb%V7 zGLazHFK3>!1vu$@GHWZ$Edkfp5H!>^OxOUAGSPW^J(6?JZp1;?72d}rq_W-7!4yq@ z+9!4NupkpJ&grsY(~t7k?YK?dzI*Pbhz^;udg6ptXoI-1^7v9-RiO-r z=8nvaxX@;Km)w6DU}5WdnttEJOUzaBHJqO_pNN-Ok!Z^JLP&N+k+uTYDBtG^q*gPDyL`BcK0v{%PkqeU9hj z(uY9$gwPY-cQr3|C@oooUd$$wf{A~i&q1np+Ayxdyml)BXBG-^x=-qnCyrPcrh%>}uP zF?<V zzjdSz!7DtAQVJnKDd)5rOA_JLcsd>)*Q*@B_VxVs4IXC|>)JKFc#CGY&z!Z(-O$`> zi9DUJIHlkX3r6ZJsUi9r2xW$)MrEU_t^ORKXFcr(5oR>PRsJRlmkD3vcV<1Ip*7owfqJ#ZVp8rC6@=+oyQ=>4iTSF-!{RcBi!05v|M4Yfg#YJ;L(2S zP<;@4e=yZ9@R41n^WsdD<{kg{bPQY_(*h#}E5Qw&FYTLk$0p%oH+LCs4^aApnFC-v z8#vHpbj+MZ?^8E@RYc3$=nj3`dnA97Q@$)6EbPrcz?_*m``JaR-+Rp&c@hmN)H!0~ z)~h3Gh$Ou`w>PiA-QAQ-V&BH=3j}dRp$rY=Pqrz*FCLTb*$8s5j4M|1?xKwCtOzV9 zuq#`o)w1JCzO-JEy8~v;=H^*JHr)mimw#(eNh;Qy+~*;Q=n9Qvtn+yJTF!5mekXaw zGxKDdP;TH3TX-xFqf88E2CG~-7|nR^X`@0Fcie0oJ`WpDJU(0J&#H00a~$)#Qkt$o zix?KS*xyS-`UsX;+IZ~P?qV~2U3WOPPXKjt58ff!Ru_x=GY%~Ld&xz(3=x8W6vnYwG#)%4J?nrw4E zDOdxMwhG}s85T{N6jC2@>ec#Zeuy7}-IgrVs`TlPM$#AgSIgNFxfgDw{66dV)xFgFHV<2VIN$|Ch)$n_+i#A zok|nLBabZ%0!2(MGj$xUn>5}rHyqoxzq{>%W_h?MqfKiS8P)EZtX}qK}9?=denPKUH8QNbv9*&IX0Az_LZ$ zkY7?kBh}7)>8TZ!yyG8u%P1v6%nftpFvBPA`bEhM2eq;VL&ECM{(k);zf*ddlA~B8 z-NAA~?c$0ifP2D)PS0Z8J8r}{j_`;TB;SqaV;E{wk{6xJM$$6GnF80{ouJS*Zyq6b zn=EPb%il$1jV#bNW=}dBv&KaNUYZ{PbY8gS!T?;aASDVr;~b;XJNTjYo4}eW!Y^>F zel%J6&^#IPn7%06-Q9NhK!i`ygLz2SC+F2V+skqp^K5PH^U8I(-1qOa&5xKb=Xv~o zRyxlw_K(Vu&)ztDhSNR1Xcx z?=9Mk@0Ltrf1}StjaMx9CSlRI;K0ybwq0CLp`~49AHKgJr|`Rodd}%D>Lzi;l3e2Z z$k|aQD723b7K*+|=J-(>@SQEj^nwa#VGb}2wkigeqVLu0_&w=dQ{_cnig0X2@RK^; zf=wGP=sF-8H1cZKD8SuGt53&dIe$-HQ0u+dFl3(=g4j#|iFX18$`NUf!lU8S{URD$ zZF9Y(pSaUq)4=jg)>H_`7Xq7FGA(Fnk2se;{QgqzD(dHd%MF{Z{{h-bWko3QsBm5y z8k#232fXUhgopPg&<@Q*n<>QKQ~#mHzxyr` zN4}$emZa#5tbZy%NCv-uNbw5_!2kytZP3YHTUpIKJ7`W2Sn;=t)wMZCPx_Op+nKUr zQkO`jvUj(naW!%#OnciBgqKNfIU`QB2KImS?(i?5aXAyx1iqd!VmuCL=y ze(34;*w*siG^OWz{sSmS4+oD3m}moyx*z%F5hI`y9UuNjGyMa@7s$pP9oJ7s&X8w7bM#e`jqs69%sy=%o|Iq znm^?8VwbE^Mi_Uog330VydJ5B*naV$v$WA}Ne*`Z=d0hEn#jnD&7Y54T-66og1rjj zzu-?5lyiTv!ZA5tK4_=+H~pl~e*KNLsNFrUa0*Bl{2I-OW@db#j)b z_1XhJ(4s&G;x-N56Mk&gYzp0dcPyCPekX=a^kGfBENP~o%EV8YR3d>1r?dKzr@V+} z0oH82e242|lCyG3X>v&*LBW>fBDM3iC}yb8bqva@i}FkLs=kVFh5b*1|fK zhp{S)SS44q#qV}~(1A~94uiS-#su29I)T{_G&e|9_#aheT{FEA4E1ZO#q=oeiiPA6 zgmh`h_HF8P7qg9h7{#s((2onMdm2PjY*zR7CCn4F=N-yqec9R|Xda}Vg?H5y&~P z=-e@F0QJTHHq0RSIPoSr>F=}r1N8HK@9j}n^t|%2uh=|W1Omx1RcSo}f z)JpkYb~L54)UEY7)?O@+TkX6|4u2nsU}6`-0hOiso#~s9DDfsxfS-1*q8iH;POI~Z zL@Hrm{t>5!ShYN1H2^D9|wS}-hJ{$W2}Al-D;1@MT<}uxg30wT2tD3aE-?= z!_uO==a&V}+s%YQ7tr zl<-?!2&2Eh^OlB5pF6}$2t8ExLLorxp+Vohk9}^uu8c~U`MRk}74C;umhh-~IO4_+ z)_Uc2K+!J0l;xdm!`<4X70y-f^mV2-wKSc~T*=sZ(q)0My4inljp=V0nuj&0GuL>& zny0-=0@i?2>PWFv^r5XDO_x=Q7R_TrS0p@BH=_#bg)OnfjBlQLvRDhE|9;@#pxF7C zJ9BXf)-n+A_o8$o6p?xgp{YXq4Am-~Fy1C_lJ@1TFH`xa;|{wnft6*`Ap)Xe|NELl=zV4S`AF;(IC1Ga zI8A3`;QqUN1>89_?qCn+*6H#GQD~T5X}EwZ#IpIaDXBHBF=bA<3c?Lr=n1r{GpL1d z)laHo%n@VDdUP6LECY@g%hs8xSgE|=oJVSd z7u`P2p!h(x+WT#D|8X9iDxH!%VE>8NU(f=$Ej+GVoiq#?Wu>k0M?_|VjYxjXDk*Ts zbGb>uE9X0xpG4oJn~azRjO(Ml*_D@v3bk~R<22k=7RmH+&G!(N>W|c^LB3}s%+>SN zK=<6Y;-F4PzaI(jcpr0E9Bj+ybkG*r*)`gCqlsTw!qFl0J{qG^y;3t_m22YSKWYC{ z2db*iRt1+0=8&@?V>7fr$oFV}O&P$xjtHnPPkQ5Zm~H(^wzA~Wg9<}@Vyu3~{g>UI zTJShgddiMoN_yB+4J>W*@1d?B`GwchI?w<@ZI<)-+8veyx8edKODZxFDGW45Tzi8; z>&x;3lXnarrfG%5>J1sCstt{qT8a0K-`(PUT5y)SI^{&XR^*(z%Z0zlCHC9g{^`$5 z7x{!!W?T-dZvX_pWY_I$ZT#w{!8eH+`WmHbw)Zid`-1UP5F+-imfXACk#Epz&yLh! zA+tLD3jSP;hXnuptrA3+#F_VHQa^u2Mw6DuE|>E#lDmT6AZ}7bUVW(Az+@+C-qc%9 zfUi^K$m0dI8B>@&r?)KvdIB7wDVHp;RW5quu#B4Sh`9Vb_D<_>@^#6gAIgLuo%(r& zhcN9_BuZD-jI-=B8yqQn-i`1?#1QZALMyNOC)D{pRcIAC8U$Wyy~}>2EgX20l9U@{ z%8MClvxZ$Hx<@s|Xutd6w4tEjLEy1GU3oT>$Gl}=ivAlimi@AOGrPrasrpvEtp|@j zsX?u{z+_Bv#tL5ZUC=I29c6~(v5{k&&ysG{uYeI%^krabX`!b=pC~>$oLck%ih?!~ zy6qXzPS=hAaAM-5Yn=TWw*VPfQXDa+*XFPB6V-@?pjc`VVXG2buG6?}UT9VJ@w) zC0b!dv>ds;p;3!ZOP7S^Bsbcb1zY6rK5Waz2SrJ;3JH^}9-=n_qRPXlzWf}; z0E58O+T7&Q&$uuI3<2In?=)#%8`3RD!bZVal6HngaxVc=2T46BX)W4QE=I_*#_&LW zBSow$1Uj6F?0%uD3U24dm<@jAHbE^ES*^8j6T{;S*0iq~eDwm~C_qUK7THlj7MSVa zpL{mSNaVtwQC|ayDE^VcBVb7Y8Q?f!b&v$TPa@d5U^0KRON1biA5ZvlKKQi^b`--i z!Phny#8lv$0$%q2C9`niYSe9n60M9c1o)t3G*`a|#-yCg=AKIP(rzRIyMO%k!Cy3m zfsFz;dx(hzZxh%ti=;N>qUsa4A2^S9tmukt=S~2BJtmjowzfqL9+mV2ErzD4jiQai zs+)5(VduhC6pX6%LVDj77Lx_|&5Rwx6y=mLZCsnqSZD}%N32)^m*Op62H|OQWi-b) z3(RhJq&@D5QO4LH&H^u1XIAKk~7;XLtq-;J&9jo zKUiNNf*=6Q@hvt_9w7F^kFyADYUhr2EL(e5El`)jZ_Q=Q?7CEH>2|MYW0iMZwb&RU zIQs96`HKjC6a;)1w3t4Npd=NBvU@nEUkgY`-7rvHCkEV5Iqfx)TUK{_3ePy2-Luq|a?Cr)rC8;yH zRu3&5(`Zrv4ew@zy_;*4X(_;epjjPoOk@?ZeVQQTdK?niBr}8P8;Xf?BzraZG?R&|JD~}_mD|cBnrUJB8(FEs;QFbj_oW9%qVjp<5YCi+p({7U6eKVtA&P(KpHGe3hQ6l5U#Z(9=ye5oV-_8p9rbX(lv_TZPR z0>%k+zed{uX-+&ZG$?W73)uzbC%%gaIq3BYYoMBD+_HjcU6yHb29LPSSIEet_)8>Fn)dI{_HYuVg`UN{=S@Y4l56|dbl zv2pIXN#%!yF#}tkw$3gy`klS$y(H7XJCzK?7SYQGrqqg%2>F6!qTdrR#pG2Of&aT= zl1^=-wJ9NUDv2Lp-9Djxf7uNbwea-F8$2Nt@9^8EdQYGkm;SGca0;GyAe+cO0oXpE zRd*~;^`ZdS@xxm|qq>CC|4r|iFxRO9buQ$A@Q5O&;bJJGt8d`7>Y{<@`k^=@0} zz3t&jFBJr{MD}p>n3Wi??**%l09{3e_;682jAEbPZtQT*zp;cATvX;n`+p14U?%8I zof+u%I-pk(97tI52;EW159DXI9-Rt?qgHYgGShQlfFe%TH z{+wG50q}v2NB_#Jcp&8WM~8UFKoVIme#QR-G#F*B%|wZ&Arf}Dq92n|QjnjQIK}mz z%=2c4T!&IrIJj%%FIV|ml>atKemFC~O2EdXEvIT;(9EP*SDoPDc9v;La|LI?asGPY zcBQ6F0QofRHi>2(kqu!EyXuY63tMQB+M37BN&hXIq+{*ItX;IYO zvm!+bcM;De#?dOm@wC*jY)+W>N@EgmT?@CBM4NB+@gg%u1|i(mKJ>RTOkOk~Dt$Y_ z6&9&;8?MLZE)$rl!0yh1Lpoo#UR$1&CSk%doPTGBFkt41ItVF!&D~760E;4g7fmHC zDUlz5f~wdI>uqXn6%-36w z>r>n^M3T^~S@gUd`RofG+;DB>Cj`f$r$4sP4as6p-J2d^Mj2{Cg|SW{4xc}Kv;9+> za`0@i?FCE2f4a84X69ev2Jn#3(gnB+UV4hzu+wq3Ej*%yM4aemF-BGpJeId#yW*W} za}mhQMSb|g{)t)tIaeH8eztGfkb7#X{qcGANyEQA=-ek<$QcwT^VPn&fgDxK68ycR37tU{B*sPkTLPsEFLUdT8Dn zm?0G0_#BjUB5dXw{_4PuXN{bys@!MjfYN=&AfxRaX!Z?069Bga-&ff*k*>1>AznYD zV1yVF7P<7AsOYWexIjLb=BI_RRk})w#tZJJ>xGKonwOldVQufq>D2!_O zsGE`dGWi329WPBa|Mr(mc~xkrwOWeVZSM0pQ^99PtUaJr)1z!pP^ph6iu)AwS*3pK zygkCpSP*}{H0GO(JO+(<=7;Ut_z1VskZ-z{roDneou9p?U<+=C{e;pz;K;6Cl2&kz zgSUvyt(IQ+x8H}+ADqm?wKwU;Nl6F_u!^H)_8mrw%`D|og}00@(SY|b51@^e{>@P2 z^AypuL%Lz!@$N<);`Ug596-yLR_(Q6{F@ciEJ!L>={6bedL?N+5If7+7mK^JsTA+#an2CwSWk2 ziHfGv=j7zHmJ>p0ZJKBvy0%nJ6wRZSJNyyH5RcV;dRXoT9{o7bqvoTuX^y`oKi|i( z7vd@lXQ8grn=ys}?8ryF%}G%qyHs9daILnSdXbu($y#A{g7RR*4*Y`Jy%F3EEfZ^5 z=}dy7b!D$Dccv(#f7?7iG;#8oksz2tm-y}63P^B%;FY~q*@uU36wp4w?Wo9IArM2) z&<*utezq=`e}DnQU%8RszNz0biWPw_^YOii{YU3c;iF!EnWeY-ET6-}Tqo;4H7nC}Mo8?^BS;7vm-n$|3D z{9|JE{b)~V1;-{AU8!NgPm%nm+|bWg&va!(0}>SkfcJv+)`F6vN8o(cP{rO7XT3li zhuw$ys{md8H)I|^O=sutlh0XzjrP1ul&3+6Ee6H}!`m z9{Qh5b@pC$5QFylW61^1OQZCsw0x{HH_UL|ZMS;cgy_aHBFk0?(xUi2%7DL3H#}+J zrkb6f%9#XbT*t$~{8p-+5vMJ}*&RXGBENjJek(c6s1@tBvVq)hrBo>q$=W z_p_3p^F!{KiM&RI5XG6;e71uf|Me>mtcL*w}N40udWl00>Bg%8>$=o;0IfpqcC=2zGos>^_~O=fOcKu=kWsG`qOeba&4(~Ce{92JD6R9 zjWKA$I?*ldn3G^Qj4|4qrX8B8WvQ1QPk#eD17{ZJ!AWVd&5U#1LIa|!6q{FVaR}hA z0_4)Rr<*E|O=YBR#}Y9NWKF#0@i)VKWkz?8bL#g=t$#J`u@;VE@sgFNK~hWJ{+Y@_ zhoVkK`40U$-W73grL^Bf!bo?`dNevI0`x@Pd5kZhOF9!x!y1rZJ3kM*pBrnk zetG>d@-j_NS83BtImFGA5=`kSOrYtJV@5JsH}Y-H(YR_L=2SOiOvfru&d@aME$ijG_xBT4s1}nn*xj@?3FaHE4r`TmV9lTulF~j$PMLX4-Dexa4V^Z@m(=DCH z0A%wIppueuWTuor3@I?HqWRnU^HLlTa~xn$FYN8Bk%Vz?<^6}w{3`MmJ1ceGHZaw3 zoi_^5+|qHUFe%ty0EauvbnmhF!VG3(pmXI z^j5$((eo%e#TFC7`mI{Zch%uWR^*s^!%Gngnr@++)-NBq5p_$qr%|tujtkXC;r`8aE>~Aa#EqVrz64AGF;2bSlv3M|950xSdkOSr z46P-PsK^b(ZreU}T3c|aiDFf*B_w$R>mkl2bA|g0i{?RihQg>T@+_(v&=8Y)VJc&p zp^Cqmsdt4KLu|u5&lIa{=YxnyK=}4t^-5J88FFSlR@fC!pdP2AU-UM=HExu`FjN3S ziE~G>elBkARmJMBG8}X2sTuKZUkPFvu#^h!@Lv3b?XsYZOq^IUiRV8|>AARdlQhQ9 zyNQuU^j73{lfVeJc2*sImcQA>&aOi7^NM}BA#^8W7cdP8ya%~>==wM*g zs~mTTu)d5un)1{e!!t|zAHem%dQ_mo`0-p1Z}L?vLgp35=baeviv3Sei0D;o^^Y(S zmFSRDiDd-Dzi!z$&w7BOV%IKp_)g}x=mBb z61IjFy}eT|mMgfZi-gtA*dtQ97N}|-xtJM$SZQm#U9Ys|tD@b+V}^%h|9Q>mMY3sP>LV`9S0M_4y z`Rgx8Z+m)07%lo6Nv_NQv*;=pL}9UmB{)X|wbk9cG%2l9F>l7=M+sC*^0YO#&@a%4 zd=BN3U{6Wj+3>LG(Kw~I{ZxrEW&}X|g47k?(mPnrknhqzVjsvt)%9_XGgG0^L@PJ3Di zo8~?Jbo{JKQuge~cTVaA`*XilldNof&Qk?eYMr`QL3)e_>kMUvL`)XO;A5GG>BK~w z@wg9@ZKU=Wu}FWq!eEUA6%gd-a%w|Yii0+=(-=lVvZn*?Q^0EI;tEz};+Y$d@M_*8 zh+L6})hE||A>37N?vYsw*5YPQX8px#Sb&Kka{?ezmC^!stYNrDZ0=@l!s24h zFwm}_=34Wb>k(Sjns4gEZQ$u^mW8jS{{ZBjXS#ZN(qO=?*03woH+H6Ec@6TDDCsi^`^Dc_MaA=x4q0-+eb2ZTh;ZIY{obGz1FIPjisO8gI-ZqUp5+H{sN zXV*&6oiaX7rnVqI2S&5(r^kWv9Pd!dwFsI-sb2Gd2LE_q%4rNAdz00rh>Y=@Wh;Hw zHUvcYI5O^zFbkBw&Jk+u%WS~^9)JGd-D#I`VQFg?2p|fs0`k}CtviSnJ{;3Qz1OiOuSYJ zQCT1fN=+$K_#Vhy=Bjlb7xi#>#(Z8*1v~p$iUDG@*|hfR7nPf@BP#gAq1Eb*kA51% zhY-+ybPT&6EhA(^AfRPisxvYIj1*m3Xm9EU($#kE2o>xCwdSiA5O7Ar^ld}97;FbU zMCSCWRWqlXmM%3zs2R6l6e0O`POqV{&xdg!a@nn{OIF25dwZ33h<}HwWr);wEWJ$4 zc%V_L-*sJPAFv^1>d^Qzf|(1mgISx=Mj03FUFM*1yAv#gjs6K+I6wHxw$v>uhELKkJm*2$|MKCkoOcN)Mk&YY(A90Ndy#(CcDl0iZHz`M)yAfZt}ye*@34(uOdI0-TSX(FGZsLvH%UYHS4Q(7VDH;iLiz}JgmBOH zLVM+`T)TltOXt$I!Vh0Z9V0q9y&qltDw;5;f8m$2Q+q3%mut-%)G=AwKyHf0%tgu{ z0(+g=71O-GqR{7|mg5M4{l7j;voLt%nAW=_&%L#eEFB#T_Tz(WH6MX)E=I3adN8-2 zGDZCUu+D^0;Pk~>DxAL4bVA{y_vEQY@&5tT1xd>EMQjOFDYbb<$n`s6-PXoYhwiw| z16n*@sgBSSl2Ht7a++MXRY?(3idz44CiSgO)}Uj|WrV>|O?AUVj`Y-|kGSMF*JNP-Z zQH)D75$`C4!|Vk)IIP~uQwERJf8op#O0KkU8?P>z=Uvr~Hn^}S-!ZSc0{Ts8neL&w^UPQ9ZTvvU6{Jv4hYXjObT$OCsRGHEa39Hl<0 zKCM`@;HvRIVfchQnkgla3yDH((LT2ton%tb%6E$GjVa{|trbdIo72}tlxUa@MMTm% z^9q^*VxqEt^lVN_yz6PgU0Bkz&Cu2AzdtWf=CLW)qj$Ru04{THjAI1L-HQ~dW{C8` zcnE%USDdgK;utr5G_6!`Pa-02u!O`AHH3>Beay0fT{_xud83`yIYdo1R18QkeouwC zOUv88Xe}mXnFgbu)9cWC7iK7)JR}4@XsKs)UCG4g?=>g#@d8_a(%_=akb}dXfM;(b zkD&V__DOseqa=+}TuDpL0&DSe3)~DKlcr#AY9A~qMQb_zAmX_iV~HspK~wHPMF*7I zOvs6g3nRqFZTwhuXn?VT@BZFOd5qVxWo{Hc^sa9kV{ zL5)%GcDb9%edVddGK#f$?S^8|{<~RM~X`csHNZRebvSKD3jx9TS8{lC-RvnQD6Bgc{9JZOX zl++6mWtANq?&%e(FL3`PfwX=_<@#FC;7!ct2+WNKxxHDp^KytY|e z@7G)tZ{IqRxc$lCW{6M7n*aAbwnSDrN`B*I?MMCglVuD6Byiy6hWs(Hh~;!@Ffh*(JHsZ?_bjau7LfhD^kIeWva7_5pN;h43${{{?1K!-^2U_ z(lR-uTwx3v@tn!=v-a0c>cZO_k>4vWWXMQYk&RF=E9il~QPFmiYgu4w2m_M#E?YSe`*SuY9 z4NAJpt4!KFPnhx8@$ik3-?!=KVA*KI<&w+}2q8m8VN5OZJ>g0UB_@>Ulhh@IAqoJA z_))t7Wp+xe(a%qc-B97rVVcp?9_S0a&}$2sac0?CBI)JP$o!0bdRA@D_% zv1z_GCw?c45W`JVofT|WlHveAl=p5y02~?DYfW+l&_ky7>O?HGjRKDxgQWJP4k1Fr z8VSO`|t0gHqUp`yfY53~Ls7N1GkkK7`r%hh(0 zPE5sqi`@J?+J+EQ|18oNw}yR5^5qRA`eo1rV1FsI-OuPb%mLaWGh>)RS>atybSZ4F z`>{5Azj3z9*nGFnW^;0Z6L%{19{~RcpIDDoO#i4}vNsNyrx(xgqTg~*hE<3VS&X*5 z{U7no4_4urTzvX&c+{Zp)uAccdwOpA0T%|tn&S7I67MZcb=ex(dL6ldRX@jm={miA zQ4wXE0ag3?zXHt=GVkf%yuXY)mOraC_aU^<{dRZnE8`9&zjtr$#xJvP0%t|#Ru4~% z3RMyc0|_1FoqQm!bN6L>zAz%%{O+pa@1k@U=^WX+H^I{!%F7~3R3s#KyUL2g7vcrg zr@Yyh51Ft?Pw}2`af_;IkfA)J9Im>1BpxFBpJn2u%X>zcqN>Vn&XO#Lr{&sE7F&r= zfF>^lfqbIjwCDx&(kU57M7-+`pG6KON<9G=i?yc^^JsAg=F|d#<_@=qlxw4*CwrZF z8$cJ7L;$%5E#4tuo;K3L4*?1n;&u^SW6AdB>Ws>?u&*{r&VPuVq9D1n0E&B}<8!vL zYGC@(s&u}^^bf zNiow1qyscRfgckbCvIflR}7>_Y$f!QKXE@39P5c8OW?vel#?#t=7aEoCm1O1s9ahM z9@V7|kq+|##M;{0G|Y_fx*!{T$|#{%Q%c-&hST!SO3WIqH95%_eUGa0M<2X7!@0Km zFrcBNMak5cEjU=VcJ%J@j(yusq^$xKY)d&cRuiof$ZqIu2U{fW6gb>m7@DD1ROWA! z+emdsGqmL|C|B_`cz8z~Z$_1uaTClqmfU>VO?|E2)$pKkGNGTj|x8)s5r4l)? zmb&#)YH-ZYGUE;2%^_pDk>k!BP-z}`TSKTB<^}I-mYNFhE5wmu5fU>KOug7kC36j` z-K4o0kg?Qm3>DH|ULQeua!xl*no!EM`fS@vEBJr&8OYY@2GWwrZ3#*Rn?iD-JcK(s zB!La(Uv1V>rq&dd3#5&Rj`!}L2$P-iLbLw>S#19RZayLmRCV>hiz&TXzwgJyL2*v; zt`6Cre*h!e;`yLO?DR!>KyZp92pc&5zMxD=zH;Lkz3tl(@QB=c*XxE(91<_E=@R%iOhkiinQ;FAmLNzb`f-U}iLOMH*xKAN3m?*04QS)*I=KBGz#J%CX$EkHAEx5{`C9=F`7UU%1GD%2ZiDG6;4`fzux{4 zjDASZC&VkJe)@jtjEz$N0Db=e35<^D^l(eEB5>MzaC1_=FydeLcK+-(o&El6?|9Bnu9A-Y4i-u5y!> zS>K8}ATMjAHxCemtMSMz$B$A~l z-9+<(Y;XSnT4hK6*#qKWXbht<;|e_t-Si2E^sAz?B9!mjBX1E5TL28|+9j~lCSwrE zi(bxWJ^&N=LYGA@i&A_MDEJ!$o5xHcs^+>SKN#mZtfS+Yj@U$4%^qn?bFY~)_%M;d z^Jl^%RCI|qK8;=x614!`$*_%bzq1@eDuYQ|3O4UsK@d$zN>dtodTCZeedQ?qW5|3W zaH&r(I*pPwzah>B7QfPZxI#hsCP`b3o^T(8b13e1&a~W3$WxuHiJF~ByFE10n_-jv z6J%I=%vZ0;nJKqr-vujeRyX4pHh>*896CV$C!@&ENV_!h(#y=E;p=+=jbkR6Hgdso zjUtGdkdR(^M6Gt$LO>qqCULYp+S*tuZ9>XQwYcL0SW0zH+MY10kZss9zdFLNUA*s7R&G)?ET75>B1_OwK>$S%VdXOV>Qb%z)4I5n zk3jxVD2B_b2ugx;5H3!F`bSb>*)@YwrB{Wm`?}A%(E?INhkNZ7ULC{j(U7tzzj`bSRz$aRZ8N=>$<+m>YkEu%!+lqt&iLvDpUi%6`IxdY!0u-MB_ zcl+PKMyHdOP=U;RVRQgQg8u-#{32q##uE61l+WM4!eb*TpTB>E#z$m&IHlPUIzMPl zbW)+rxcP?sA-w4Qp*Q!8IG6ec{3AEnvgmJC7p6Wxhw*^gH_g85O41E#12mJPnEYTl zXzXT?=pEbZ9NE4}ofu!Wq7xp;mn7w;fchonS3q|6#ePQdbI!^&QIK*~-CKPYQTRng zP?2_@Jmj;vi}>xaGwcLrlKY8c4c^n;j#iwYL)wDOBgGbtYxmK{r^;M!<2u zDABZ&u~#IXHL|OX@)FIM97xWqow-4-Hl$2UPct4gQn;C~84bf^G{HKcNl;gsbw9s)6s$eDauI=?|)1_mZ( zg60IeR4zAyb@~eMF<&x=MP<^hd&H!3j_k?F!BG6G{T0aqa)4NAC0 zUx;e~c%{j?CEv5kfT8uQHT4~>4JxXsw?6ZA7n~1$ahRkKHY21;VLU#$>5(}4NSAEp zKqE&FUXisVtQ2Y3MMGs$h^DgO2zB|c-A$)Jo16Ry5oMo9_`oY|XT(ye=#)Vj|k27Y`Qtk3(KrPsEm)TUeaG7$H0`+ZJtA313a}zGypjTr zU^a~6=-T|1B}$13G4J2{cOzc2I=nQrS=$x}W^Tf~4IRuvPdG zaSR-zQ&visBQB-$?Bho}RKtK)V;#AdETn=`v$1hk1JoimPY+dVlS-O>1(dj}snw@1 zuv+kaFG-P=H)c(QD}fD*!`lJ5y11B1bq&w3cQfm!lrF1;pk(g9U8s&LHEZBsr^yGeQgeK;2|!kjWU7ng&&Yf z`$>04%`d>fYwc!muVn*!h&6Lo)!_pZEfkVKyk2EwVRQ=O3JNP|?O0D|K7nNZ6G#GXXziBS5x@^*78!JQVK%Xj5}JU#r>2}C+0JzdF*M&KHb*|eL^H}z zyzQ?o_XKESX>2&)*n46*`aJWh`H+!*cZqOgQlX^WjEz7b&9H|Qlco0_1|;QLLrnmL zgdrly0BLAMr3!f~1>%x90TSq@t1XlgKgATF*)C{+l4)zLwxBfa0==5SmdZXb(o#VZ z?iWeS=MIqUi0H=+r#?y97dEW33ed+Atm4^8^+dYcLj5Gd3rHVV-w`M~E;C6GZc7zv z6K@hBo3c+R_dxc+LRv-dkv_2t$~XW#1W%+tR1-xuXpwaL0f`1F&yVQOx+gWa5$=qz z@rJRaCz1UT$&qvoNFKQ8nJy&5)8X!n15REsdr5O+aVU+6_eWsbP>>QV0I(3gI&0w@ zDN)%9J_0R7o!?`MX0yNHF_7w+ET+PpaXD1206e23Xvc#IJ7gs2{iQYHW2-+vj|k;D zZBm=@G0~IrE%-)Hvt`mW{{Yb{7}zLUAGn<8QhCEMD(^8FO>$`mz{%D)rW!8kF*GF9 zcTx2SOO({Fe~f3a($N5?^6`#Jol1VSykc=!dR@bHsQQd;7;Zr(l?AQ&?qFuDYwCf*4Jocx@#^dl1+~YdVEA> zqS{ZfDOW^7@Z~kbcN)xLP2tK*N(xM(ZaBoDPy8{L9K=S*zXN$6*~v1J?b|CrLc?eq zBu79BwgmVK$3ZUgwq?&{qSQW-8^31}rwCTO1UO8T!TyX7yknwiuW?gj+G5mS(42;L zHr6u4M2cyL>pSdBbQH$8xZ(B1dTf_8MaGYaiIm8&pQ)R~$5AfQc5Ob$ew!BZ1K;5r z47#sHwI5Uv1c9&sLahg+9-#)ADS|$T`pAxnroKh&f#OU|S~42Oh3YaTG^Y=w>QmsG z$7Irx^_^Mp(j+Y#v{Hmnw=s~WOO3*hild@rWz(}s_3I8}A<`AInpr}96d-sAURc~@ z6eBvuMq9D2*doOmjrbN>zf1JgpAVF7vi1Wkho-1M!I1*;|r01e?afb^icp zbc%cH+q3nk{!!E9r+B=C_#*InY#u~2u#5>YB$`;uWxnV5Kp&hf6v=QkE-3x-J{F7g z*&d=I>_jC_p(e#?2gF3uY4V&HLHol002u6skdb5|DIEo&`fOXs07~>qR(45;NlS;Rw z`u_mJ0FHu~&(I literal 0 HcmV?d00001 diff --git a/app/assets/images/image_not_available.jpg b/app/assets/images/image_not_available.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6ff41496b34ac00c4231bcba4b3607480dbd9fc GIT binary patch literal 19482 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 a8xgrRb-jP@yDV493CIcjg}^3h*S`SpsaJOZ literal 0 HcmV?d00001 diff --git a/app/assets/images/kanoodle.jpg b/app/assets/images/kanoodle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3752c0649b8bf159bf46eabddb5894a3732f0dc9 GIT binary patch literal 32466 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 wdA|V(WrV?`DdOX7tnM-AuwG++SXuuq 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 literal 0 HcmV?d00001 diff --git a/coverage/.last_run.json b/coverage/.last_run.json new file mode 100644 index 0000000000..a1050b01f8 --- /dev/null +++ b/coverage/.last_run.json @@ -0,0 +1,5 @@ +{ + "result": { + "covered_percent": 15.76 + } +} diff --git a/coverage/.resultset.json b/coverage/.resultset.json new file mode 100644 index 0000000000..8f12ac2120 --- /dev/null +++ b/coverage/.resultset.json @@ -0,0 +1,497 @@ +{ + "Unit Tests": { + "coverage": { + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/application_helper.rb": [ + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/categories_helper.rb": [ + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/merchants_helper.rb": [ + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/order_items_helper.rb": [ + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/orders_helper.rb": [ + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/products_helper.rb": [ + 1, + null, + 1, + 0, + null, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/reviews_helper.rb": [ + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/helpers/sessions_helper.rb": [ + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/category.rb": [ + 1, + 1, + null, + 1, + null, + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/application_record.rb": [ + 1, + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/merchant.rb": [ + 1, + 1, + 1, + 1, + 1, + 1, + null, + 1, + 0, + null, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/order_item.rb": [ + 1, + 1, + 1, + 1, + null, + 1, + 1, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/order.rb": [ + 1, + 1, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/product.rb": [ + 1, + 1, + 1, + 1, + 1, + null, + 1, + null, + 1, + 1, + null, + 1, + 0, + 0, + null, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/review.rb": [ + 1, + 1, + 1, + 1, + 1, + null + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/mailers/application_mailer.rb": [ + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/jobs/application_job.rb": [ + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/application_controller.rb": [ + 0, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/categories_controller.rb": [ + 0, + null, + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/merchants_controller.rb": [ + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + null, + null, + null, + null, + null, + null, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/orders_controller.rb": [ + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/products_controller.rb": [ + 0, + 0, + null, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/sessions_controller.rb": [ + 0, + 0, + null, + 0, + 0, + 0, + null, + 0, + null, + 0, + null, + 0, + null, + null, + null, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + null, + null, + null, + null, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/order_items_controller.rb": [ + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/reviews_controller.rb": [ + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/channels/application_cable/connection.rb": [ + 0, + 0, + 0, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/channels/application_cable/channel.rb": [ + 0, + 0, + 0, + 0 + ] + }, + "timestamp": 1540226131 + } +} diff --git a/coverage/.resultset.json.lock b/coverage/.resultset.json.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/coverage/assets/0.10.2/application.css b/coverage/assets/0.10.2/application.css new file mode 100644 index 0000000000..d86560434d --- /dev/null +++ b/coverage/assets/0.10.2/application.css @@ -0,0 +1,799 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ + +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} +article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;} +body {line-height:1.5;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;} +table, td, th {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:"";} +blockquote, q {quotes:"" "";} +a img {border:none;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:82%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:2em;margin-bottom:0.75em;} +h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} +p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} +a:focus, a:hover {color:#000;} +a {color:#009;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong {font-weight:bold;} +em, dfn {font-style:italic;} +dfn {font-weight:bold;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0;} +ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tr.even td {background:#efefef;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* forms.css */ +label {font-weight:bold;} +fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} +legend {font-weight:bold;font-size:1.2em;} +input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;} +input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;} +input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} +input.text, input.title {width:300px;padding:5px;} +input.title {font-size:1.5em;} +textarea {width:390px;height:250px;padding:5px;} +input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;} +form.inline {line-height:3;} +form.inline p {margin-bottom:0;} +.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} +.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} +.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} +.success {background:#E6EFC2;color:#264409;border-color:#C6D880;} +.error a {color:#8a1f11;} +.notice a {color:#514721;} +.success a {color:#264409;} +.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} +/* +github.com style (c) Vasily Polovnyov +*/ + + +pre code { +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .javadoc { + color: #998; + font-style: italic +} + +pre .keyword, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .lisp .title { + color: #000; + font-weight: bold +} + +pre .number, +pre .hexcolor { + color: #458 +} + + +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula { + color: #d14 +} + +pre .subst { + color: #712; +} + +pre .constant, +pre .title, +pre .id { + color: #900; + font-weight: bold +} + +pre .javascript .title, +pre .lisp .title, +pre .subst { + font-weight: normal +} + +pre .class .title, +pre .haskell .label, +pre .tex .command { + color: #458; + font-weight: bold +} + +pre .tag, +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword { + color: #000080; + font-weight: normal +} + +pre .attribute, +pre .variable, +pre .instancevar, +pre .lisp .body { + color: #008080 +} + +pre .regexp { + color: #009926 +} + +pre .class { + color: #458; + font-weight: bold +} + +pre .symbol, +pre .ruby .symbol .string, +pre .ruby .symbol .keyword, +pre .ruby .symbol .keymethods, +pre .lisp .keyword, +pre .tex .special, +pre .input_number { + color: #990073 +} + +pre .builtin, +pre .built_in, +pre .lisp .title { + color: #0086b3 +} + +pre .preprocessor, +pre .pi, +pre .doctype, +pre .shebang, +pre .cdata { + color: #999; + font-weight: bold +} + +pre .deletion { + background: #fdd +} + +pre .addition { + background: #dfd +} + +pre .diff .change { + background: #0086b3 +} + +pre .chunk { + color: #aaa +} + +pre .tex .formula { + opacity: 0.5; +} +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ + +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } +/* + ColorBox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;} +.cboxIframe{width:100%; height:100%; display:block; border:0;} +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;} + +/* + User Style: + Change the following styles to modify the appearance of ColorBox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:#000;} +#colorbox{} + #cboxTopLeft{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat 0 0;} + #cboxTopCenter{height:14px; background:url(colorbox/border.png) repeat-x top left;} + #cboxTopRight{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat -36px 0;} + #cboxBottomLeft{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat 0 -32px;} + #cboxBottomCenter{height:43px; background:url(colorbox/border.png) repeat-x bottom left;} + #cboxBottomRight{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat -36px -32px;} + #cboxMiddleLeft{width:14px; background:url(colorbox/controls.png) repeat-y -175px 0;} + #cboxMiddleRight{width:14px; background:url(colorbox/controls.png) repeat-y -211px 0;} + #cboxContent{background:#fff; overflow:visible;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{margin-bottom:5px;} + #cboxLoadingOverlay{background:url(colorbox/loading_background.png) no-repeat center center;} + #cboxLoadingGraphic{background:url(colorbox/loading.gif) no-repeat center center;} + #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;} + #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;} + + #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(colorbox/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;} + #cboxPrevious{left:0px; background-position: -51px -25px;} + #cboxPrevious:hover{background-position:-51px 0px;} + #cboxNext{left:27px; background-position:-75px -25px;} + #cboxNext:hover{background-position:-75px 0px;} + #cboxClose{right:0; background-position:-100px -25px;} + #cboxClose:hover{background-position:-100px 0px;} + + .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;} + .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;} + .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;} + .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} +#loading { + position: fixed; + left: 40%; + top: 50%; } + +a { + color: #333333; + text-decoration: none; } + a:hover { + color: black; + text-decoration: underline; } + +body { + font-family: "Lucida Grande", Helvetica, "Helvetica Neue", Arial, sans-serif; + padding: 12px; + background-color: #333333; } + +h1, h2, h3, h4 { + color: #1c2324; + margin: 0; + padding: 0; + margin-bottom: 12px; } + +table { + width: 100%; } + +#content { + clear: left; + background-color: white; + border: 2px solid #dddddd; + border-top: 8px solid #dddddd; + padding: 18px; + -webkit-border-bottom-left-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-topright: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; } + +.dataTables_filter, .dataTables_info { + padding: 2px 6px; } + +abbr.timeago { + text-decoration: none; + border: none; + font-weight: bold; } + +.timestamp { + float: right; + color: #dddddd; } + +.group_tabs { + list-style: none; + float: left; + margin: 0; + padding: 0; } + .group_tabs li { + display: inline; + float: left; } + .group_tabs li a { + font-family: Helvetica, Arial, sans-serif; + display: block; + float: left; + text-decoration: none; + padding: 4px 8px; + background-color: #aaaaaa; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dddddd), to(#aaaaaa)); + background: -moz-linear-gradient(#dddddd, #aaaaaa); + background: linear-gradient(#dddddd, #aaaaaa); + text-shadow: #e5e5e5 1px 1px 0px; + border-bottom: none; + color: #333333; + font-weight: bold; + margin-right: 8px; + border-top: 1px solid #efefef; + -webkit-border-top-left-radius: 2px; + -webkit-border-top-right-radius: 2px; + -moz-border-radius-topleft: 2px; + -moz-border-radius-topright: 2px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; } + .group_tabs li a:hover { + background-color: #cccccc; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#eeeeee), to(#aaaaaa)); + background: -moz-linear-gradient(#eeeeee, #aaaaaa); + background: linear-gradient(#eeeeee, #aaaaaa); } + .group_tabs li a:active { + padding-top: 5px; + padding-bottom: 3px; } + .group_tabs li.active a { + color: black; + text-shadow: white 1px 1px 0px; + background-color: #dddddd; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(white), to(#dddddd)); + background: -moz-linear-gradient(white, #dddddd); + background: linear-gradient(white, #dddddd); } + +.file_list { + margin-bottom: 18px; } + +a.src_link { + background: url("./magnify.png") no-repeat left 50%; + padding-left: 18px; } + +tr, td { + margin: 0; + padding: 0; } + +th { + white-space: nowrap; } + th.ui-state-default { + cursor: pointer; } + th span.ui-icon { + float: left; } + +td { + padding: 4px 8px; } + td.strong { + font-weight: bold; } + +.source_table h3, .source_table h4 { + padding: 0; + margin: 0; + margin-bottom: 4px; } +.source_table .header { + padding: 10px; } +.source_table pre { + margin: 0; + padding: 0; + white-space: normal; + color: black; + font-family: "Monaco", "Inconsolata", "Consolas", monospace; } +.source_table code { + color: black; + font-family: "Monaco", "Inconsolata", "Consolas", monospace; } +.source_table pre { + background-color: #333333; } + .source_table pre ol { + margin: 0px; + padding: 0px; + margin-left: 45px; + font-size: 12px; + color: white; } + .source_table pre li { + margin: 0px; + padding: 2px 6px; + border-left: 5px solid white; } + .source_table pre li code { + white-space: pre; + white-space: pre-wrap; } + .source_table pre .hits { + float: right; + margin-left: 10px; + padding: 2px 4px; + background-color: #444444; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#222222), to(#666666)); + background: -moz-linear-gradient(#222222, #666666); + background: linear-gradient(#222222, #666666); + color: white; + font-family: Helvetica, "Helvetica Neue", Arial, sans-serif; + font-size: 10px; + font-weight: bold; + text-align: center; + border-radius: 6px; } + +#footer { + color: #dddddd; + font-size: 12px; + font-weight: bold; + margin-top: 12px; + text-align: right; } + #footer a { + color: #eeeeee; + text-decoration: underline; } + #footer a:hover { + color: white; + text-decoration: none; } + +.green { + color: #009900; } + +.red { + color: #990000; } + +.yellow { + color: #ddaa00; } + +.source_table .covered { + border-color: #009900; } +.source_table .missed { + border-color: #990000; } +.source_table .never { + border-color: black; } +.source_table .skipped { + border-color: #ffcc00; } +.source_table .covered:nth-child(odd) { + background-color: #cdf2cd; } +.source_table .covered:nth-child(even) { + background-color: #dbf2db; } +.source_table .missed:nth-child(odd) { + background-color: #f7c0c0; } +.source_table .missed:nth-child(even) { + background-color: #f7cfcf; } +.source_table .never:nth-child(odd) { + background-color: #efefef; } +.source_table .never:nth-child(even) { + background-color: #f4f4f4; } +.source_table .skipped:nth-child(odd) { + background-color: #fbf0c0; } +.source_table .skipped:nth-child(even) { + background-color: #fbffcf; } + + + diff --git a/coverage/assets/0.10.2/application.js b/coverage/assets/0.10.2/application.js new file mode 100644 index 0000000000..fe65d88219 --- /dev/null +++ b/coverage/assets/0.10.2/application.js @@ -0,0 +1,1707 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ + +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="

diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 91374f8447..8bf5eec7f8 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,17 +1,20 @@ -

Products#index

-
+ <% if params[:merchant_id] %> +

Merchants Products

+ <% else %> +

Products#index

List of All Products

+ <% end %> - <% @products.each do |product| %> -
-
- <%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %> -
-

from: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %>

-
<%= number_to_currency(product.price) %>
- <% end %> -
+ <% @products.each do |product| %> +
+
+ <%= link_to image_tag('sherlock-game.jpg', alt: "display puzzle-game"), product_path(product.id) %> +
+

from: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %>

+
<%= number_to_currency(product.price) %>
+ <% end %> +
diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index a7890058cd..f1e5e8fd47 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -12,12 +12,8 @@

-
-<<<<<<< HEAD -

<%= button_to "Add to Cart", product_order_items_path( @product.id ) %>

-======= +

<%= button_to "Add to Cart", root_path %>

->>>>>>> master
From 4365a9f533ac660821cdb0dd0ac38aa11a0cdfef Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Tue, 23 Oct 2018 10:26:47 -0700 Subject: [PATCH 193/347] some changes --- app/assets/images/.DS_Store | Bin 6148 -> 6148 bytes coverage/.last_run.json | 2 +- coverage/.resultset.json | 103 +++++++++--- coverage/index.html | 308 ++++++++++++++++++------------------ 4 files changed, 239 insertions(+), 174 deletions(-) diff --git a/app/assets/images/.DS_Store b/app/assets/images/.DS_Store index e7ab71a6093bffe0dcf7c8e3eafac023ef944143..d467085c9f3bccaead0e3caf1e8fddbbbfa5fb35 100644 GIT binary patch delta 146 zcmZoMXfc=|#>B)qu~2NHo}wrV0|Nsi1A_nqLpDP^LkUA7Lo!4B=8KHW8J$5=f($7P zMGTn?dC1a0W%&%L40;S%3B`mu~2NHo}wr-0|Nsi1A_nqLn=c&LmopuLkUCt#KPr_%$xm~cCv14 iaAMrd&cV+C)UjER`8)Guei2I!pdOGWrp*B&TbKdR{t*5E diff --git a/coverage/.last_run.json b/coverage/.last_run.json index a1050b01f8..96ce0fe193 100644 --- a/coverage/.last_run.json +++ b/coverage/.last_run.json @@ -1,5 +1,5 @@ { "result": { - "covered_percent": 15.76 + "covered_percent": 82.33 } } diff --git a/coverage/.resultset.json b/coverage/.resultset.json index b96a63d76f..9294833e88 100644 --- a/coverage/.resultset.json +++ b/coverage/.resultset.json @@ -69,19 +69,13 @@ 1, 1, 1, + 1, null, 1, 1, 1, null, null, - null, - null, - null, - null, - null, - null, - null, null ], "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/order.rb": [ @@ -89,12 +83,19 @@ 1, null, 1, + null, + 1, 1, 1, 1, 1, 1, 1, + 1, + null, + 1, + 128, + null, null ], "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/models/product.rb": [ @@ -105,13 +106,20 @@ 1, null, 1, - null, 1, 1, + 1, + null, + 1, + 0, + 0, + null, null, 1, 0, 0, + 0, + 0, null, null ], @@ -156,6 +164,8 @@ 0, 0, 0, + null, + null, 0, 0, 0, @@ -197,10 +207,11 @@ ], "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/merchants_controller.rb": [ 0, - null, 0, + null, 0, 0, + null, 0, 0, 0, @@ -208,7 +219,6 @@ 0, 0, 0, - null, 0, 0, 0, @@ -219,19 +229,39 @@ 0, 0, 0, + null, + 0 + ], + "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/orders_controller.rb": [ 0, null, 0, 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, null, null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, null, null, + 0, + 0, + 0, null, null, - 0 - ], - "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/orders_controller.rb": [ + 0, 0, null, 0, @@ -239,21 +269,39 @@ null, 0, 0, - null, + 0, 0, 0, null, 0, 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, null, 0, 0, null, 0, + null, + 0, + 0, 0, null, 0, 0, + 0, + null, + null, 0 ], "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/products_controller.rb": [ @@ -367,29 +415,28 @@ "/Users/semretnicodimos/Documents/Ada_C10/Projects/betsy/app/controllers/order_items_controller.rb": [ 0, 0, - 0, - null, null, 0, 0, - 0, null, 0, 0, 0, + 0, null, 0, 0, 0, 0, + null, 0, 0, 0, 0, 0, + null, 0, 0, - null, 0, 0, null, @@ -399,8 +446,13 @@ 0, 0, 0, + null, + 0, + 0, 0, 0, + null, + 0, 0, 0, 0, @@ -408,25 +460,35 @@ null, 0, 0, + 0, null, 0, 0, + 0, + 0, null, 0, 0, 0, 0, 0, + null, + 0, 0, 0, 0, 0, null, + 0, + 0, + 0, + 0, null, 0, 0, 0, 0, + 0, null, 0, 0, @@ -434,6 +496,9 @@ 0, 0, 0, + null, + 0, + 0, 0, 0 ], @@ -492,7 +557,7 @@ 0 ] }, - "timestamp": 1540226131 + "timestamp": 1540273383 }, "MiniTest": { "coverage": { diff --git a/coverage/index.html b/coverage/index.html index ded5b27a7f..866b1abbeb 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -14,7 +14,7 @@ loading From a38a02176b461b234451a10c82644f599f6c9b72 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Tue, 23 Oct 2018 11:16:44 -0700 Subject: [PATCH 202/347] comment out auth callback path --- app/views/layouts/application.html.erb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index ef77a945ed..b6a81ed89a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,8 +27,6 @@ From cb77182766b267cce922515b10afdbb6ce5998c6 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Tue, 23 Oct 2018 11:21:20 -0700 Subject: [PATCH 203/347] working on login functionality --- app/assets/stylesheets/application.scss | 1 + app/views/layouts/application.html.erb | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 9dad4ba1f8..6a983425c9 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -83,6 +83,7 @@ footer{ display: flex; width: 100%; padding: 10px; + margin-top: 50px; justify-content: center; align-items: center; background-color: rgb(226, 226, 226); diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index b6a81ed89a..9261c59886 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,6 +27,8 @@ From facf2606bc7b984e471eb4e8ba2f37e9ecee13e0 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Tue, 23 Oct 2018 11:30:10 -0700 Subject: [PATCH 204/347] add github to authorization path --- app/views/layouts/application.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9261c59886..1026fca25d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -28,7 +28,7 @@ <% if @current_merchant %> <%= link_to "Log Out", '/sessions/logout' %> <% else %> - <%= link_to "Log In", auth_callback_path %> + <%= link_to "Log In", auth_callback_path('github') %> <% end %> From de6ad90b84c6cc675f4d12509ae2707a53e3d3bf Mon Sep 17 00:00:00 2001 From: Amber Lynn Date: Tue, 23 Oct 2018 11:37:38 -0700 Subject: [PATCH 205/347] Added css to product index page --- app/assets/stylesheets/products.scss | 14 ++++++++++++++ app/views/products/index.html.erb | 11 ++++++----- app/views/products/show.html.erb | 4 +--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 89e2e8db07..29d2c565da 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -1,3 +1,17 @@ // Place all the styles related to the products controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ +.flex-container { + display: flex; + flex-wrap: wrap; +} + +.image-tag { + border: 2px solid red; + width: 200px; + height: 200px; +} + +.product-info { + +} diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 75b53eed3c..b6acd64895 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -9,11 +9,12 @@ <% @products.each do |product| %>
-
- <%= link_to product_path(product.id) %> -
-

from: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %>

-
<%= number_to_currency(product.price) %>
+
+
+ <%= link_to image_tag("#{product.image}", :class => 'image-tag'), product_path(product.id) %> +
+
+

by: <%= link_to product.merchant.username, merchant_path(product.merchant_id) %>

<%= number_to_currency(product.price) %>

<% end %>
diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index f1e5e8fd47..356f89c6b2 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,5 +1,3 @@ -<%= image_tag "sherlock-game.jpg", alt: "sherlock game", class: "sherlock-cover-image" %> -

<%= @product.name %>

@@ -12,7 +10,7 @@

-
+

<%= button_to "Add to Cart", root_path %>

From cd34706b63b4143414cc0826ceb80ea1e34fda14 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Tue, 23 Oct 2018 11:58:20 -0700 Subject: [PATCH 206/347] changed index and show test for order and controller --- app/controllers/application_controller.rb | 4 ++ app/controllers/orders_controller.rb | 37 +++++++------ test/controllers/orders_controller_test.rb | 60 ++++++++++------------ test/fixtures/orders.yml | 13 ++++- 4 files changed, 65 insertions(+), 49 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5b5a455bee..02d2d21908 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -44,6 +44,10 @@ def find_product return Product.find_by(id: params[:id]) end + def find_order + return Order.find_by(id: params[:id]) + end + def render_404 render file: "/public/404.html", status: 404 end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index c7851f6f76..150eeb9ae2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,28 +1,35 @@ class OrdersController < ApplicationController - + skip_before_action :require_login def index - order_items = [] - if @shopping_cart - @shopping_cart.order_items.each do |order_item| - order_items << order_item - end - end - return order_items + # # @orders = Order.all + # order_items = [] + # if @shopping_cart + # @shopping_cart.order_items.each do |order_item| + # order_items << order_item + # end + # end + # return order_items end def show - order_items = [] - paid_order = Order.find_by(id: params[:id]) - paid_order.order_items.each do |order_item| - order_items << order_item + @order = find_order + if @order.nil? + render_404 end - return order_items end def edit - return @shopping_cart + @shopping_cart = find_shopping_cart + if @order.order_items.nil? + redirect_to cart_path + return + end + + if @order.nil? + render_404 + end end @@ -66,5 +73,5 @@ def billing_params params.require(:order).permit(:email, :mailing_address, :cc, :cc_name, :cc_expiration, :cvv, :zip) end - + end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 6a7367d1cc..66cb8dcd95 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,12 +1,15 @@ require "test_helper" +require 'pry' describe OrdersController do - let(:bad_order_id) { Order.first.destroy.id } + let(:order_one) {orders(:one)} + let(:order_three) {orders(:three)} + describe "index" do it "should get index" do # Act - get orders_path + get cart_path # Assert must_respond_with :success @@ -64,46 +67,39 @@ describe "show" do - it "should respond with success for showing an existing order" do - # Arrange + it "should respond with success for showing an existing order with order_items " do existing_order = orders(:one) - - # Act get order_path(existing_order.id) - - # Assert must_respond_with :success end + it "should respond with not found for showing a non-existing order" do - # Arrange - # order = orders(:poodr) - # id = order.id + order = orders(:two) + + order.order_items.destroy_all + order.destroy - # get order_path(id) - # must_respond_with :success - # - # - # order.destroy + get order_path(order.id) + must_respond_with :not_found + end - # Act - get order_path(bad_order_id) - # Assert - must_respond_with :missing - end end describe "edit" do + it "responds with success for an existing order" do - get edit_order_path(Order.first) + get checkout_path(Order.first) + must_respond_with :success end it "responds with not_found for a order that D.N.E." do - get edit_order_path(bad_order_id) - must_respond_with :not_found + get checkout_path(bad_order) + + must_respond_with :redirect end end @@ -132,14 +128,14 @@ # ) end - it "responds with not_found if the order doesn't exist" do - id = bad_order_id - expect { - delete order_path(id) - }.wont_change('Book.count') - - must_respond_with :not_found - end + # it "responds with not_found if the order doesn't exist" do + # id = bad_order_id + # expect { + # delete order_path(id) + # }.wont_change('Book.count') + # + # must_respond_with :not_found + # end end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 3f5cc4a664..6534880153 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -5,7 +5,7 @@ one: mailing_address: 12345 A Street cc: 1234123412341234 cc_name: Aaa Aaaaaa - cc_expiration: 22/22 + cc_expiration: 10/22 cvv: 123 zip: 12345 @@ -14,6 +14,15 @@ two: mailing_address: 90 Z Ave cc: 1111222233334444 cc_name: Zebra Zee - cc_expiration: 99/99 + cc_expiration: 12/20 + cvv: 100 + zip: 50100 + +three: + email: s@zmail.com + mailing_address: 1120 Z Ave + cc: 1111222233334444 + cc_name: Lion Zee + cc_expiration: 10/23 cvv: 100 zip: 50100 From bcbe983956c31962f269f341e59104ec9959d6b5 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Tue, 23 Oct 2018 12:10:03 -0700 Subject: [PATCH 207/347] fix typo in application.html.erb --- app/views/layouts/application.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 1026fca25d..763e411762 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -18,7 +18,7 @@
<% if @current_merchant %> - Hello, <%= @current_mercant.username %> + Hello, <%= @current_merchant.username %> <% else %> Hello, Guest <% end %> @@ -28,7 +28,7 @@ <% if @current_merchant %> <%= link_to "Log Out", '/sessions/logout' %> <% else %> - <%= link_to "Log In", auth_callback_path('github') %> + <%= link_to "Log In", '/auth/github' %> <% end %>
From f56486c63d20455d719d22e6d479a76c250e76a7 Mon Sep 17 00:00:00 2001 From: Semret Nicodimos Date: Tue, 23 Oct 2018 12:12:05 -0700 Subject: [PATCH 208/347] added status to yml file in order and changed order csv file --- db/seed_data/orders.csv | 4 ++-- test/fixtures/orders.yml | 17 ++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/db/seed_data/orders.csv b/db/seed_data/orders.csv index 83151b3365..4d08addcf4 100644 --- a/db/seed_data/orders.csv +++ b/db/seed_data/orders.csv @@ -1,7 +1,7 @@ email,mailing_address,cc,cc_name,cc_expiration,cvv,zip,status -someone@mail.com,1234 S main St Seattle WA 98134,1234567890123456,Samantha Smith,11/20,567,98134,cart +someone@mail.com,1234 S main St Seattle WA 98134,1234567890123456,Samantha Smith,11/20,567,98134,paid secondone@mail.com,5432 S Republican St Seattle WA 98174,9876543212345678,Ben Tyler,11/22,765,98174,completed another@mail.com,5432 S Republican St Seattle WA 98174,9876543212345678,Ben Tyler,11/22,765,98174,paid fourthperson@mail.com,4564 S Roy St Seattle WA 98184,9876543212345678,Clementin Blue,12/22,509,98184,completed person_sam@mail.com,7282 S Smith St Seattle WA 98184,9876543216789654,Lula Ross,12/23,344,98184,canceled -person_chris@mail.com,7282 N Alabama St Portland OR 94568,9876543216789654,Chris Roberts,09/23,231,94568,cart +person_chris@mail.com,7282 N Alabama St Portland OR 94568,9876543216789654,Chris Roberts,09/23,231,94568,paid diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 6534880153..1f8b363c67 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -8,6 +8,7 @@ one: cc_expiration: 10/22 cvv: 123 zip: 12345 + status: paid two: email: z@zmail.com @@ -17,12 +18,14 @@ two: cc_expiration: 12/20 cvv: 100 zip: 50100 + status: completed three: - email: s@zmail.com - mailing_address: 1120 Z Ave - cc: 1111222233334444 - cc_name: Lion Zee - cc_expiration: 10/23 - cvv: 100 - zip: 50100 + email: nil + mailing_address: nil + cc: nil + cc_name: nil + cc_expiration: nil + cvv: nil + zip: nil + status: cart From 18045adcd14d9b262285064a1a19d84b00a6711b Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Tue, 23 Oct 2018 12:19:04 -0700 Subject: [PATCH 209/347] logout add method: 'post' --- app/views/layouts/application.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 763e411762..aab1eb26b7 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -26,7 +26,7 @@