Commit 63adf1fa by Hoang Phuc Do

Merge remote-tracking branch 'origin/development' into dhp_rspec_2

parents b6b1983a 598b3bb5
......@@ -1596,6 +1596,15 @@ html .featured-box-primary .box-content {
/*
* Sidebar
*/
.sidebar.shop-sidebar ul, .sidebar.shop-sidebar ol {
padding: 0;
margin: -7px 0 0;
list-style: none;
}
.sidebar.shop-sidebar ul li a, .sidebar.shop-sidebar ol li a {
color: #777;
line-height: 2.5;
}
aside ul.nav-list > li > a {
font-size: 13px;
padding-left: 21px;
......
class AdminController < ApplicationController
before_action :authenticate_admin_user!
# GET /admin
def index
@user = current_user
end
# GET /admin/orders
def orders
@orders = Order.page(params[:page]).per(5)
end
private
def authenticate_admin_user!
authenticate_user!
unless current_user.is_admin?
redirect_to root_path, notice: 'Unauthorized access!'
end
end
end
\ No newline at end of file
......@@ -16,6 +16,13 @@ class ApplicationController < ActionController::Base
end
end
def user_is_admin?
return false unless user_signed_in?
unless current_user.is_admin?
return redirect_to root_url, notice: "You don't have access to this page"
end
end
protected
def configure_permitted_parameters
......
class CartsController < ApplicationController
include CartsHelper
before_action :set_cart
before_action :set_product_item,
only: [:add_product_item, :update_product_item, :remove_product_item]
before_action :build_empty_quantity_notice, if: :quantity_equal_zero?,
only: :add_product_item
only: :add_product_item
rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart
# GET /cart
......@@ -24,7 +25,6 @@ class CartsController < ApplicationController
else
render_warning_notice('Product is out of stock')
end
end
# PUT/PATCH /cart/update/1
......
class CategoriesController < ApplicationController
def show
@category = Category.find(params[:id])
@products = @category.products.take(6)
@products = @category.products.page(params[:page]).per(5)
end
end
\ No newline at end of file
class OrdersController < ApplicationController
include CartsHelper
before_action :authenticate_user!, only: :new
before_action :set_order_items, only: :new
before_action :authenticate_user!, only: [:new, :create]
before_action :user_is_admin?, only: [:edit, :update]
before_action :set_order, only: [:show, :edit, :update]
before_action :order_owner?, only: :show
# GET /orders/1
def show
@order = Order.find(params[:id])
end
# GET /orders/new
def new
redirect_to root_url if @cart.blank?
@order = Order.new
@order_items = @cart.product_items
end
# POST /orders
def create
@order = Order.create(user: current_user)
save_order_items(@order)
@order = Order.new(order_params.merge(user_id: current_user.id))
if @order.present?
if @order.save
save_order_items(@order)
destroy_cart_session
OrderMailer.send_order_detail_to_user(current_user, @order).deliver_later
redirect_to root_url, notice: 'Your order is successfully created'
redirect_to order_url(@order)
else
redirect_to root_url, notice: 'Your order can not be created'
end
end
# PATCH/PUT /orders/1
def update
if @order.update(order_params)
redirect_to order_url(@order), flash: { success: "Order ##{@order.id} is sucessfully updated" }
else
render 'edit'
end
end
def save_order_items(order)
@cart.product_items.values.each do |attrs|
order.product_items.create(product: attrs[:product],
......@@ -33,7 +50,18 @@ class OrdersController < ApplicationController
private
def set_order_items
@order_items = @cart.product_items
# Never trust parameters from the scary internet, only allow the white list through.
def order_params
params.require(:order).permit(:status)
end
def set_order
@order = Order.find(params[:id])
end
def order_owner?
unless @order.user == current_user
return redirect_to root_url, notice: "You don't have access to this order"
end
end
end
\ No newline at end of file
......@@ -2,6 +2,7 @@ class ProductsController < ApplicationController
before_action :authenticate_user!, only: [:new, :edit, :create, :update, :destroy]
before_action :set_product, only: :show
before_action :user_can_edit_product, only: [:edit, :update, :destroy]
before_action :set_solr, only: [:create, :update, :destroy ]
# GET /products/new
def new
......@@ -12,6 +13,7 @@ class ProductsController < ApplicationController
def create
@product = Product.new(product_params.merge(user_id: current_user.id))
if @product.save
@solr.add_product(@product)
redirect_to root_url, flash: { success: "Product #{@product.title} is sucessfully created" }
else
render 'new'
......@@ -21,6 +23,7 @@ class ProductsController < ApplicationController
# PATCH/PUT /products/1
def update
if @product.update(product_params)
@solr.update_product(@product)
redirect_to root_url, flash: { success: "Product #{@product.title} is sucessfully updated" }
else
render 'edit'
......@@ -30,6 +33,7 @@ class ProductsController < ApplicationController
# DELETE /products/1
def destroy
if @product.destroy
@solr.delete_product(@product)
flash[:success] = "Product #{@product.title} deleted"
else
flash[:alert] = "Product #{@product.title} can't be deleted"
......@@ -56,4 +60,8 @@ class ProductsController < ApplicationController
@product = current_user.products.find_by(id: params[:id])
redirect_to root_url, flash: { alert: 'You do not have permission to edit this product' } if @product.blank?
end
def set_solr
@solr = Solr.new
end
end
\ No newline at end of file
......@@ -13,10 +13,10 @@ class SearchController < ApplicationController
private
def set_search_result
@search_result = if params[:q].present?
Search.new(params[:q]).products
else
Product.all
end
search = Search.new
@search_result = search.products(params[:q])
if @search_result.blank?
@suggested_keywords = search.suggested_keywords(params[:q])
end
end
end
\ No newline at end of file
......@@ -10,4 +10,9 @@ class UsersController < ApplicationController
def products
@products = current_user.products.page(params[:page]).per(5)
end
# GET /users/orders
def orders
@orders = current_user.orders.page(params[:page]).per(5)
end
end
\ No newline at end of file
module SearchHelper
def render_search_result(search_result)
def render_search_result(search_result, suggested_keywords)
if search_result.blank?
render html: 'Sorry! There are no products matched your query'
keys = suggested_keywords.map { |kw| link_to kw, search_result_url(q: kw) }.\
to_sentence(last_word_connector: ' or ')
suggestion_msg = keys.present? ? " You can try different keywords like #{keys}" : ''
render html: "Sorry! There are no products matched your query. #{suggestion_msg}".html_safe
else
render(partial: 'products/product_list',
locals: { products: search_result })
......
class Order < ApplicationRecord
has_many :product_items, dependent: :destroy
belongs_to :user
enum status: { 'Pending' => 0, 'Done' => 1 }
validates :status, presence: true
def total_price
product_items.to_a.sum { |item| item.product.price * item.quantity }
......
......@@ -4,6 +4,8 @@ class Product < ApplicationRecord
mount_uploader :image_url, PictureUploader
validates :title, presence: true
validates :price, numericality: true, presence: true
validates :category_id, presence: true
validates :user_id, presence: true
......
......@@ -3,6 +3,9 @@ class ProductItem < ApplicationRecord
belongs_to :order, optional: true
after_create :update_product_quantity
validates :quantity, numericality: { only_integer: true,
greater_than: 0 }
def total_price
product.price * quantity
end
......
class ProductFilter
def self.filter_search_query(query)
return '*' if query.blank?
filtered_query = RSolr.solr_escape(query)
filtered_query[/\D+/] == filtered_query ? "title:#{filtered_query}" : filtered_query
end
def self.filter_suggest_keyword(keyword)
RSolr.solr_escape(keyword)
end
end
\ No newline at end of file
class Search
def initialize(search_query)
@solr = SolrSearch.new
@search_query = search_query
def initialize
@solr = Solr.new
end
def products
@solr.search_for(@search_query)
filter_products(@solr.docs)
# Get matched products with keyword
def products(search_query)
@products_indexes = @solr.exec_select_request(ProductFilter.filter_search_query(search_query))
matched_products(@products_indexes)
end
# Get suggested keywords
def suggested_keywords(keyword)
keywords = @solr.exec_suggest_request(ProductFilter.filter_suggest_keyword(keyword))
keywords.map { |kw| kw['term'] }
end
private
def filter_products(products)
def matched_products(products)
product_ids = products.map { |product| product[:id.to_s] }
Product.find(product_ids)
end
......
require 'rsolr'
class Solr
attr_accessor :rsolr
def initialize
@rsolr = RSolr.connect url: Settings.rsolr.address
end
def exec_select_request(query)
response = rsolr.get 'select', params: { q: query }
response['response']['docs']
end
def exec_suggest_request(query)
response = rsolr.get 'suggest', params: { 'suggest.q' => query }
response['suggest']['productSuggester'][query]['suggestions']
end
def add_products(products)
rsolr.add products
end
def update_product(product)
delete_product(product)
add_product(product)
end
def add_product(product)
rsolr.add(id: product.id,
title: product.title,
price: product.price)
rsolr.optimize
end
def delete_product(product)
rsolr.delete_by_id product.id
rsolr.optimize
end
def delete_all_products
rsolr.update(data: '<delete><query>*:*</query></delete>',
headers: { 'Content-Type' => 'text/xml',
'charset' => 'utf-8' })
rsolr.commit
end
end
\ No newline at end of file
require 'rsolr'
class SolrSearch
attr_accessor :rsolr
def initialize
@rsolr = RSolr.connect url: Settings.rsolr.address
@response = nil
end
def search_for(search_query)
search_query ||= ''
@response = rsolr.get 'select', params: { q: sanitize_query(search_query) }
end
def docs
@response['response']['docs']
end
def sanitize_query(query)
query.gsub(/[^0-9A-Za-z]/, '')
end
end
\ No newline at end of file
<div class="container">
<div class="row">
<div class="col-md-9 col-md-push-3 my-account">
<h2 class="h2 heading-primary font-weight-normal">
Dashboard
</h2>
<h2 class="h3 mb-sm">
<strong>Account Information</strong>
</h2>
<div class="row">
<div class="col-sm-12">
<div class="panel-box">
<div class="panel-box-title">
<h3>Contact Information</h3>
<%= link_to 'Edit', edit_user_registration_path, class: 'panel-box-edit' %>
</div>
<div class="panel-box-content">
<p><%= @user.first_name %> <%= @user.last_name %></p>
<p><%= @user.email %></p>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3 col-md-pull-9">
<%= render 'shared/admin/admin_sidebar' %>
</div>
</div>
</div>
\ No newline at end of file
<div class="container">
<div class="row">
<div class="col-md-9 col-md-push-3 my-account">
<h2 class="h2 heading-primary font-weight-normal">
Orders
</h2>
<%= render 'admin/orders/order_table' %>
<div class="toolbar-bottom">
<div class="toolbar">
<div class="sorter">
<%= paginate @orders, theme: 'bootstrap' %>
</div>
</div>
</div>
</div>
<div class="col-md-3 col-md-pull-9">
<%= render 'shared/admin/admin_sidebar' %>
</div>
</div>
</div>
\ No newline at end of file
<div class="cart-table-wrap">
<table class="cart-table">
<thead>
<tr>
<th>Order ID</th>
<th>Status</th>
<th>Date created</th>
<th>Total price</th>
<th></th>
</tr>
</thead>
<tbody>
<% @orders.each do |order| %>
<tr>
<td><%= link_to "##{order.id}", order_url(order) %></td>
<td><%= order.status %></td>
<td><%= order.created_at.strftime('%d-%M-%Y %H:%m') %></td>
<td><%= number_to_currency(order.total_price) %></td>
<td><%= link_to fa_icon('pencil'), edit_order_path(order) %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
\ No newline at end of file
......@@ -5,7 +5,7 @@
<td class="product-image-td"></td>
<td class="product-name-td">
<h2 class="product-name">
<%= link_to product_item[:product].title, product_url(product_item[:product]) %>
<%= link_to product_item[:product].title, product_item_url(product_item[:product]) %>
</h2>
</td>
<td><%= number_to_currency(product_item[:product].price) %></td>
......
<h2 class="h2 heading-primary mt-lg clearfix">
<span><%= category.title %></span>
</h2>
<%= render partial: 'products/product_list', locals: { products: @products } %>
<div class="toolbar-bottom">
<div class="toolbar">
<div class="sorter">
<%= paginate @products, theme: 'bootstrap' %>
</div>
</div>
</div>
\ No newline at end of file
<div class="row">
<div class="col-md-9 col-md-push-3">
<div class="category-header">
<h2><%= @category.title %></h2>
<div class="container">
<div class="row">
<div class="col-md-9 col-md-push-3">
<%= render @category %>
</div>
<div class="shop-row">
<div class="shop-container">
<ul class="products-list">
<%= render @products %>
</ul>
</div>
<div class="col-md-3 col-md-pull-9 sidebar shop-sidebar">
<%= render 'shared/sidebar' %>
</div>
</div>
<!-- End .col-md-9 -->
<div class="col-md-3 col-md-pull-9 sidebar">
<%= render 'shared/sidebar' %>
</div>
</div>
<!-- End .row -->
\ No newline at end of file
</div>
\ No newline at end of file
......@@ -16,17 +16,7 @@
<div class="header-column">
<div class="row">
<div class="cart-area">
<div class="custom-block">
<% if user_signed_in? %>
<%= link_to 'MY PROFILE', user_profile_path %>
<span class="split"></span>
<%= link_to 'SIGN OUT', destroy_user_session_path, method: :delete %>
<% else %>
<%= link_to 'SIGN IN', new_user_session_path %>
<span class="split"></span>
<%= link_to 'SIGN UP', new_user_registration_path %>
<% end %>
</div>
<%= render 'layouts/header/user_nav' %>
<div class="cart-dropdown">
<a href="<%= cart_index_url %>" class="cart-dropdown-icon">
<i class="minicart-icon"></i>
......
......@@ -2,7 +2,7 @@
<a href="#" class="search-toggle"><i class="fa fa-search"></i></a>
<%= form_tag search_result_path, method: :get do %>
<div class="header-search-wrapper">
<%= text_field_tag :q, params[:q], class: 'form-control', placeholder: 'Search...' %>
<%= text_field_tag :q, params[:q], class: 'form-control', placeholder: 'Enter product title...' %>
<%= button_tag raw('<i class="fa fa-search"></i>'), class: 'btn btn-default' %>
</div>
<% end %>
......
<div class="custom-block">
<% if user_signed_in? %>
<% if current_user.is_admin? %>
<%= link_to 'SITE ADMIN', admin_index_path %>
<span class="split"></span>
<% end %>
<%= link_to 'MY PROFILE', user_profile_path %>
<span class="split"></span>
<%= link_to 'SIGN OUT', destroy_user_session_path, method: :delete %>
<% else %>
<%= link_to 'SIGN IN', new_user_session_path %>
<span class="split"></span>
<%= link_to 'SIGN UP', new_user_registration_path %>
<% end %>
</div>
\ No newline at end of file
<%= form_for(@order) do |f| %>
<%= render 'shared/error_messages', object: @order %>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<%= f.label :status %>
<%= f.select :status, Order.statuses.keys, {}, class: 'form-control' %>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-action clearfix mt-none">
<%= f.submit "Submit", class: "btn btn-primary" %>
</div>
</div>
</div>
</div>
<% end %>
\ No newline at end of file
<div class="cart-table-wrap">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td colspan="2" class="text-left">
Order Detail - <span><%= order.status %></span>
</td>
</tr>
<tbody>
<tr>
<td><strong>Order ID:</strong> #<%= order.id %></td>
<td><strong>Date created:</strong> <%= order.created_at.strftime('%d-%M-%Y %H:%m') %></td>
</tr>
<tr>
<td><strong>Email:</strong> <%= order.user.email %></td>
<td><strong>Total:</strong> <%= number_to_currency(order.total_price) %></td>
</tr>
</tbody>
</thead>
</table>
<div class="cart-table-wrap">
<table class="cart-table">
<thead>
<tr>
<th></th>
<th>Product Name</th>
<th>Unit Price</th>
<th>Qty</th>
<th>Subtotal</th>
</tr>
</thead>
<tbody>
<%= render partial: 'product_item', collection: order.product_items %>
</tbody>
<tfoot>
<tr>
<td colspan="3"></td>
<td><strong>Total</strong></td>
<td><strong><%= number_to_currency(order.total_price) %></strong></td>
</tr>
</tfoot>
</table>
</div>
</div>
\ No newline at end of file
<tr>
<td class="product-image-td"></td>
<td class="product-name-td">
<h2 class="product-name">
<%= link_to product_item.product.title, product_url(product_item.product) %>
</h2>
</td>
<td><%= number_to_currency(product_item.product.price) %></td>
<td><%= product_item.quantity %></td>
<td><%= number_to_currency(product_item.total_price) %></td>
</tr>
\ No newline at end of file
<div class="container">
<div class="row">
<div class="col-md-12 create-product form-section">
<h1 class="h2 heading-primary font-weight-normal">
Edit Order #<%= @order.id %>
(<%= link_to 'Delete', @order, method: :delete, data: { confirm: 'Are your sure?' } %>)
</h1>
<div class="featured-box featured-box-primary featured-box-flat featured-box-text-left mt-md">
<div class="box-content">
<%= render 'shared/redirect_back' %>
<%= render 'form' %>
</div>
</div>
</div>
</div>
</div>
\ No newline at end of file
......@@ -38,6 +38,7 @@
<div class="checkout-review-action">
<h5>Grand Total <span><%= number_to_currency(cart_total_price) %></span></h5>
<%= form_for @order do |f| %>
<%= hidden_field_tag 'order[create_order]' %>
<%= f.submit 'Place Order now', class: 'btn btn-primary' %>
<% end %>
</div>
......
<div class="order-detail">
<div class="container">
<h1 class="h2 heading-primary mt-lg mb-md clearfix">
Order Information
</h1>
<div class="row">
<div class="col-md-12">
<%= render 'shared/flash_messages' %>
<%= render @order %>
</div>
</div>
</div>
</div>
\ No newline at end of file
......@@ -4,7 +4,7 @@
<h2 class="h2 heading-primary mt-lg clearfix">
<span>Search result</span>
</h2>
<%= render_search_result(@products) %>
<%= render_search_result(@products, @suggested_keywords) %>
<div class="toolbar-bottom">
<div class="toolbar">
......
......@@ -4,5 +4,6 @@
<%= active_link_to 'My Dashboard', user_profile_path, wrap_tag: :li, active: :exclusive %>
<%= active_link_to 'Edit Account Information', edit_user_registration_path, wrap_tag: :li, active: :exclusive %>
<%= active_link_to 'My Products', user_products_path, wrap_tag: :li, active: :exclusive %>
<%= active_link_to 'My Orders', user_orders_path, wrap_tag: :li, active: :exclusive %>
</ul>
</aisde>
\ No newline at end of file
<p><%= link_to 'Back to previous page', request.referrer %></p>
\ No newline at end of file
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
Categories
</h4>
</div>
<div id="panel-filter-category">
<div class="panel-body">
<ul>
</ul>
</div>
</div>
</div>
<%= render 'shared/widgets/categories' %>
</div>
\ No newline at end of file
<aisde class="sidebar">
<h4>Admin Area</h4>
<ul class="nav nav-list">
<%= active_link_to 'Dashboard', admin_index_path, wrap_tag: :li, active: :exclusive %>
<%= active_link_to 'Orders', admin_orders_show_path, wrap_tag: :li, active: :exclusive %>
</ul>
</aisde>
\ No newline at end of file
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
Categories
</h4>
</div>
<div id="panel-filter-category">
<div class="panel-body">
<ul>
<% Category.all.each do |category| %>
<%= active_link_to category.title, category_url(category), wrap_tag: :li %>
<% end %>
</ul>
</div>
</div>
</div>
</div>
\ No newline at end of file
<div class="cart-table-wrap">
<table class="cart-table">
<thead>
<tr>
<th>Order ID</th>
<th>Status</th>
<th>Date created</th>
<th>Total price</th>
</tr>
</thead>
<tbody>
<% orders.each do |order| %>
<tr>
<td><%= link_to "##{order.id}", order_url(order) %></td>
<td><%= order.status %></td>
<td><%= order.created_at.strftime('%d-%M-%Y %H:%m') %></td>
<td><%= number_to_currency(order.total_price) %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
\ No newline at end of file
<div class="container">
<div class="row">
<div class="col-md-9 col-md-push-3 my-account">
<h2 class="h2 heading-primary font-weight-normal">
My Orders
</h2>
<%= render partial: 'order', locals: { orders: @orders } %>
<div class="toolbar-bottom">
<div class="toolbar">
<div class="sorter">
<%= paginate @orders, theme: 'bootstrap' %>
</div>
</div>
</div>
</div>
<div class="col-md-3 col-md-pull-9">
<%= render 'shared/account_sidebar' %>
</div>
</div>
</div>
\ No newline at end of file
......@@ -3,7 +3,7 @@ Rails.application.routes.draw do
root 'static_pages#index'
resources :categories
resources :products
resources :orders, only: [:new, :create, :show]
resources :orders
resources :product_items
scope 'cart' do
get '/', to: 'carts#index', as: 'cart_index'
......@@ -19,6 +19,11 @@ Rails.application.routes.draw do
scope 'users' do
get '/', to: 'users#show', as: 'user_profile'
get '/products', to: 'users#products', as: 'user_products'
get '/orders', to: 'users#orders', as: 'user_orders'
end
get '/search', to: 'search#show', as: 'search_result'
scope 'admin' do
get '/', to: 'admin#index', as: 'admin_index'
get '/orders', to: 'admin#orders', as: 'admin_orders_show'
end
end
# RSolr
rsolr:
address: http://localhost:8983/solr/dhp_venshop
\ No newline at end of file
class AddOrderStatusToOrders < ActiveRecord::Migration[5.1]
def change
add_column :orders, :status, :integer, null: false, default: 0
end
end
class AddAdminToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :is_admin, :boolean, null: false, default: false
end
end
......@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170615035827) do
ActiveRecord::Schema.define(version: 20170623064632) do
create_table "categories", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.string "title"
......@@ -21,6 +21,8 @@ ActiveRecord::Schema.define(version: 20170615035827) do
t.bigint "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "status"
t.integer "status", default: 0, null: false
t.index ["user_id"], name: "index_orders_on_user_id"
end
......@@ -65,6 +67,8 @@ ActiveRecord::Schema.define(version: 20170615035827) do
t.string "username"
t.string "first_name"
t.string "last_name"
t.boolean "admin", default: false, null: false
t.boolean "is_admin", default: false, null: false
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
......
namespace :import_solr_data do
desc "Import product data from database"
task product: :environment do
documents = []
Product.all.each do |product|
documents << { id: product.id, title: product.title, price: product.price }
end
solr_search = SolrSearch.new
solr_search.rsolr.add documents
end
end
namespace :vs_solr do
desc 'Import product data from database'
task product: :environment do
products = []
Product.all.each do |product|
products << { id: product.id,
title: product.title,
price: product.price }
end
Solr.new.add_products(products)
end
desc 'Remove all index from Solr'
task remove: :environment do
Solr.new.delete_all_products
end
end
require 'rails_helper'
RSpec.describe OrdersController, type: :controller do
let!(:user) { FactoryGirl.create(:user) }
let!(:user) { create(:user) }
describe '#show' do
before { sign_in user }
......@@ -11,7 +11,7 @@ RSpec.describe OrdersController, type: :controller do
end
context 'as an authorized user' do
let!(:order) { FactoryGirl.create(:order, user: user) }
let!(:order) { create(:order, user: user) }
it 'assigns the requested order to @order' do
do_request
......@@ -25,8 +25,8 @@ RSpec.describe OrdersController, type: :controller do
end
context 'as an unauthorized user' do
let(:other_user) { FactoryGirl.create(:user) }
let(:order) { FactoryGirl.create(:order, user: other_user) }
let(:other_user) { create(:user) }
let(:order) { create(:order, user: other_user) }
it 'redirects to home page' do
do_request
......@@ -64,8 +64,8 @@ RSpec.describe OrdersController, type: :controller do
end
context 'as an authorized user' do
let(:admin_user) { FactoryGirl.create(:user, admin: true) }
let!(:order) { FactoryGirl.create(:order) }
let(:admin_user) { create(:user, is_admin: true) }
let!(:order) { create(:order) }
before { sign_in admin_user }
it 'assigns the requested order to @order' do
......@@ -80,7 +80,7 @@ RSpec.describe OrdersController, type: :controller do
end
context 'as an unauthorized user' do
let(:order) { FactoryGirl.create(:order) }
let(:order) { create(:order) }
before { sign_in user }
it 'redirects to home page' do
......@@ -96,11 +96,11 @@ RSpec.describe OrdersController, type: :controller do
end
context 'as an authorized user' do
let!(:order) { FactoryGirl.create(:order, user: user) }
let!(:order) { create(:order, user: user) }
before { sign_in user }
context 'with valid attributes' do
let!(:order_params) { FactoryGirl.attributes_for(:order) }
let!(:order_params) { attributes_for(:order) }
it 'save the new order to database' do
expect { do_request }.to change(Order, :count).by(1)
......@@ -113,7 +113,7 @@ RSpec.describe OrdersController, type: :controller do
end
context 'with invalid attributes' do
let(:order_params) { FactoryGirl.attributes_for(:order, order_status: 'Not valid') }
let(:order_params) { attributes_for(:order, status: 'Not valid') }
it 'does not save changes to database' do
expect { do_request }.to raise_error(ArgumentError)
......@@ -122,7 +122,7 @@ RSpec.describe OrdersController, type: :controller do
end
context 'as a guest' do
let(:order_params) { FactoryGirl.attributes_for(:order) }
let(:order_params) { attributes_for(:order) }
it 'redirects to home page' do
do_request
......@@ -137,32 +137,32 @@ RSpec.describe OrdersController, type: :controller do
end
context 'as an authorized user' do
let(:admin_user) { FactoryGirl.create(:user, admin: true) }
let!(:order) { FactoryGirl.create(:order) }
let(:admin_user) { create(:user, is_admin: true) }
let!(:order) { create(:order) }
before { sign_in admin_user }
context 'with valid attributes' do
let!(:order_params) { FactoryGirl.attributes_for(:order, order_status: 'Done') }
let!(:order_params) { attributes_for(:order, status: 'Done') }
it 'save changes to database' do
do_request
expect(order.reload.order_status).to eq 'Done'
expect(order.reload.status).to eq 'Done'
end
end
context 'with invalid attributes' do
let!(:order_params) { FactoryGirl.attributes_for(:order, user_id: nil) }
let!(:order_params) { attributes_for(:order, user_id: nil) }
it 'does not save changes to database' do
do_request
expect(order.reload.order_status).to eq 'Pending'
expect(order.reload.status).to eq 'Pending'
end
end
end
context 'as an unauthorized user' do
let(:order) { FactoryGirl.create(:order) }
let(:order_params) { FactoryGirl.attributes_for(:order) }
let(:order) { create(:order) }
let(:order_params) { attributes_for(:order) }
before { sign_in user }
it 'redirects to home page' do
......
require 'rails_helper'
RSpec.describe ProductsController, type: :controller do
let!(:user) { FactoryGirl.create(:user) }
let!(:user) { create(:user) }
describe '#show' do
let!(:product) { FactoryGirl.create(:product) }
let!(:product) { create(:product) }
def do_request
get :show, params: { id: product.id }
......@@ -38,7 +38,7 @@ RSpec.describe ProductsController, type: :controller do
end
describe '#edit' do
let!(:product) { FactoryGirl.create(:product, user: user) }
let!(:product) { create(:product, user: user) }
def do_request
get :edit, params: { id: product.id }
......@@ -72,13 +72,13 @@ RSpec.describe ProductsController, type: :controller do
end
context 'as an authorized user' do
let!(:product) { FactoryGirl.create(:product) }
let!(:product) { create(:product) }
before { sign_in user }
context 'with valid attributes' do
let(:category) { FactoryGirl.create(:category) }
let(:category) { create(:category) }
let!(:product_params) do
FactoryGirl.attributes_for(:product,
attributes_for(:product,
user_id: user.id,
category_id: category)
end
......@@ -93,7 +93,7 @@ RSpec.describe ProductsController, type: :controller do
end
context 'with invalid attributes' do
let(:product_params) { FactoryGirl.attributes_for(:product) }
let(:product_params) { attributes_for(:product) }
it 'does not save the new product' do
expect { do_request }.to_not change(Product, :count)
......@@ -116,10 +116,10 @@ RSpec.describe ProductsController, type: :controller do
end
context 'as an authorized user' do
let!(:product) { FactoryGirl.create(:product, user: user) }
let!(:product) { create(:product, user: user) }
context 'with valid attributes' do
let(:product_params) { FactoryGirl.attributes_for(:product, title: 'New Product Title') }
let(:product_params) { attributes_for(:product, title: 'New Product Title') }
it 'update changes to database' do
do_request
......@@ -128,7 +128,7 @@ RSpec.describe ProductsController, type: :controller do
end
context 'with invalid attributes' do
let(:product_params) { FactoryGirl.attributes_for(:product, category_id: nil) }
let(:product_params) { attributes_for(:product, category_id: nil) }
it 'does not update changes to database' do
do_request
......@@ -138,9 +138,9 @@ RSpec.describe ProductsController, type: :controller do
end
context 'as an unauthorized user' do
let(:other_user) { FactoryGirl.create(:user) }
let(:product) { FactoryGirl.create(:product, user: other_user) }
let(:product_params) { FactoryGirl.attributes_for(:product) }
let(:other_user) { create(:user) }
let(:product) { create(:product, user: other_user) }
let(:product_params) { attributes_for(:product) }
it 'redirect to home page' do
do_request
......
FactoryGirl.define do
factory :order do
user
order_status 'Pending'
status 'Pending'
end
end
......@@ -3,12 +3,12 @@ require 'rails_helper'
RSpec.describe Order, type: :model do
describe 'db schema' do
context 'columns' do
it { is_expected.to define_enum_for(:order_status).with(['Pending', 'Done']) }
it { is_expected.to define_enum_for(:status).with(['Pending', 'Done']) }
end
end
context 'validations' do
it { is_expected.to validate_presence_of(:order_status) }
it { is_expected.to validate_presence_of(:status) }
end
context 'associations' do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment