Commit afc87021

mo <mo.khan@gmail.com>
2017-09-23 15:13:29
upgrade specs
1 parent 49ee70b
app/controllers/application_controller.rb
@@ -23,7 +23,7 @@ class ApplicationController < ActionController::Base
   private
 
   def load_header
-    @categories = Rails.cache.fetch(:categories) { Category.all }
+    @categories = Category.all
   end
 
   def authenticate!
config/environments/test.rb
@@ -13,9 +13,11 @@ Rails.application.configure do
   config.eager_load = false
 
   # Configure static asset server for tests with Cache-Control for performance.
-  config.serve_static_files  = true
+  config.public_file_server.enabled  = true
 
-  config.static_cache_control = "public, max-age=3600"
+  config.public_file_server.headers = {
+    'Cache-Control' => "public, max-age=3600"
+  }
 
   # Show full error reports and disable caching.
   config.consider_all_requests_local       = true
config/initializers/rack_attack.rb
@@ -1,12 +1,12 @@
 # Always allow requests from localhost
 # (blacklist & throttles are skipped)
-Rack::Attack.whitelist('allow from localhost') do |request|
+Rack::Attack.safelist('allow from localhost') do |request|
   # Requests are allowed if the return value is truthy
   '127.0.0.1' == request.ip
 end
 
 # Throttle requests to 5 requests per second per ip
-Rack::Attack.throttle('req/ip', :limit => 5, :period => 1.second) do |request|
+Rack::Attack.throttle('req/ip', limit: 5, period: 1.second) do |request|
   # If the return value is truthy, the cache key for the return value
   # is incremented and compared with the limit. In this case:
   #   "rack::attack:#{Time.now.to_i/1.second}:req/ip:#{req.ip}"
db/migrate/20170923150621_add_photos_count_to_users.rb
@@ -0,0 +1,5 @@
+class AddPhotosCountToUsers < ActiveRecord::Migration[5.0]
+  def change
+    add_column :users, :photos_count, :integer, default: 0
+  end
+end
db/schema.rb
@@ -1,4 +1,3 @@
-# encoding: UTF-8
 # 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.
@@ -11,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20170831205234) do
+ActiveRecord::Schema.define(version: 20170923150621) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -23,12 +22,11 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.integer  "user_id",      null: false
     t.datetime "created_at",   null: false
     t.datetime "updated_at",   null: false
+    t.index ["subject_id"], name: "index_activities_on_subject_id", using: :btree
+    t.index ["subject_type"], name: "index_activities_on_subject_type", using: :btree
+    t.index ["user_id"], name: "index_activities_on_user_id", using: :btree
   end
 
-  add_index "activities", ["subject_id"], name: "index_activities_on_subject_id", using: :btree
-  add_index "activities", ["subject_type"], name: "index_activities_on_subject_type", using: :btree
-  add_index "activities", ["user_id"], name: "index_activities_on_user_id", using: :btree
-
   create_table "avatars", force: :cascade do |t|
     t.integer  "user_id"
     t.datetime "created_at"
@@ -36,19 +34,17 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.string   "avatar"
     t.boolean  "avatar_processing"
     t.string   "avatar_tmp"
+    t.index ["user_id"], name: "index_avatars_on_user_id", using: :btree
   end
 
-  add_index "avatars", ["user_id"], name: "index_avatars_on_user_id", using: :btree
-
   create_table "categories", force: :cascade do |t|
     t.string   "name"
     t.datetime "created_at"
     t.datetime "updated_at"
     t.string   "slug"
+    t.index ["slug"], name: "index_categories_on_slug", using: :btree
   end
 
-  add_index "categories", ["slug"], name: "index_categories_on_slug", using: :btree
-
   create_table "comments", force: :cascade do |t|
     t.integer  "user_id"
     t.integer  "creation_id"
@@ -56,11 +52,10 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.integer  "disqus_id"
     t.datetime "created_at"
     t.datetime "updated_at"
+    t.index ["creation_id"], name: "index_comments_on_creation_id", using: :btree
+    t.index ["user_id"], name: "index_comments_on_user_id", using: :btree
   end
 
-  add_index "comments", ["creation_id"], name: "index_comments_on_creation_id", using: :btree
-  add_index "comments", ["user_id"], name: "index_comments_on_user_id", using: :btree
-
   create_table "creations", force: :cascade do |t|
     t.string   "name"
     t.text     "story"
@@ -72,12 +67,11 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.integer  "photos_count",    default: 0
     t.integer  "favorites_count", default: 0
     t.integer  "category_id"
+    t.index ["category_id"], name: "index_creations_on_category_id", using: :btree
+    t.index ["created_at"], name: "index_creations_on_created_at", using: :btree
+    t.index ["user_id"], name: "index_creations_on_user_id", using: :btree
   end
 
-  add_index "creations", ["category_id"], name: "index_creations_on_category_id", using: :btree
-  add_index "creations", ["created_at"], name: "index_creations_on_created_at", using: :btree
-  add_index "creations", ["user_id"], name: "index_creations_on_user_id", using: :btree
-
   create_table "delayed_jobs", force: :cascade do |t|
     t.integer  "priority",   default: 0
     t.integer  "attempts",   default: 0
@@ -90,27 +84,25 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.string   "queue"
     t.datetime "created_at"
     t.datetime "updated_at"
+    t.index ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree
   end
 
-  add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree
-
   create_table "favorites", force: :cascade do |t|
     t.integer  "user_id"
     t.integer  "creation_id"
     t.datetime "created_at"
     t.datetime "updated_at"
+    t.index ["creation_id"], name: "index_favorites_on_creation_id", using: :btree
+    t.index ["user_id"], name: "index_favorites_on_user_id", using: :btree
   end
 
-  add_index "favorites", ["creation_id"], name: "index_favorites_on_creation_id", using: :btree
-  add_index "favorites", ["user_id"], name: "index_favorites_on_user_id", using: :btree
-
   create_table "interests", force: :cascade do |t|
     t.string   "name"
     t.datetime "created_at"
     t.datetime "updated_at"
   end
 
-  create_table "locations", id: :uuid, default: "uuid_generate_v4()", force: :cascade do |t|
+  create_table "locations", id: :uuid, default: -> { "uuid_generate_v4()" }, force: :cascade do |t|
     t.uuid     "locatable_id"
     t.string   "locatable_type"
     t.string   "latitude"
@@ -119,10 +111,9 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.string   "country"
     t.datetime "created_at"
     t.datetime "updated_at"
+    t.index ["locatable_id", "locatable_type"], name: "index_locations_on_locatable_id_and_locatable_type", using: :btree
   end
 
-  add_index "locations", ["locatable_id", "locatable_type"], name: "index_locations_on_locatable_id_and_locatable_type", using: :btree
-
   create_table "photos", force: :cascade do |t|
     t.integer  "imageable_id"
     t.string   "image"
@@ -137,11 +128,10 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.string   "sha256"
     t.string   "watermark"
     t.string   "imageable_type"
+    t.index ["imageable_id", "imageable_type"], name: "index_photos_on_imageable_id_and_imageable_type", using: :btree
+    t.index ["imageable_id"], name: "index_photos_on_imageable_id", using: :btree
   end
 
-  add_index "photos", ["imageable_id", "imageable_type"], name: "index_photos_on_imageable_id_and_imageable_type", using: :btree
-  add_index "photos", ["imageable_id"], name: "index_photos_on_imageable_id", using: :btree
-
   create_table "taggings", force: :cascade do |t|
     t.integer  "tag_id"
     t.integer  "taggable_id"
@@ -150,37 +140,34 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.string   "tagger_type"
     t.string   "context",       limit: 128
     t.datetime "created_at"
+    t.index ["context"], name: "index_taggings_on_context", using: :btree
+    t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree
+    t.index ["tag_id"], name: "index_taggings_on_tag_id", using: :btree
+    t.index ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
+    t.index ["taggable_id", "taggable_type", "tagger_id", "context"], name: "taggings_idy", using: :btree
+    t.index ["taggable_id"], name: "index_taggings_on_taggable_id", using: :btree
+    t.index ["taggable_type"], name: "index_taggings_on_taggable_type", using: :btree
+    t.index ["tagger_id", "tagger_type"], name: "index_taggings_on_tagger_id_and_tagger_type", using: :btree
+    t.index ["tagger_id"], name: "index_taggings_on_tagger_id", using: :btree
+    t.index ["tagger_type"], name: "index_taggings_on_tagger_type", using: :btree
   end
 
-  add_index "taggings", ["context"], name: "index_taggings_on_context", using: :btree
-  add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree
-  add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree
-  add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
-  add_index "taggings", ["taggable_id", "taggable_type", "tagger_id", "context"], name: "taggings_idy", using: :btree
-  add_index "taggings", ["taggable_id"], name: "index_taggings_on_taggable_id", using: :btree
-  add_index "taggings", ["taggable_type"], name: "index_taggings_on_taggable_type", using: :btree
-  add_index "taggings", ["tagger_id", "tagger_type"], name: "index_taggings_on_tagger_id_and_tagger_type", using: :btree
-  add_index "taggings", ["tagger_id"], name: "index_taggings_on_tagger_id", using: :btree
-  add_index "taggings", ["tagger_type"], name: "index_taggings_on_tagger_type", using: :btree
-
   create_table "tags", force: :cascade do |t|
     t.string  "name"
     t.integer "taggings_count", default: 0
+    t.index ["name"], name: "index_tags_on_name", unique: true, using: :btree
   end
 
-  add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree
-
   create_table "tools", force: :cascade do |t|
     t.string   "name",        null: false
     t.text     "description"
     t.string   "asin",        null: false
     t.datetime "created_at"
     t.datetime "updated_at"
+    t.index ["asin"], name: "index_tools_on_asin", using: :btree
+    t.index ["name"], name: "index_tools_on_name", unique: true, using: :btree
   end
 
-  add_index "tools", ["asin"], name: "index_tools_on_asin", using: :btree
-  add_index "tools", ["name"], name: "index_tools_on_name", unique: true, using: :btree
-
   create_table "tutorials", force: :cascade do |t|
     t.string   "heading"
     t.text     "description"
@@ -191,11 +178,10 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.string   "image_url"
     t.string   "author"
     t.string   "author_url"
+    t.index ["user_id"], name: "index_tutorials_on_user_id", using: :btree
   end
 
-  add_index "tutorials", ["user_id"], name: "index_tutorials_on_user_id", using: :btree
-
-  create_table "user_sessions", id: :uuid, default: "uuid_generate_v4()", force: :cascade do |t|
+  create_table "user_sessions", id: :uuid, default: -> { "uuid_generate_v4()" }, force: :cascade do |t|
     t.integer  "user_id"
     t.datetime "created_at"
     t.datetime "updated_at"
@@ -204,13 +190,12 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.text     "user_agent"
     t.datetime "accessed_at"
     t.datetime "revoked_at"
+    t.index ["accessed_at"], name: "index_user_sessions_on_accessed_at", using: :btree
+    t.index ["key"], name: "index_user_sessions_on_key", using: :btree
+    t.index ["revoked_at"], name: "index_user_sessions_on_revoked_at", using: :btree
+    t.index ["user_id"], name: "index_user_sessions_on_user_id", using: :btree
   end
 
-  add_index "user_sessions", ["accessed_at"], name: "index_user_sessions_on_accessed_at", using: :btree
-  add_index "user_sessions", ["key"], name: "index_user_sessions_on_key", using: :btree
-  add_index "user_sessions", ["revoked_at"], name: "index_user_sessions_on_revoked_at", using: :btree
-  add_index "user_sessions", ["user_id"], name: "index_user_sessions_on_user_id", using: :btree
-
   create_table "users", force: :cascade do |t|
     t.string   "email",                  default: "", null: false
     t.string   "password_digest",        default: "", null: false
@@ -227,18 +212,17 @@ ActiveRecord::Schema.define(version: 20170831205234) do
     t.string   "full_address"
     t.integer  "creations_count",        default: 0
     t.boolean  "admin"
+    t.integer  "photos_count",           default: 0
+    t.index ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
+    t.index ["created_at"], name: "index_users_on_created_at", using: :btree
+    t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
+    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
   end
 
-  add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
-  add_index "users", ["created_at"], name: "index_users_on_created_at", using: :btree
-  add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
-  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
-
   create_table "users_interests", id: false, force: :cascade do |t|
     t.integer "user_id"
     t.integer "interest_id"
+    t.index ["interest_id", "user_id"], name: "index_users_interests_on_interest_id_and_user_id", using: :btree
   end
 
-  add_index "users_interests", ["interest_id", "user_id"], name: "index_users_interests_on_interest_id_and_user_id", using: :btree
-
 end
spec/controllers/admin/photos_controller_spec.rb
@@ -14,7 +14,7 @@ module Admin
       it "re-processes the photo" do
         allow(ReProcessPhotoJob).to receive(:perform_later)
 
-        put :update, id: photo.id
+        put :update, params: { id: photo.id }
 
         expect(ReProcessPhotoJob).to have_received(:perform_later).with(photo)
       end
spec/controllers/admin/products_controller_spec.rb
@@ -20,7 +20,7 @@ module Admin
         product = "product"
         allow(product_api).to receive(:find).with(asin).and_return(product)
 
-        get :show, id: asin
+        get :show, params: { id: asin }
 
         expect(assigns(:product)).to eql(product)
       end
@@ -29,14 +29,14 @@ module Admin
         let(:tool) { create(:tool) }
 
         it "loads the tool" do
-          get :show, id: tool.asin
+          get :show, params: { id: tool.asin }
           expect(assigns(:tool)).to eql(tool)
         end
       end
 
       context "when the tool is not in the toolbox" do
         it "does not load a tool" do
-          get :show, id: "not_added"
+          get :show, params: { id: "not_added" }
           expect(assigns(:tool)).to be_nil
         end
       end
@@ -44,7 +44,7 @@ module Admin
 
     describe "#create" do
       it "creates new tool" do
-        post :create, {:name=>"pan", :asin=>"34234"}
+        post :create, params: { name: "pan", asin: "34234" }
 
         expect(Tool.count).to eql(1)
         expect(Tool.first.name).to eql("pan")
@@ -52,7 +52,7 @@ module Admin
       end
 
       it "redirects back to the detail page" do
-        post :create, {name: 'blah', asin: 'blah' }
+        post :create, params: { name: 'blah', asin: 'blah' }
         expect(response).to redirect_to(admin_product_path('blah'))
       end
     end
spec/controllers/admin/sessions_controller_spec.rb
@@ -24,7 +24,7 @@ module Admin
         before :each do
           allow(UserSession).to receive(:find).with(user_session.id).and_return(user_session)
           allow(user_session).to receive(:revoke!).and_return(true)
-          delete :destroy, id: user_session.id
+          delete :destroy, params: { id: user_session.id }
         end
 
         it "revokes the specified session" do
spec/controllers/admin/users_controller_spec.rb
@@ -21,7 +21,7 @@ module Admin
         repository = double
         allow(controller).to receive(:repository).and_return(repository)
         allow(repository).to receive(:search_with).and_return([matching_user])
-        get :index, q: 'mo'
+        get :index, params: { q: 'mo' }
         expect(assigns(:users)).to include(matching_user)
       end
     end
@@ -30,7 +30,7 @@ module Admin
       let!(:user) { create(:user) }
 
       it "loads the details on the specific user" do
-        get :show, id: user.id
+        get :show, params: { id: user.id }
         expect(assigns(:user)).to eql(user)
       end
     end
spec/controllers/api/v1/cakes_controller_spec.rb
@@ -16,7 +16,7 @@ describe Api::V1::CakesController do
 
       before :each do
         user.creations << my_cake
-        xhr :get, :index
+        get :index, xhr: true
       end
 
       it "returns all of my cakes" do
@@ -33,7 +33,7 @@ describe Api::V1::CakesController do
 
       before :each do
         user.creations << cake
-        xhr :get, :show, id: cake.id
+        get :show, params: { id: cake.id }, xhr: true
       end
 
       it "loads a specific cake" do
@@ -45,7 +45,7 @@ describe Api::V1::CakesController do
       let(:category) { create(:category) }
 
       it "creates a new project" do
-        xhr :post, :create, cake: { name: "new-cake", category_id: category.id }
+        post :create, params: { cake: { name: "new-cake", category_id: category.id } }, xhr: true
 
         expect(Creation.count).to eql(1)
         expect(Creation.first.name).to eql("new-cake")
@@ -59,7 +59,7 @@ describe Api::V1::CakesController do
 
       it "tags the cake" do
         tags = ["cake", "cookies", "yummy"]
-        xhr :patch, :update, id: cake.id, cake: { tags: tags.join(", ") }
+        patch :update, params: { id: cake.id, cake: { tags: tags.join(", ") } }, xhr: true
 
         cake.reload
         expect(cake.tags.pluck(:name)).to match_array(tags)
@@ -67,7 +67,7 @@ describe Api::V1::CakesController do
 
       it "updates the description" do
         new_story = "what is the haps on the craps"
-        xhr :patch, :update, id: cake.id, cake: { story: new_story }
+        patch :update, params: { id: cake.id, cake: { story: new_story } }, xhr: true
 
         cake.reload
         expect(cake.story).to eql(new_story)
@@ -75,7 +75,7 @@ describe Api::V1::CakesController do
 
       it "updates the category" do
         category = create(:category)
-        xhr :patch, :update, id: cake.id, cake: { category_id: category.id }
+        patch :update, params: { id: cake.id, cake: { category_id: category.id } }, xhr: true
 
         cake.reload
         expect(cake.category).to eql(category)
@@ -87,7 +87,7 @@ describe Api::V1::CakesController do
 
       before :each do
         user.creations << cake
-        xhr :delete, :destroy, id: cake.id
+        delete :destroy, params: { id: cake.id }, xhr: true
       end
 
       it "deletes the specified cake" do
spec/controllers/api/v1/categories_controller_spec.rb
@@ -7,7 +7,7 @@ module Api
 
       describe "#index" do
         it 'loads all the categories' do
-          xhr :get, :index
+          get :index, xhr: true
           expect(assigns(:categories)).to match_array(Category.all)
         end
       end
spec/controllers/api/v1/logins_controller_spec.rb
@@ -7,7 +7,7 @@ describe Api::V1::LoginsController do
     let(:user) { create(:user) }
 
     it "returns the auth token" do
-      post :create, { email: user.email, password: 'password' }
+      post :create, params: { email: user.email, password: 'password' }, xhr: true
       expected_json = { auth_token: user.authentication_token }.to_json
       expect(response.body).to eql(expected_json)
     end
@@ -16,7 +16,9 @@ describe Api::V1::LoginsController do
   context "when logging in with invalid credentials" do
     let(:user) { create(:user) }
 
-    before { post :create, { email: user.email, password: user.password.reverse } }
+    before do
+      post :create, params: { email: user.email, password: user.password.reverse }, xhr: true
+    end
 
     it "returns an empty auth token" do
       expect(response.body).to eql({ auth_token: "" }.to_json)
spec/controllers/api/v1/photos_controller_spec.rb
@@ -14,7 +14,7 @@ module Api
 
       describe "#index" do
         it "loads the cakes photos" do
-          xhr :get, :index, cake_id: cake.id
+          get :index, params: { cake_id: cake.id }, xhr: true
           expect(assigns(:photos)).to match_array(cake.photos)
         end
       end
@@ -23,7 +23,7 @@ module Api
         let(:photo) { create(:photo, imageable: cake) }
 
         it "loads the photo" do
-          xhr :get, :show, cake_id: cake.id, id: photo.id
+          get :show, params: { cake_id: cake.id, id: photo.id }, xhr: true
           expect(assigns(:photo)).to eql(photo)
         end
       end
@@ -34,7 +34,7 @@ module Api
         it "attaches a new photo to a cake" do
           allow(ProcessPhotoJob).to receive(:perform_later)
 
-          xhr :post, :create, cake_id: cake.id, watermark: "watery", image: file
+          post :create, params: { cake_id: cake.id, watermark: "watery", image: file }, xhr: true
 
           cake.reload
           expect(cake.photos.count).to eql(1)
spec/controllers/api/v1/profiles_controller_spec.rb
@@ -12,7 +12,7 @@ module Api
 
       describe "#show" do
         it "loads the current users profile" do
-          xhr :get, :show, id: "me"
+          get :show, params: { id: "me" }, xhr: true
           expect(assigns(:profile)).to eql(user)
         end
       end
@@ -28,7 +28,7 @@ module Api
             facebook: "facebookie",
           }
 
-          xhr :patch, :update, id: "me", profile: new_attributes
+          patch :update, params: { id: "me", profile: new_attributes }, xhr: true
 
           user.reload
           expect(user.name).to eql("new name")
@@ -40,7 +40,7 @@ module Api
         end
 
         it "returns errors" do
-          xhr :patch, :update, id: "me", profile: { email: "" }
+          patch :update, params: { id: "me", profile: { email: "" } }, xhr: true
           json = JSON.parse(response.body)
           expect(json["email"]).to_not be_empty
         end
spec/controllers/api/v1/tutorials_controller_spec.rb
@@ -13,7 +13,7 @@ describe Api::V1::TutorialsController do
     let!(:other_tutorial) { create(:tutorial) }
 
     it "returns the users tutorials" do
-      xhr :get, :index
+      get :index, xhr: true
       expect(assigns(:tutorials)).to match_array([my_tutorial])
     end
   end
@@ -27,7 +27,7 @@ describe Api::V1::TutorialsController do
         description: "Connect with your friends - and other fascinating people",
         tags: "cake,cookie",
       }
-      xhr :post, :create, tutorial: attributes
+      post :create, params: { tutorial: attributes }, xhr: true
 
       expect(assigns(:tutorial)).to be_present
       expect(assigns(:tutorial).url).to eql(attributes[:url])
spec/controllers/api/v2/cakes_controller_spec.rb
@@ -7,27 +7,27 @@ module Api
 
       describe "#index" do
         let!(:cakes) { create(:category, slug: "cakes") }
-        let!(:cookies) { create(:category, slug: "cookies") }
+        let!(:cookies_category) { create(:category, slug: "cookies") }
         let!(:cake) { create(:published_cake, name: "cake", category: cakes) }
         let!(:cookie) do
-          create(:published_cake, name: "cookie", category: cookies)
+          create(:published_cake, name: "cookie", category: cookies_category)
         end
         let!(:unpublished_cake) do
           create(:cake, name: "unpublished", category: cakes)
         end
 
         it "returns all published cakes" do
-          xhr :get, :index
+          get :index, xhr: true
           expect(assigns(:cakes)).to match_array([cake, cookie])
         end
 
         it "returns all cakes in the category" do
-          xhr :get, :index, category: cookie.category.slug
+          get :index, params: { category: cookie.category.slug }, xhr: true
           expect(assigns(:cakes)).to match_array([cookie])
         end
 
         it "returns all cakes matching the search query" do
-          xhr :get, :index, q: cake.name[0..2]
+          get :index, params: { q: cake.name[0..2] }, xhr: true
           expect(assigns(:cakes)).to match_array([cake])
         end
 
@@ -35,7 +35,7 @@ module Api
           cake.tag_list = "cakes"
           cake.save!
 
-          xhr :get, :index, tags: "cakes"
+          get :index, params: { tags: "cakes" }, xhr: true
           expect(assigns(:cakes)).to match_array([cake])
         end
       end
@@ -44,7 +44,7 @@ module Api
         let!(:cake) { create(:published_cake) }
 
         it "loads the cake" do
-          xhr :get, :show, id: cake.id
+          get :show, params: { id: cake.id }, xhr: true
           expect(assigns(:cake)).to eql(cake)
         end
       end
spec/controllers/api/v2/categories_controller_spec.rb
@@ -9,7 +9,7 @@ module Api
         let!(:category) { create(:category) }
 
         it "loads all the categories" do
-          xhr :get, :index
+          get :index, xhr: true
           expect(assigns(:categories)).to match_array([category])
         end
       end
@@ -19,7 +19,7 @@ module Api
         let!(:category) { create(:category) }
 
         it "loads the specified category" do
-          xhr :get, :show, id: category.id
+          get :show, params: { id: category.id }, xhr: true
           expect(assigns(:category)).to eql(category)
         end
       end
spec/controllers/api/v2/photos_controller_spec.rb
@@ -10,7 +10,7 @@ module Api
         let!(:unprocessed_photo) { create(:photo, image_processing: true) }
 
         it "loads all processed photos" do
-          xhr :get, :index
+          get :index, xhr: true
           expect(assigns(:photos)).to match_array([processed_photo])
         end
       end
@@ -20,7 +20,7 @@ module Api
         let!(:photo) { create(:photo) }
 
         it "loads the specified photo" do
-          xhr :get, :show, id: photo.id
+          get :show, params: { id: photo.id }, xhr: true
           expect(assigns(:photo)).to eql(photo)
         end
       end
spec/controllers/api/v2/tutorials_controller_spec.rb
@@ -9,7 +9,7 @@ module Api
         let!(:tutorial) { create(:tutorial) }
 
         before :each do
-          xhr :get, :index
+          get :index, xhr: true
         end
 
         it "loads all the tutorials" do
@@ -33,7 +33,7 @@ module Api
         let!(:tutorial) { create(:tutorial) }
 
         it "loads the single tutorial" do
-          xhr :get, :show, id: tutorial.id
+          get :show, params: { id: tutorial.id }, xhr: true
           expect(assigns(:tutorial)).to eql(tutorial)
         end
       end
spec/controllers/api/v2/users_controller_spec.rb
@@ -9,7 +9,7 @@ module Api
         let!(:user) { create(:user) }
 
         it "loads all users" do
-          xhr :get, :index
+          get :index, xhr: true
           expect(assigns(:users)).to match_array([user])
         end
       end
@@ -18,7 +18,7 @@ module Api
         let!(:user) { create(:user) }
 
         it "loads the info on the user" do
-          xhr :get, :show, id: user.id
+          get :show, params: { id: user.id }, xhr: true
           expect(assigns(:user)).to eql(user)
         end
       end
spec/controllers/my/avatars_controller_spec.rb
@@ -10,7 +10,7 @@ describe My::AvatarsController do
       context "when uploading a new avatar" do
         let(:image) { Rack::Test::UploadedFile.new('spec/fixtures/images/gorilla.jpg', 'image/jpeg') }
 
-        before { post :create, photo: { image: image } }
+        before { post :create, params: { photo: { image: image } } }
 
         it "saves the new avatar" do
           user.reload
@@ -29,7 +29,7 @@ describe My::AvatarsController do
     end
 
     describe "#new" do
-      before { get :new, id: user.id }
+      before { get :new, params: { id: user.id } }
 
       it "displays the current avatar" do
         expect(assigns(:avatar)).to_not be_nil
spec/controllers/my/passwords_controller_spec.rb
@@ -6,7 +6,7 @@ describe My::PasswordsController do
       let(:user) { create(:user) }
 
       it "redirects you to the login page" do
-        put :update, id: user.id
+        put :update, params: { id: user.id }
         expect(response).to redirect_to(login_path)
       end
     end
@@ -18,9 +18,12 @@ describe My::PasswordsController do
 
       context "when the new password and the confirmation password does not match" do
         before :each do
-          put :update, id: user.id, user: {
-            password: "foobar",
-            password_confirmation: "barfoo"
+          put :update, params: {
+            id: user.id,
+            user: {
+              password: "foobar",
+              password_confirmation: "barfoo"
+            }
           }
         end
 
@@ -38,9 +41,12 @@ describe My::PasswordsController do
         let(:new_password) { "booyakasham" }
 
         before :each do
-          put :update, id: user.id, user: {
-            password: new_password,
-            password_confirmation: new_password
+          put :update, params: {
+            id: user.id,
+            user: {
+              password: new_password,
+              password_confirmation: new_password
+            }
           }
         end
 
spec/controllers/my/settings_controller_spec.rb
@@ -15,7 +15,17 @@ describe My::SettingsController do
 
     before :each do
       http_login(user)
-      patch :update, id: user.id, user: { name: 'mo khan', email: 'mo@mokhan.ca', city: 'Calgary', website: 'http://mokhan.ca/', twitter: 'mocheen', facebook: 'fb' }
+      patch :update, params: {
+        id: user.id,
+        user: {
+          name: 'mo khan',
+          email: 'mo@mokhan.ca',
+          city: 'Calgary',
+          website: 'http://mokhan.ca/',
+          twitter: 'mocheen',
+          facebook: 'fb'
+        }
+      }
     end
 
     it "updates the users settings" do
spec/controllers/favorites_controller_spec.rb
@@ -9,7 +9,7 @@ describe FavoritesController do
 
     context "when adding a cake to your favorites" do
       before :each do
-        post :create, cake_id: cake.id
+        post :create, params: { cake_id: cake.id }
       end
 
       it "should add the cake to the logged in users favorites" do
spec/controllers/passwords_controller_spec.rb
@@ -14,7 +14,7 @@ describe PasswordsController do
     it "sends a password reset email for the user" do
       allow(PasswordReset).to receive(:send_reset_instructions_to)
 
-      post :create, user: { email: email }
+      post :create, params: { user: { email: email } }
 
       expect(PasswordReset).to have_received(:send_reset_instructions_to).with(email)
       expect(response).to redirect_to(new_session_path)
@@ -28,13 +28,13 @@ describe PasswordsController do
 
     it "loads the password reset token" do
       allow(User).to receive(:find_by).with(reset_password_token: reset_token).and_return(user)
-      get :edit, id: reset_token
+      get :edit, params: { id: reset_token }
       expect(assigns(:user)).to eql(user)
     end
 
     it "redirects to the homepage if the user cannot be found" do
       allow(User).to receive(:find_by).with(reset_password_token: reset_token).and_return(nil)
-      get :edit, id: reset_token
+      get :edit, params: { id: reset_token }
       expect(response).to redirect_to(root_path)
     end
   end
@@ -47,7 +47,7 @@ describe PasswordsController do
     it "resets the users password" do
       allow(PasswordReset).to receive(:reset).with(reset_token, password).and_return(user)
 
-      patch :update, id: reset_token, user: { password: password }
+      patch :update, params: { id: reset_token, user: { password: password } }
       expect(PasswordReset).to have_received(:reset).with(reset_token, password)
       expect(response).to redirect_to(new_session_path)
     end
spec/controllers/profiles_controller_spec.rb
@@ -16,7 +16,7 @@ describe ProfilesController do
     let(:creation) { create(:creation, user: user) }
 
     before :each do
-      get :show, id: user.id
+      get :show, params: { id: user.id }
     end
 
     it "returns a successful response" do
spec/controllers/registrations_controller_spec.rb
@@ -7,7 +7,7 @@ describe RegistrationsController do
     it 'creates a new user' do
       allow(User).to receive(:login).with('mo@cakeside.com', 'password').and_return(user_session)
 
-      post :create, user: { name: 'mo', email: 'mo@cakeside.com', password: 'password' }
+      post :create, params: {  user: { name: 'mo', email: 'mo@cakeside.com', password: 'password' } }
 
       expect(User.count).to eql(1)
       expect(response).to redirect_to(my_dashboard_path)
@@ -16,7 +16,7 @@ describe RegistrationsController do
     end
 
     it 'displays errors' do
-      post :create, user: { name: 'mo', email: 'mo', password: 'password', password_confirmation: 'password' }
+      post :create, params: { user: { name: 'mo', email: 'mo', password: 'password', password_confirmation: 'password' } }
       expect(response).to redirect_to(new_session_path)
       expect(flash[:error]).to_not be_empty
     end
spec/controllers/search_controller_spec.rb
@@ -18,7 +18,7 @@ describe SearchController do
       let!(:tutorial) { create(:tutorial, :description => 'cake') }
       let!(:other_tutorial) { create(:tutorial, :description => 'donut') }
 
-      before { get :index, { :q => 'cake' } }
+      before { get :index, params: { q: 'cake' } }
 
       it "returns a successful response" do
         expect(response).to be_success
spec/controllers/sessions_controller_spec.rb
@@ -30,7 +30,7 @@ describe SessionsController do
 
       before :each do
         allow(User).to receive(:login).with(email, password).and_return(user_session)
-        post :create, session: { email: email, password: password }
+        post :create, params: { session: { email: email, password: password } }
       end
 
       it "returns a valid session" do
@@ -48,7 +48,7 @@ describe SessionsController do
       end
 
       it "returns an error" do
-        post :create, session: { email: 'x', password: 'y' }
+        post :create, params: { session: { email: 'x', password: 'y' } }
         expect(response).to redirect_to(login_path)
         expect(flash[:error]).to_not be_empty
       end
@@ -61,7 +61,7 @@ describe SessionsController do
     before :each do
       session[:raphael] = user_session.key
       allow(controller).to receive(:user_session).and_return(user_session)
-      delete :destroy, id: "me"
+      delete :destroy, params: { id: "me" }
     end
 
     it { expect(session[:raphael]).to be_nil }
spec/controllers/tutorials_controller_spec.rb
@@ -23,7 +23,7 @@ describe TutorialsController do
 
     before :each do
       user.tutorials << tutorial
-      get :show, :id => tutorial.to_param
+      get :show, params: { id: tutorial.to_param }
     end
 
     it "assigns the requested tutorial" do
Gemfile
@@ -73,6 +73,7 @@ group :development, :test do
   gem 'phantomjs', :require => 'phantomjs/poltergeist'
   gem 'poltergeist'
   gem 'puma'
+  gem 'rails-controller-testing'
   gem 'rspec-rails'
   gem 'simplecov', require: false
   gem 'spring'
Gemfile.lock
@@ -807,6 +807,10 @@ GEM
       bundler (>= 1.3.0)
       railties (= 5.0.6)
       sprockets-rails (>= 2.0.0)
+    rails-controller-testing (1.0.2)
+      actionpack (~> 5.x, >= 5.0.1)
+      actionview (~> 5.x, >= 5.0.1)
+      activesupport (~> 5.x)
     rails-dom-testing (2.0.3)
       activesupport (>= 4.2.0)
       nokogiri (>= 1.6)
@@ -1010,6 +1014,7 @@ DEPENDENCIES
   rack-cors
   rack-mini-profiler
   rails (~> 5.0)
+  rails-controller-testing
   rspec-rails
   sass-rails (~> 5.0)
   simplecov