From 0334921ee90284195193a0b14a401e5e14c27eca Mon Sep 17 00:00:00 2001 From: yasushiito Date: Fri, 7 Dec 2012 14:43:43 +0900 Subject: [PATCH] create demander --- app/assets/javascripts/demander_statuses.js.coffee | 3 + app/assets/javascripts/demanders.js.coffee | 3 + app/assets/stylesheets/demander_statuses.css.scss | 3 + app/assets/stylesheets/demanders.css.scss | 3 + app/controllers/demander_statuses_controller.rb | 63 ++ app/controllers/demanders_controller.rb | 99 +++ app/helpers/demander_statuses_helper.rb | 2 + app/helpers/demanders_helper.rb | 2 + app/models/demand_user.rb | 22 + app/models/demander.rb | 121 ++++ app/models/demander_status.rb | 160 +++++ app/views/demand_users/confirmations/new.html.erb | 12 + .../mailer/confirmation_instructions.html.erb | 5 + .../mailer/reset_password_instructions.html.erb | 8 + .../mailer/unlock_instructions.html.erb | 7 + app/views/demand_users/passwords/edit.html.erb | 16 + app/views/demand_users/passwords/new.html.erb | 12 + app/views/demand_users/registrations/edit.html.erb | 25 + app/views/demand_users/registrations/new.html.erb | 18 + app/views/demand_users/sessions/new.html.erb | 17 + app/views/demand_users/shared/_links.erb | 25 + app/views/demand_users/unlocks/new.html.erb | 12 + app/views/demander_statuses/_basic.html.erb | 16 + app/views/demander_statuses/_demander.html.erb | 16 + app/views/demander_statuses/_form.html.erb | 28 + app/views/demander_statuses/edit.html.erb | 7 + app/views/demander_statuses/index.html.erb | 53 ++ app/views/demander_statuses/show.html.erb | 36 + app/views/demanders/_form.html.erb | 38 ++ app/views/demanders/edit.html.erb | 4 + app/views/demanders/index.html.erb | 37 + app/views/demanders/new.html.erb | 5 + app/views/demanders/show.html.erb | 32 + .../20121123051900_devise_create_demand_users.rb | 25 + db/migrate/20121123054410_create_demanders.rb | 15 + .../20121123054445_create_demander_statuses.rb | 14 + .../demander_statuses_controller_spec.rb | 462 +++++++++++++ spec/controllers/demanders_controller_spec.rb | 605 +++++++++++++++++ spec/helpers/demander_statuses_helper_spec.rb | 15 + spec/helpers/demanders_helper_spec.rb | 15 + spec/models/demand_user_spec.rb | 5 + spec/models/demander_spec.rb | 500 ++++++++++++++ spec/models/demander_status_spec.rb | 754 +++++++++++++++++++++ 43 files changed, 3320 insertions(+) create mode 100644 app/assets/javascripts/demander_statuses.js.coffee create mode 100644 app/assets/javascripts/demanders.js.coffee create mode 100644 app/assets/stylesheets/demander_statuses.css.scss create mode 100644 app/assets/stylesheets/demanders.css.scss create mode 100644 app/controllers/demander_statuses_controller.rb create mode 100644 app/controllers/demanders_controller.rb create mode 100644 app/helpers/demander_statuses_helper.rb create mode 100644 app/helpers/demanders_helper.rb create mode 100644 app/models/demand_user.rb create mode 100644 app/models/demander.rb create mode 100644 app/models/demander_status.rb create mode 100644 app/views/demand_users/confirmations/new.html.erb create mode 100644 app/views/demand_users/mailer/confirmation_instructions.html.erb create mode 100644 app/views/demand_users/mailer/reset_password_instructions.html.erb create mode 100644 app/views/demand_users/mailer/unlock_instructions.html.erb create mode 100644 app/views/demand_users/passwords/edit.html.erb create mode 100644 app/views/demand_users/passwords/new.html.erb create mode 100644 app/views/demand_users/registrations/edit.html.erb create mode 100644 app/views/demand_users/registrations/new.html.erb create mode 100644 app/views/demand_users/sessions/new.html.erb create mode 100644 app/views/demand_users/shared/_links.erb create mode 100644 app/views/demand_users/unlocks/new.html.erb create mode 100644 app/views/demander_statuses/_basic.html.erb create mode 100644 app/views/demander_statuses/_demander.html.erb create mode 100644 app/views/demander_statuses/_form.html.erb create mode 100644 app/views/demander_statuses/edit.html.erb create mode 100644 app/views/demander_statuses/index.html.erb create mode 100644 app/views/demander_statuses/show.html.erb create mode 100644 app/views/demanders/_form.html.erb create mode 100644 app/views/demanders/edit.html.erb create mode 100644 app/views/demanders/index.html.erb create mode 100644 app/views/demanders/new.html.erb create mode 100644 app/views/demanders/show.html.erb create mode 100644 db/migrate/20121123051900_devise_create_demand_users.rb create mode 100644 db/migrate/20121123054410_create_demanders.rb create mode 100644 db/migrate/20121123054445_create_demander_statuses.rb create mode 100644 spec/controllers/demander_statuses_controller_spec.rb create mode 100644 spec/controllers/demanders_controller_spec.rb create mode 100644 spec/helpers/demander_statuses_helper_spec.rb create mode 100644 spec/helpers/demanders_helper_spec.rb create mode 100644 spec/models/demand_user_spec.rb create mode 100644 spec/models/demander_spec.rb create mode 100644 spec/models/demander_status_spec.rb diff --git a/app/assets/javascripts/demander_statuses.js.coffee b/app/assets/javascripts/demander_statuses.js.coffee new file mode 100644 index 00000000..76156794 --- /dev/null +++ b/app/assets/javascripts/demander_statuses.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/demanders.js.coffee b/app/assets/javascripts/demanders.js.coffee new file mode 100644 index 00000000..76156794 --- /dev/null +++ b/app/assets/javascripts/demanders.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/stylesheets/demander_statuses.css.scss b/app/assets/stylesheets/demander_statuses.css.scss new file mode 100644 index 00000000..569e412e --- /dev/null +++ b/app/assets/stylesheets/demander_statuses.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the demander_statuses 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/demanders.css.scss b/app/assets/stylesheets/demanders.css.scss new file mode 100644 index 00000000..c0d0c383 --- /dev/null +++ b/app/assets/stylesheets/demanders.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the demanders 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/demander_statuses_controller.rb b/app/controllers/demander_statuses_controller.rb new file mode 100644 index 00000000..c936bbbb --- /dev/null +++ b/app/controllers/demander_statuses_controller.rb @@ -0,0 +1,63 @@ +class DemanderStatusesController < ApplicationController + layout 'test' if MagicNumber['test_layout'] + before_filter :authenticate_admin!, :only => [:index, :show, :edit, :update, :destroy] + + def index + @page = DemanderStatus.page params[:page] + @page_size = DemanderStatus.page_size params[:page_size] + @hide = params[:hide] + @demander_statuses = if @hide.blank? + DemanderStatus.list(@page, @page_size) + else + DemanderStatus.requested_list(@page, @page_size) + end + + respond_to do |format| + format.html # index.html.erb + format.json { render :json => @demander_statuses.to_json(DemanderStatus.list_json_opt) } + end + end + + def show + @demander_status = DemanderStatus.show(params[:id], @admin) + + respond_to do |format| + format.html # show.html.erb + format.json { render :json => @demander_status.to_json(DemanderStatus.show_json_opt) } + end + end + + def edit + @demander_status = DemanderStatus.edit(params[:id], @admin) + respond_to do |format| + format.html + end + end + + def update + @demander_status = DemanderStatus.edit(params[:id], @admin) + respond_to do |format| + if @demander_status.approve params[:demander_status][:receive_hour1], params[:demander_status][:receive_hour2] + format.html { redirect_to @demander_status, notice: 'DemanderStatus was successfully updated.' } + format.json { head :ok } + else + format.html { render action: "edit" } + format.json { render json: @demander_status.errors, status: :unprocessable_entity } + end + end + end + + def destroy + @demander_status = DemanderStatus.edit(params[:id], @admin) + respond_to do |format| + if @demander_status.reject + format.html { redirect_to @demander_status, notice: 'DemanderStatus was successfully rejected.' } + format.json { head :ok } + else + format.html { redirect_to @demander_status, notice: 'DemanderStatus was not rejected.' } + format.json { render json: @demander_status.errors, status: :unprocessable_entity } + end + end + end + +end diff --git a/app/controllers/demanders_controller.rb b/app/controllers/demanders_controller.rb new file mode 100644 index 00000000..a8c08d82 --- /dev/null +++ b/app/controllers/demanders_controller.rb @@ -0,0 +1,99 @@ +class DemandersController < ApplicationController + layout 'test' if MagicNumber['test_layout'] + before_filter :authenticate_demand_user!, :only => [:index, :show, :new, :create, :edit, :update, :destroy, :req] + + def index + @demander = @demand_user.demander + if @demander + respond_to do |format| + format.html # index.html.erb + end + else + redirect_to new_demander_path, notice: 'Demander not found.' + end + end + + def show + @demander = Demander.show(params[:id], @demand_user) + + respond_to do |format| + format.html # show.html.erb + format.json { render :json => @demander.to_json(Demander.show_json_opt) } + end + end + + def new + @demander = Demander.new + @demander.supply_default + respond_to do |format| + format.html # new.html.erb + format.json { render json: @demander.to_json(Demander.show_json_opt) } + end + end + + def edit + @demander = Demander.edit(params[:id], @demand_user) + respond_to do |format| + format.html + end + end + + def create + @demander = Demander.new + @demander.supply_default + @demander.attributes = params[:demander] + @demander.overwrite @demand_user + + respond_to do |format| + if @demander.store + format.html { redirect_to @demander, notice: 'Demander was successfully created.' } + format.json { render json: @demander.to_json(Demander.show_json_opt), status: :created, location: @demander } + else + format.html { render action: "new" } + format.json { render json: @demander.errors, status: :unprocessable_entity } + end + end + end + + def update + @demander = Demander.edit(params[:id], @demand_user) + @demander.attributes = params[:demander] + @demander.overwrite @demand_user + respond_to do |format| + if @demander.store + format.html { redirect_to @demander, notice: 'Demander was successfully updated.' } + format.json { head :ok } + else + format.html { render action: "edit" } + format.json { render json: @demander.errors, status: :unprocessable_entity } + end + end + end + + def req + @demander = @demand_user.demander + respond_to do |format| + if @demander.demander_status.request + format.html { redirect_to demanders_path, notice: 'Demander was successfully updated.' } + format.json { head :ok } + else + format.html { redirect_to demanders_path, notice: 'Demander was not successfully updated.' } + format.json { render json: @demander.errors, status: :unprocessable_entity } + end + end + end + + def destroy + @demander = Demander.edit(params[:id], @demand_user) + respond_to do |format| + if @demander.stop + format.html { redirect_to demanders_url, notice: 'Demander was successfully stopped.' } + format.json { head :ok } + else + format.html { redirect_to demanders_url, notice: 'Demander was not successfully stopped.' } + format.json { render json: @demander.errors, status: :unprocessable_entity } + end + end + end + +end diff --git a/app/helpers/demander_statuses_helper.rb b/app/helpers/demander_statuses_helper.rb new file mode 100644 index 00000000..a177c8ea --- /dev/null +++ b/app/helpers/demander_statuses_helper.rb @@ -0,0 +1,2 @@ +module DemanderStatusesHelper +end diff --git a/app/helpers/demanders_helper.rb b/app/helpers/demanders_helper.rb new file mode 100644 index 00000000..a4ee0a5b --- /dev/null +++ b/app/helpers/demanders_helper.rb @@ -0,0 +1,2 @@ +module DemandersHelper +end diff --git a/app/models/demand_user.rb b/app/models/demand_user.rb new file mode 100644 index 00000000..64fe0939 --- /dev/null +++ b/app/models/demand_user.rb @@ -0,0 +1,22 @@ +class DemandUser < ActiveRecord::Base + has_one :demander + + # Include default devise modules. Others available are: + # :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :trackable, :validatable, :token_authenticatable + + # Setup accessible (or protected) attributes for your model + attr_accessible :email, :password, :password_confirmation, :remember_me + + def create_token + self.ensure_authentication_token + self.save + end + + def delete_token + self.authentication_token = nil + self.save + end + +end diff --git a/app/models/demander.rb b/app/models/demander.rb new file mode 100644 index 00000000..ef0078c5 --- /dev/null +++ b/app/models/demander.rb @@ -0,0 +1,121 @@ +class Demander < ActiveRecord::Base + belongs_to :demand_user + belongs_to :demander_status + + validates :demand_user_id, :presence => true, :numericality => true, :existence => true + validates :name, :presence => true, :length => {:maximum => 50}, :uniqueness => true + validates :caption, :presence => true, :length => {:maximum => 30} + validates :url, :presence => true, :length => {:maximum => 200}, :url => true + validates :description, :presence => true + validates :demander_url, :presence => true, :length => {:maximum => 200}, :url => true + validates :demander_status_id, :presence => true, :numericality => true, :existence => true + + def supply_default + end + + def overwrite du + self.demand_user_id = du.id + end + + def own? du + return false unless du.is_a?(DemandUser) + du.id == self.demand_user_id + end + + def visible? du + return false unless du.is_a?(DemandUser) + du.id == self.demand_user_id + end + + def status + self.demander_status.status + end + + def self.default_page_size + 25 + end + + def self.max_page_size + 100 + end + + def self.default_panel_size + 30 + end + + def self.page prm = nil + page = prm.to_i + page = 1 if page < 1 + page + end + + def self.page_size prm = self.default_page_size + page_size = prm.to_i + page_size = self.max_page_size if page_size > self.max_page_size + page_size = self.default_page_size if page_size < 1 + page_size + end + + def self.list page = 1, page_size = self.default_page_size + opt = {} + opt.merge!(Demander.list_opt) + opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0 + opt.merge!({:order => 'demanders.name'}) + Demander.find(:all, opt) + end + + def self.list_opt + {:include => {:demander_status => {}} } + end + + def self.list_json_opt + {:include => {:demander_status => {}} } + end + + def self.show pid, du + opt = {} + opt.merge!(Demander.show_opt) + res = Demander.find(pid, opt) + raise ActiveRecord::Forbidden unless res.visible?(du) + res + end + + def self.edit pid, du + opt = {} + opt.merge!(Demander.show_opt) + res = Demander.find(pid, opt) + raise ActiveRecord::Forbidden unless res.own?(du) + res + end + + def self.show_opt + {:include => {:demander_status => {}} } + end + + def self.show_json_opt + {:include => {:demander_status => {}} } + end + + def store + r = false + Demander.transaction do + if self.new_record? + ds = DemanderStatus.new + ds.supply_default + if ds.save + self.demander_status_id = ds.id + else + self.demander_status_id = nil + end + end + r = self.save + raise ActiveRecord::Rollback unless r + end + r + end + + def stop + self.demander_status.stop + end + +end diff --git a/app/models/demander_status.rb b/app/models/demander_status.rb new file mode 100644 index 00000000..bff52c7a --- /dev/null +++ b/app/models/demander_status.rb @@ -0,0 +1,160 @@ +class DemanderStatus < ActiveRecord::Base + has_one :demander + +# validates :token + validates :receive_hour1, :numericality => {:allow_blank => true} + validates :receive_hour2, :numericality => {:allow_blank => true} + + def supply_default + end + + def overwrite + end + + def own? ad + return false unless ad + ad.is_a?(Admin) + end + + def visible? ad + return false unless ad + ad.is_a?(Admin) + end + + def status + return 0 if self.requested_at.blank? + return 1 if self.requested_at and self.rejected_at + return 3 if self.requested_at and self.approved_at + return 2 if self.requested_at and self.rejected_at.blank? and self.approved_at.blank? + nil + end + + def self.default_page_size + 25 + end + + def self.max_page_size + 100 + end + + def self.default_panel_size + 30 + end + + def self.max_panel_size + 200 + end + + def self.page prm = nil + page = prm.to_i + page = 1 if page < 1 + page + end + + def self.page_size prm = self.default_page_size + page_size = prm.to_i + page_size = self.max_page_size if page_size > self.max_page_size + page_size = self.default_page_size if page_size < 1 + page_size + end + + def self.list page = 1, page_size = self.default_page_size + opt = {} + opt.merge!(DemanderStatus.list_opt) + opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0 + opt.merge!({:order => 'demanders.name'}) + DemanderStatus.find(:all, opt) + end + + def self.requested_list page = 1, page_size = self.default_page_size + opt = {} + opt.merge!(DemanderStatus.list_opt) + opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0 + opt.merge!({:conditions => 'demander_statuses.requested_at is not null and demander_statuses.approved_at is null and demander_statuses.rejected_at is null', :order => 'demanders.name'}) + DemanderStatus.find(:all, opt) + end + + def self.list_opt + {:include => {:demander => {}} } + end + + def self.list_json_opt + {:include => {:demander => {}} } + end + + def self.show pid, ad + opt = {} + opt.merge!(DemanderStatus.show_opt) + res = DemanderStatus.find(pid, opt) + raise ActiveRecord::Forbidden unless res.visible?(ad) + res + end + + def self.edit pid, ad + opt = {} + opt.merge!(DemanderStatus.show_opt) + res = DemanderStatus.find(pid, opt) + raise ActiveRecord::Forbidden unless res.own?(ad) + res + end + + def self.show_opt + {:include => {:demander => {}} } + end + + def self.show_json_opt + {:include => {:demander => {}} } + end + + def request + return false if self.status == 2 or self.status == 3 + self.requested_at = Time.now + self.rejected_at = nil + self.approved_at = nil + self.save + end + + def reject + return false if self.status == 0 or self.status == 1 + r = false + DemanderStatus.transaction do + self.rejected_at = Time.now + self.approved_at = nil + r = self.demander.demand_user.delete_token + raise ActiveRecord::Rollback unless r + r = self.save + end + r + end + + def approve h1, h2 + return false if self.status == 0 or self.status == 3 + r = false + DemanderStatus.transaction do + self.rejected_at = nil + self.approved_at = Time.now + self.receive_hour1 = h1 + self.receive_hour2 = h2 + r = self.demander.demand_user.create_token + raise ActiveRecord::Rollback unless r + r = self.save + end + r + end + + def stop + r = false + DemanderStatus.transaction do + self.requested_at = nil + self.rejected_at = nil + self.approved_at = nil + self.receive_hour1 = nil + self.receive_hour2 = nil + r = self.demander.demand_user.delete_token + raise ActiveRecord::Rollback unless r + r = self.save + end + r + end + +end diff --git a/app/views/demand_users/confirmations/new.html.erb b/app/views/demand_users/confirmations/new.html.erb new file mode 100644 index 00000000..b7ae403c --- /dev/null +++ b/app/views/demand_users/confirmations/new.html.erb @@ -0,0 +1,12 @@ +

Resend confirmation instructions

+ +<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Resend confirmation instructions" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/demand_users/mailer/confirmation_instructions.html.erb b/app/views/demand_users/mailer/confirmation_instructions.html.erb new file mode 100644 index 00000000..a6ea8ca1 --- /dev/null +++ b/app/views/demand_users/mailer/confirmation_instructions.html.erb @@ -0,0 +1,5 @@ +

Welcome <%= @resource.email %>!

+ +

You can confirm your account through the link below:

+ +

<%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>

diff --git a/app/views/demand_users/mailer/reset_password_instructions.html.erb b/app/views/demand_users/mailer/reset_password_instructions.html.erb new file mode 100644 index 00000000..ae9e888a --- /dev/null +++ b/app/views/demand_users/mailer/reset_password_instructions.html.erb @@ -0,0 +1,8 @@ +

Hello <%= @resource.email %>!

+ +

Someone has requested a link to change your password, and you can do this through the link below.

+ +

<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>

+ +

If you didn't request this, please ignore this email.

+

Your password won't change until you access the link above and create a new one.

diff --git a/app/views/demand_users/mailer/unlock_instructions.html.erb b/app/views/demand_users/mailer/unlock_instructions.html.erb new file mode 100644 index 00000000..2263c219 --- /dev/null +++ b/app/views/demand_users/mailer/unlock_instructions.html.erb @@ -0,0 +1,7 @@ +

Hello <%= @resource.email %>!

+ +

Your account has been locked due to an excessive amount of unsuccessful sign in attempts.

+ +

Click the link below to unlock your account:

+ +

<%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %>

diff --git a/app/views/demand_users/passwords/edit.html.erb b/app/views/demand_users/passwords/edit.html.erb new file mode 100644 index 00000000..e75c9371 --- /dev/null +++ b/app/views/demand_users/passwords/edit.html.erb @@ -0,0 +1,16 @@ +

Change your password

+ +<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %> + <%= devise_error_messages! %> + <%= f.hidden_field :reset_password_token %> + +
<%= f.label :password, "New password" %>
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation, "Confirm new password" %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.submit "Change my password" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/demand_users/passwords/new.html.erb b/app/views/demand_users/passwords/new.html.erb new file mode 100644 index 00000000..6c21e9fd --- /dev/null +++ b/app/views/demand_users/passwords/new.html.erb @@ -0,0 +1,12 @@ +

Forgot your password?

+ +<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Send me reset password instructions" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/demand_users/registrations/edit.html.erb b/app/views/demand_users/registrations/edit.html.erb new file mode 100644 index 00000000..ff380509 --- /dev/null +++ b/app/views/demand_users/registrations/edit.html.erb @@ -0,0 +1,25 @@ +

Edit <%= resource_name.to_s.humanize %>

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %> (leave blank if you don't want to change it)
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.label :current_password %> (we need your current password to confirm your changes)
+ <%= f.password_field :current_password %>
+ +
<%= f.submit "Update" %>
+<% end %> + +

Cancel my account

+ +

Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.

+ +<%= link_to "Back", :back %> diff --git a/app/views/demand_users/registrations/new.html.erb b/app/views/demand_users/registrations/new.html.erb new file mode 100644 index 00000000..d15e275a --- /dev/null +++ b/app/views/demand_users/registrations/new.html.erb @@ -0,0 +1,18 @@ +

Sign up

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %>
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.submit "Sign up" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> diff --git a/app/views/demand_users/sessions/new.html.erb b/app/views/demand_users/sessions/new.html.erb new file mode 100644 index 00000000..ff59f7cc --- /dev/null +++ b/app/views/demand_users/sessions/new.html.erb @@ -0,0 +1,17 @@ +

Sign in

+ +<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %>
+ <%= f.password_field :password %>
+ + <% if devise_mapping.rememberable? -%> +
<%= f.check_box :remember_me %> <%= f.label :remember_me %>
+ <% end -%> + +
<%= f.submit "Sign in" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/demand_users/shared/_links.erb b/app/views/demand_users/shared/_links.erb new file mode 100644 index 00000000..eab783a4 --- /dev/null +++ b/app/views/demand_users/shared/_links.erb @@ -0,0 +1,25 @@ +<%- if controller_name != 'sessions' %> + <%= link_to "Sign in", new_session_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.registerable? && controller_name != 'registrations' %> + <%= link_to "Sign up", new_registration_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.recoverable? && controller_name != 'passwords' %> + <%= link_to "Forgot your password?", new_password_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> + <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> + <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.omniauthable? %> + <%- resource_class.omniauth_providers.each do |provider| %> + <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %>
+ <% end -%> +<% end -%> \ No newline at end of file diff --git a/app/views/demand_users/unlocks/new.html.erb b/app/views/demand_users/unlocks/new.html.erb new file mode 100644 index 00000000..c6cdcfe5 --- /dev/null +++ b/app/views/demand_users/unlocks/new.html.erb @@ -0,0 +1,12 @@ +

Resend unlock instructions

+ +<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Resend unlock instructions" %>
+<% end %> + +<%= render :partial => "devise/shared/links" %> \ No newline at end of file diff --git a/app/views/demander_statuses/_basic.html.erb b/app/views/demander_statuses/_basic.html.erb new file mode 100644 index 00000000..6cf73193 --- /dev/null +++ b/app/views/demander_statuses/_basic.html.erb @@ -0,0 +1,16 @@ +

+requested_at +<%= (demander_status.requested_at) if demander_status.requested_at %> +

+

+rejected_at +<%= (demander_status.rejected_at) if demander_status.rejected_at %> +

+

+approved_at +<%= (demander_status.approved_at) if demander_status.approved_at %> +

+

+token +<%= (demander_status.demander.demand_user.authentication_token) if demander_status.demander.demand_user.authentication_token %> +

diff --git a/app/views/demander_statuses/_demander.html.erb b/app/views/demander_statuses/_demander.html.erb new file mode 100644 index 00000000..e7c077ef --- /dev/null +++ b/app/views/demander_statuses/_demander.html.erb @@ -0,0 +1,16 @@ +

+caption +<%= h(demander.caption) %> +

+

+name +<%= h(demander.name) %> +

+

+description +<%= h(demander.description) %> +

+

+status +<%= h(MagicNumber['demander_status_items'][demander.demander_status.status].first) %> +

diff --git a/app/views/demander_statuses/_form.html.erb b/app/views/demander_statuses/_form.html.erb new file mode 100644 index 00000000..e9234e64 --- /dev/null +++ b/app/views/demander_statuses/_form.html.erb @@ -0,0 +1,28 @@ +<%= form_for(@demander_status) do |f| %> + <% if @demander_status.errors.any? %> +
+

<%= pluralize(@demander_status.errors.count, "error") %> prohibited this comic from being saved:

+ + +
+ <% end %> + +
+

+ <%= f.label :receive_hour1 %>
+ <%= f.number_field :receive_hour1 %> +

+

+ <%= f.label :receive_hour2 %>
+ <%= f.number_field :receive_hour2 %> +

+
+ +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/demander_statuses/edit.html.erb b/app/views/demander_statuses/edit.html.erb new file mode 100644 index 00000000..99ca4db0 --- /dev/null +++ b/app/views/demander_statuses/edit.html.erb @@ -0,0 +1,7 @@ +

貸与状況

+

<%= notice %>

+ +<%= render 'demander', :demander => @demander_status.demander %> +<%= render 'basic', :demander_status => @demander_status %> +<%= render 'form' %> + diff --git a/app/views/demander_statuses/index.html.erb b/app/views/demander_statuses/index.html.erb new file mode 100644 index 00000000..16251c51 --- /dev/null +++ b/app/views/demander_statuses/index.html.erb @@ -0,0 +1,53 @@ +

貸与状況一覧

+ + + + + + + + + + + + + + <% @demander_statuses.each do |demander_status| %> + + + + + + + + + + + + <% end %> +
captionnamestatusrequested_atrejected_atapproved_atreceive_hour1receive_hour2開く
+ <%= link_to h(truncate(demander_status.demander.caption, :length => 20)), demander_status_path(demander_status.demander) %> + + <%= h(truncate(demander_status.demander.name, :length => 12)) %> + + <%= h(MagicNumber['demander_status_items'][demander_status.status].first) %> + + <%= (demander_status.requested_at) if demander_status.requested_at %> + + <%= (demander_status.rejected_at) if demander_status.rejected_at %> + + <%= (demander_status.approved_at) if demander_status.approved_at %> + + <%= (demander_status.receive_hour1) if demander_status.receive_hour1 %> + + <%= (demander_status.receive_hour2) if demander_status.receive_hour2 %> + + <%= link_to '開く', demander_status.demander.url %> +
+
+<% if @hide.blank? %> + <%= link_to '申請中の借手の貸与状況だけを表示する', demander_statuses_path(:hide => 1) %> +<% else %> + <%= link_to 'すべての借手の貸与状況を表示する', demander_statuses_path %> +<% end %> +
diff --git a/app/views/demander_statuses/show.html.erb b/app/views/demander_statuses/show.html.erb new file mode 100644 index 00000000..92eefbca --- /dev/null +++ b/app/views/demander_statuses/show.html.erb @@ -0,0 +1,36 @@ +

貸与状況

+

<%= notice %>

+ +<%= render 'demander', :demander => @demander_status.demander %> +<%= render 'basic', :demander_status => @demander_status %> + +

+receive_hour1 +<%= h(@demander_status.receive_hour1) if @demander_status.receive_hour1 %> +

+

+receive_hour2 +<%= h(@demander_status.receive_hour2) if @demander_status.receive_hour2 %> +

+ +

+ <%= link_to 'サイトを開く', @demander_status.demander.url %> +

+ +

+ <% case @demander_status.status %> + <% when 0 %> + <% when 1 %> + <%= link_to 'この借手の否決を覆して貸与する', edit_demander_status_path(@demander_status) %> + <% when 2 %> +

+ 借受申請に対して返答してください +

+ <%= link_to 'この借手に貸与を開始する', edit_demander_status_path(@demander_status) %> + <%= link_to 'この借手には貸与しない', demander_status_path(@demander_status), :method => :delete %> + <% when 3 %> + <%= link_to 'この借手の貸与を停止する', demander_status_path(@demander_status), :method => :delete %> + <% end %> +

+<%= link_to 'Back', demander_statuses_path %> + diff --git a/app/views/demanders/_form.html.erb b/app/views/demanders/_form.html.erb new file mode 100644 index 00000000..33223167 --- /dev/null +++ b/app/views/demanders/_form.html.erb @@ -0,0 +1,38 @@ +<%= form_for(@demander) do |f| %> + <% if @demander.errors.any? %> +
+

<%= pluralize(@demander.errors.count, "error") %> prohibited this comic from being saved:

+ + +
+ <% end %> + +
+ <%= f.label :name %>
+ <%= f.text_field :name %> +
+
+ <%= f.label :caption %>
+ <%= f.text_field :caption %> +
+
+ <%= f.label :url %>
+ <%= f.text_field :url %> +
+
+ <%= f.label :description %>
+ <%= f.text_area :description %> +
+
+ <%= f.label :demander_url %>
+ <%= f.text_field :demander_url %> +
+ +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/demanders/edit.html.erb b/app/views/demanders/edit.html.erb new file mode 100644 index 00000000..7bb4aa76 --- /dev/null +++ b/app/views/demanders/edit.html.erb @@ -0,0 +1,4 @@ +

edit Demander

+ +<%= render 'form' %> +<%= link_to 'Back', demanders_path %> diff --git a/app/views/demanders/index.html.erb b/app/views/demanders/index.html.erb new file mode 100644 index 00000000..f778c69f --- /dev/null +++ b/app/views/demanders/index.html.erb @@ -0,0 +1,37 @@ +

借手メニュー

+ +

+caption +<%= h(@demander.caption) %> +

+

+name +<%= h(@demander.name) %> +

+

+status +<%= h(MagicNumber['demander_status_items'][@demander.demander_status.status].first) %> +

+<% if @demander.status == 3 %> +

+ receive_hour1 + <%= (@demander.demander_status.receive_hour1) %> +

+

+ receive_hour2 + <%= (@demander.demander_status.receive_hour2) %> +

+<% end %> + +
+ <%= link_to 'サイトプロフィールを表示する', demander_path(@demander) %> + <% case @demander.status %> + <% when 0, 1 %> + <%= form_tag(:action => :req) do %> + <%= submit_tag 'request' -%> + <% end -%> + <% when 2 %> + <% when 3 %> + <%= link_to '借受を中止する', demander_path(@demander), :method => :delete %> + <% end -%> +
diff --git a/app/views/demanders/new.html.erb b/app/views/demanders/new.html.erb new file mode 100644 index 00000000..a433bc50 --- /dev/null +++ b/app/views/demanders/new.html.erb @@ -0,0 +1,5 @@ +

New Demander

+ +<%= render 'form' %> + +<%= link_to 'Back', demanders_path %> diff --git a/app/views/demanders/show.html.erb b/app/views/demanders/show.html.erb new file mode 100644 index 00000000..ca052a87 --- /dev/null +++ b/app/views/demanders/show.html.erb @@ -0,0 +1,32 @@ +

借手

+

<%= notice %>

+ +

+caption +<%= h(@demander.caption) %> +

+

+name +<%= h(@demander.name) %> +

+

+url +<%= @demander.url %> +

+

+description +<%= h(@demander.description) %> +

+

+demander_url +<%= @demander.demander_url %> +

+ +

+status +<%= h(MagicNumber['demander_status_items'][@demander.demander_status.status].first) %> +

+ +<%= link_to 'Edit', edit_demander_path(@demander) %> +<%= link_to 'Back', demanders_path %> + diff --git a/db/migrate/20121123051900_devise_create_demand_users.rb b/db/migrate/20121123051900_devise_create_demand_users.rb new file mode 100644 index 00000000..13410a52 --- /dev/null +++ b/db/migrate/20121123051900_devise_create_demand_users.rb @@ -0,0 +1,25 @@ +class DeviseCreateDemandUsers < ActiveRecord::Migration + def change + create_table(:demand_users) do |t| + t.database_authenticatable :null => false + t.recoverable + t.rememberable + t.trackable + + # t.encryptable + t.confirmable + # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both + t.token_authenticatable + + + t.timestamps + end + + add_index :demand_users, :email, :unique => true + add_index :demand_users, :reset_password_token, :unique => true + add_index :demand_users, :confirmation_token, :unique => true + # add_index :demand_users, :unlock_token, :unique => true + add_index :demand_users, :authentication_token, :unique => true + end + +end diff --git a/db/migrate/20121123054410_create_demanders.rb b/db/migrate/20121123054410_create_demanders.rb new file mode 100644 index 00000000..addddbea --- /dev/null +++ b/db/migrate/20121123054410_create_demanders.rb @@ -0,0 +1,15 @@ +class CreateDemanders < ActiveRecord::Migration + def change + create_table :demanders do |t| + t.integer :demand_user_id, :null => false, :default => 0 + t.string :name, :null => false, :limit => 50 + t.string :caption, :null => false, :limit => 30 + t.string :url, :null => false + t.string :description, :null => false + t.string :demander_url, :null => false + t.integer :demander_status_id, :null => false, :default => 0 + + t.timestamps + end + end +end diff --git a/db/migrate/20121123054445_create_demander_statuses.rb b/db/migrate/20121123054445_create_demander_statuses.rb new file mode 100644 index 00000000..79f01d17 --- /dev/null +++ b/db/migrate/20121123054445_create_demander_statuses.rb @@ -0,0 +1,14 @@ +class CreateDemanderStatuses < ActiveRecord::Migration + def change + create_table :demander_statuses do |t| + t.datetime :requested_at + t.datetime :rejected_at + t.datetime :approved_at + t.string :token + t.integer :receive_hour1 + t.integer :receive_hour2 + + t.timestamps + end + end +end diff --git a/spec/controllers/demander_statuses_controller_spec.rb b/spec/controllers/demander_statuses_controller_spec.rb new file mode 100644 index 00000000..70e99e18 --- /dev/null +++ b/spec/controllers/demander_statuses_controller_spec.rb @@ -0,0 +1,462 @@ +# -*- encoding: utf-8 -*- +#貸与状況 +require 'spec_helper' + +describe DemanderStatusesController do + before do + @admin = FactoryGirl.create :admin + @sp = FactoryGirl.create :system_picture + @lg = FactoryGirl.create :license_group + @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id + @user = FactoryGirl.create :user_yas + @author = @user.author #ユーザ作成時に連動して作成される + @demand_user = FactoryGirl.create :demand_user + end + + describe '一覧表示に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + DemanderStatus.stub(:list).and_return([@ds, @ds, @ds]) + DemanderStatus.stub(:requested_list).and_return([@ds, @ds]) + sign_in @admin + end + context '事前チェックする' do + it '与えられたpageがセットされている' do + get :index, :page => 5 + assigns(:page).should eq 5 + end + it '省略されると@pageに1値が入る' do + get :index + assigns(:page).should eq 1 + end + it '与えられたpage_sizeがセットされている' do + get :index, :page_size => 15 + assigns(:page_size).should eq 15 + end + it '省略されると@page_sizeにデフォルト値が入る' do + get :index + assigns(:page_size).should eq DemanderStatus.default_page_size + end + it '最大を超えると@page_sizeにデフォルト最大値が入る' do + get :index, :page_size => 1500 + assigns(:page_size).should eq DemanderStatus.max_page_size + end + it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do + get :index, :page_size => 0 + assigns(:page_size).should eq DemanderStatus.default_page_size + end + end + context 'つつがなく終わるとき' do + it 'ステータスコード200 OKを返す' do + get :index + response.should be_success + end + it '@hideが空になっている' do + get :index + assigns(:hide).should be_blank + end + it '貸与状況モデルに全一覧取得を問い合わせている' do + DemanderStatus.should_receive(:list).exactly(1) + get :index + end + it '@demander_statusesにリストを取得している' do + get :index + assigns(:demander_statuses).should have_at_least(3).items + end + context 'html形式' do + it 'indexテンプレートを描画する' do + get :index + response.should render_template("index") + end + end + context 'json形式' do + it 'jsonデータを返す' do + get :index, :format => :json + lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError) + end + it '貸与状況モデルにjson一覧出力オプションを問い合わせている' do + DemanderStatus.should_receive(:list_json_opt).exactly(1) + get :index, :format => :json + end + it 'データがリスト構造になっている' do + get :index, :format => :json + json = JSON.parse response.body + json.should have_at_least(3).items + end + it 'リストの先頭くらいは貸与状況っぽいものであって欲しい' do + get :index, :format => :json + json = JSON.parse response.body + json.first.has_key?("token").should be_true + json.first.has_key?("receive_hour1").should be_true + json.first.has_key?("receive_hour2").should be_true + json.first.has_key?("requested_at").should be_true + end + end + end + context '除外フラグが除外のとき' do + it '@hideが設定されている' do + get :index, :hide => 1 + assigns(:hide).should_not be_blank + end + it '貸与状況モデルに申請中一覧取得を問い合わせている' do + DemanderStatus.should_receive(:requested_list).exactly(1) + get :index, :hide => 1 + end + it '@demander_statusesにリストを取得している' do + get :index, :hide => 1 + assigns(:demander_statuses).should have_at_least(2).items + end + end + context '管理者権限がないとき' do + before do + sign_out @admin + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + get :index + response.status.should eq 302 + end + it 'サインインページへ遷移する' do + get :index + response.should redirect_to '/admins/sign_in' + end + end + context 'json形式' do + it 'ステータスコード401 Unauthorizedを返す' do + get :index, :format => :json + response.status.should eq 401 + end + it '応答メッセージにUnauthorizedを返す' do + get :index, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + end + + describe '単体表示に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + DemanderStatus.stub(:show).and_return(@ds) + sign_in @admin + end + context 'つつがなく終わるとき' do + it 'ステータスコード200 OKを返す' do + get :show, :id => @ds.id + response.should be_success + end + it '貸与状況モデルに単体取得を問い合わせている' do + DemanderStatus.should_receive(:show).exactly(1) + get :show + end + it '@demander_statusにアレを取得している' do + get :show, :id => @ds.id + assigns(:demander_status).should eq(@ds) + end + context 'html形式' do + it 'showテンプレートを描画する' do + get :show, :id => @ds.id + response.should render_template("show") + end + end + context 'json形式' do + it 'jsonデータを返す' do + get :show, :id => @ds.id, :format => :json + lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError) + end + it '貸与状況モデルにjson単体出力オプションを問い合わせている' do + DemanderStatus.should_receive(:show_json_opt).exactly(1) + get :show, :id => @ds.id, :format => :json + end + it 'データがアレになっている' do + get :show, :id => @ds.id, :format => :json + json = JSON.parse response.body + json.has_key?("token").should be_true + json.has_key?("receive_hour1").should be_true + json.has_key?("receive_hour2").should be_true + json.has_key?("requested_at").should be_true + end + end + end + context '管理者権限がないとき' do + before do + sign_out @admin + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + get :show, :id => @ds.id + response.status.should eq 302 + end + it 'サインインページへ遷移する' do + get :show, :id => @ds.id + response.body.should redirect_to '/admins/sign_in' + end + end + context 'json形式' do + it 'ステータスコード401 Unauthorizedを返す' do + get :show, :id => @ds.id, :format => :json + response.status.should eq 401 + end + it '応答メッセージにUnauthorizedを返す' do + get :show, :id => @ds.id, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + end + + describe '編集フォーム表示に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + sign_in @admin + DemanderStatus.stub(:edit).with(@ds.id.to_s, @admin).and_return(@ds) + end + context 'つつがなく終わるとき' do + it 'ステータスコード200 OKを返す' do + get :edit, :id => @ds.id + response.should be_success + end + it '貸与状況モデルに編集取得を問い合わせている' do + DemanderStatus.should_receive(:edit).exactly(1) + get :edit, :id => @ds.id + end + it '@demander_statusにデータを用意している' do + get :edit, :id => @ds.id + assigns(:demander_status).should eq @ds + end + context 'html形式' do + it 'editテンプレートを描画する' do + get :edit, :id => @ds.id + response.should render_template("edit") + end + end + end + context '管理者権限がないとき' do + before do + sign_out @admin + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + get :edit, :id => @ds.id + response.status.should eq 302 + end + it 'サインインページへ遷移する' do + get :edit, :id => @ds.id + response.body.should redirect_to '/admins/sign_in' + end + end + end + end + + describe '更新に於いて' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + @attr = {:receive_hour1 => 12, :receive_hour2 => 22} + sign_in @admin + end + context '事前チェックしておく' do + it '貸与状況モデルに編集取得を問い合わせている' do + DemanderStatus.stub(:edit).with(any_args()).and_return @ds + DemanderStatus.should_receive(:edit).exactly(1) + put :update, :id => @ds.id, :demander_status => @attr + end + it '貸与状況モデルに貸与承認を依頼している' do + DemanderStatus.any_instance.stub(:approve).with(any_args).and_return true + DemanderStatus.any_instance.should_receive(:approve).with('12', '22').exactly(1) + put :update, :id => @ds.id, :demander_status => @attr + end + it '@demander_statusにアレを取得している' do + put :update, :id => @ds.id, :demander_status => @attr + assigns(:demander_status).id.should eq(@ds.id) + end + end + context 'つつがなく終わるとき' do + it '更新される' do + put :update, :id => @ds.id, :demander_status => @attr + DemanderStatus.find(@ds.id).receive_hour1.should eq 12 + DemanderStatus.find(@ds.id).receive_hour2.should eq 22 + end + context 'html形式' do + before do + end + it 'ステータスコード302 Foundを返す' do + put :update, :id => @ds.id, :demander_status => @attr + response.status.should eq 302 + end + it '更新された貸与状況の表示ページへ遷移する' do + put :update, :id => @ds.id, :demander_status => @attr + response.should redirect_to(@ds) + end + end + context 'json形式' do + before do + DemanderStatus.any_instance.stub(:approve).with(any_args()).and_return(true) + end + it 'ステータスコード200 OKを返す' do + put :update, :id => @ds.id, :demander_status => @attr, :format => :json + response.should be_success + end + it 'ページ本体は特に返さない' do + put :update, :id => @ds.id, :demander_status => @attr, :format => :json + response.body.should match /./ + end + end + end + context '管理者権限がないとき' do + before do + sign_out @admin + end + it 'ステータスコード302 Foundを返す' do + put :update, :id => @ds.id, :demander_status => @attr + response.status.should eq 302 + end + context 'html形式' do + it 'サインインページへ遷移する' do + put :update, :id => @ds.id, :demander_status => @attr + response.body.should redirect_to '/admins/sign_in' + end + end + context 'json形式' do + it '応答メッセージにUnauthorizedを返す' do + put :update, :id => @ds.id, :demander_status => @attr, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + context '検証、保存に失敗したとき' do + before do + DemanderStatus.any_instance.stub(:approve).with(any_args()).and_return(false) + end + context 'html形式' do + it 'ステータスコード200 Okを返す' do + put :update, :id => @ds.id, :demander_status => @attr + response.status.should eq 200 + end + it '編集ページを描画する' do + put :update, :id => @ds.id, :demander_status => @attr + response.should render_template("edit") + end + end + context 'json形式' do + it 'ステータスコード422 unprocessable_entity を返す' do + DemanderStatus.any_instance.stub(:save).and_return(false) + put :update, :id => @ds.id, :demander_status => @attr, :format => :json + response.status.should eq 422 + end + it '応答メッセージUnprocessable Entityを返す' do + put :update, :id => @ds.id, :demander_status => @attr, :format => :json + response.message.should match(/Unprocessable/) + end + end + end + end + + describe '貸与停止に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + sign_in @admin + end + context '事前チェックしておく' do + it '貸与状況モデルに編集取得を問い合わせている' do + DemanderStatus.stub(:edit).with(any_args()).and_return @ds + DemanderStatus.should_receive(:edit).exactly(1) + delete :destroy, :id => @ds.id + end + it 'モデルに貸与停止を依頼する' do + DemanderStatus.any_instance.stub(:reject).with(any_args).and_return true + DemanderStatus.any_instance.should_receive(:reject).exactly(1) + delete :destroy, :id => @ds.id + end + it '@demander_statusにアレを取得している' do + delete :destroy, :id => @ds.id + assigns(:demander_status).should eq(@ds) + end + end + context 'つつがなく終わるとき' do + before do + DemanderStatus.any_instance.stub(:reject).with(any_args()).and_return(true) + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + delete :destroy, :id => @ds.id + response.status.should eq 302 + end + it '貸与状況閲覧(show)ページに遷移するする' do + delete :destroy, :id => @ds.id + response.should redirect_to(@ds) + end + it '一時的メッセージに処理成功を設定する' do + delete :destroy, :id => @ds.id + flash[:notice].should match /success/ + end + end + context 'json形式' do + it 'ステータスコード200 OKを返す' do + delete :destroy, :id => @ds.id, :format => :json + response.should be_success + end + it 'ページ本体は特に返さない' do + delete :destroy, :id => @ds.id, :format => :json + response.body.should match /./ + end + end + end + context '管理者権限がないとき' do + before do + sign_out @admin + end + it 'ステータスコード302 Foundを返す' do + delete :destroy, :id => @ds.id + response.status.should eq 302 + end + context 'html形式' do + it 'サインインページへ遷移する' do + delete :destroy, :id => @ds.id + response.body.should redirect_to '/admins/sign_in' + end + end + context 'json形式' do + it '応答メッセージにUnauthorizedを返す' do + delete :destroy, :id => @ds.id, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + + context '否決に失敗した(否決できる状態でなかった)とき' do + before do + DemanderStatus.any_instance.stub(:reject).with(any_args).and_return(false) + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + delete :destroy, :id => @ds.id + response.status.should eq 302 + end + it '貸与状況閲覧(show)ページに遷移するする' do + delete :destroy, :id => @ds.id + response.should redirect_to(@ds) + end + it '一時的メッセージに処理失敗を設定する' do + delete :destroy, :id => @ds.id + flash[:notice].should match /not/ + end + end + context 'json形式' do + it 'ステータスコード422 unprocessable_entity を返す' do + delete :destroy, :id => @ds.id, :format => :json + response.status.should eq 422 + end + it '応答メッセージUnprocessable Entityを返す' do + delete :destroy, :id => @ds.id, :format => :json + response.message.should match(/Unprocessable/) + end + end + end + end + +end diff --git a/spec/controllers/demanders_controller_spec.rb b/spec/controllers/demanders_controller_spec.rb new file mode 100644 index 00000000..c5f513f7 --- /dev/null +++ b/spec/controllers/demanders_controller_spec.rb @@ -0,0 +1,605 @@ +# -*- encoding: utf-8 -*- +require 'spec_helper' +#借手 + +describe DemandersController do + before do + @admin = FactoryGirl.create :admin + @sp = FactoryGirl.create :system_picture + @lg = FactoryGirl.create :license_group + @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id + @user = FactoryGirl.create :user_yas + @author = @user.author #ユーザ作成時に連動して作成される + @demand_user = FactoryGirl.create :demand_user + end + + describe '借手メニューに於いて' do + before do + sign_in @demand_user + end + context 'つつがなく終わるとき' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + it 'ステータスコード200 OKを返す' do + get :index + response.should be_success + end + it '借手アカウントから@demanderに借手を取得している' do + get :index + assigns(:demander).should eq(@demander) + end + context 'html形式' do + it 'indexテンプレートを描画する' do + get :index + response.should render_template("index") + end + end + context 'json形式' do + end + end + context '借手が存在しなかったとき' do + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + get :index + response.status.should eq 302 + end + it 'プロフィール登録ページへ遷移する' do + get :index + response.body.should redirect_to new_demander_path + end + end + end + context '借手権限がないとき' do + before do + sign_out @demand_user + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + get :index + response.status.should eq 302 + end + it 'サインインページへ遷移する' do + get :index + response.body.should redirect_to '/demand_users/sign_in' + end + end + context 'json形式' do + end + end + end + + describe '新規作成フォーム表示に於いて' do + before do + sign_in @demand_user + end + context 'つつがなく終わるとき' do + it 'ステータスコード200 OKを返す' do + get :new + response.should be_success + end + it '@demanderに新規データを用意している' do + get :new + assigns(:demander).should be_a_new(Demander) + end + it '借手モデルにデフォルト値補充を依頼している' do + Demander.any_instance.should_receive(:supply_default).exactly(1) + get :new + end + context 'html形式' do + it 'newテンプレートを描画する' do + get :new + response.should render_template("new") + end + end + context 'json形式' do + it 'jsonデータを返す' do + get :new, :format => :json + lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError) + end + it '借手モデルにjson単体出力オプションを問い合わせている' do + Demander.should_receive(:show_json_opt).exactly(1) + get :new, :format => :json + end + end + end + context '借手権限がないとき' do + before do + sign_out @demand_user + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + get :new + response.status.should eq 302 + end + it 'サインインページへ遷移する' do + get :new + response.body.should redirect_to '/demand_users/sign_in' + end + end + context 'json形式' do + it 'ステータスコード401 Unauthorizedを返す' do + get :new, :format => :json + response.status.should eq 401 + end + it '応答メッセージにUnauthorizedを返す' do + get :new, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + end + + describe '新規作成に於いて' do + before do + sign_in @demand_user + @attr = FactoryGirl.attributes_for(:demander, :demand_user_id => @demand_user.id, :caption => 'normal') + end + context '事前チェックしておく' do + it '借手モデルにデフォルト値補充を依頼している' do + Demander.any_instance.should_receive(:supply_default).exactly(1) + post :create, :demander => @attr + end + it '借手モデルにカラム値復元を依頼している' do + Demander.any_instance.should_receive(:attributes=).exactly(1) + post :create, :demander => @attr + end + it '借手モデルに上書き補充を依頼している' do + Demander.any_instance.should_receive(:overwrite).exactly(1) + post :create, :demander => @attr + end + it 'モデルに保存依頼する' do + Demander.any_instance.should_receive(:store).exactly(1) + post :create, :demander => @attr + end + end + context 'つつがなく終わるとき' do + it "@demanderに作成された借手を保持していて、それがDBにある" do + post :create, :demander => @attr + assigns(:demander).should be_a(Demander) + assigns(:demander).should be_persisted + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + Demander.any_instance.stub(:store).and_return(true) + post :create, :demander => @attr + response.status.should eq 302 + end + it '作成された借手の表示ページへ遷移する' do +# Demander.any_instance.stub(:save).and_return(true) + post :create, :demander => @attr + response.should redirect_to(Demander.last) + end + end + context 'json形式' do + it 'ステータスコード200 OKを返す' do +# Demander.any_instance.stub(:save).and_return(true) + post :create, :demander => @attr, :format => :json + response.should be_success + end + it '作成された借手をjsonデータで返す' do + post :create, :demander => @attr, :format => :json + lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError) + end + it 'データがアレになっている' do + post :create, :demander => @attr, :format => :json + json = JSON.parse response.body + json["caption"].should match(/normal/) + end + end + end + context '借手権限がないとき' do + before do + sign_out @demand_user + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + post :create, :demander => @attr + response.status.should eq 302 + end + it 'サインインページへ遷移する' do + post :create, :demander => @attr + response.body.should redirect_to '/demand_users/sign_in' + end + end + context 'json形式' do + it 'ステータスコード401 Unauthorizedを返す' do + post :create, :demander => @attr, :format => :json + response.status.should eq 401 + end + it '応答メッセージにUnauthorizedを返す' do + post :create, :demander => @attr, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + context '検証、保存に失敗した' do + before do + Demander.any_instance.stub(:store).and_return(false) + end + it "未保存の借手を保持している" do + post :create, :demander => @attr + assigns(:demander).should be_a_new(Demander) + end + context 'html形式' do + it 'ステータスコード200 OKを返す' do + post :create, :demander => @attr + response.status.should eq 200 + end + it '新規ページを描画する' do + post :create, :demander => @attr + response.should render_template("new") + end + end + context 'json形式' do + it 'ステータスコード422 unprocessable_entity を返す' do + post :create, :demander => @attr, :format => :json + response.status.should eq 422 + end + it '応答メッセージUnprocessable Entityを返す' do + post :create, :demander => @attr, :format => :json + response.message.should match(/Unprocessable/) + end + end + end + end + + describe '編集フォーム表示に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + sign_in @demand_user + Demander.stub(:edit).and_return(@demander) + end + context 'つつがなく終わるとき' do + it 'ステータスコード200 OKを返す' do + get :edit, :id => @demander.id + response.should be_success + end + it '借手モデルに編集取得を問い合わせている' do + Demander.should_receive(:edit).exactly(1) + get :edit, :id => @demander.id + end + it '@demanderにデータを用意している' do + get :edit, :id => @demander.id + assigns(:demander).should eq @demander + end + context 'html形式' do + it 'editテンプレートを描画する' do + get :edit, :id => @demander.id + response.should render_template("edit") + end + end + end + context '借手権限がないとき' do + before do + sign_out @demand_user + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + get :edit, :id => @demander.id + response.status.should eq 302 + end + it 'サインインページへ遷移する' do + get :edit, :id => @demander.id + response.body.should redirect_to '/demand_users/sign_in' + end + end + end + end + + describe '更新に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + @attr = FactoryGirl.attributes_for(:demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id, :caption => 'updated caption') + sign_in @demand_user + end + context '事前チェックしておく' do + it '借手モデルに編集取得を問い合わせている' do + Demander.stub(:edit).with(any_args()).and_return @demander + Demander.should_receive(:edit).exactly(1) + put :update, :id => @demander.id, :demander => @attr + end + it '借手モデルにカラム値復元を依頼している' do + Demander.any_instance.should_receive(:attributes=).exactly(1) + put :update, :id => @demander.id, :demander => @attr + end + it '借手モデルに上書き補充を依頼している' do + Demander.any_instance.should_receive(:overwrite).exactly(1) + put :update, :id => @demander.id, :demander => @attr + end + it 'モデルに更新を依頼する' do + Demander.any_instance.stub(:store).with(any_args).and_return true + Demander.any_instance.should_receive(:store).exactly(1) + put :update, :id => @demander.id, :demander => @attr + end + it '@demanderにアレを取得している' do + put :update, :id => @demander.id, :demander => @attr + assigns(:demander).id.should eq(@demander.id) + end + end + context 'つつがなく終わるとき' do + it '更新される' do + put :update, :id => @demander.id, :demander => @attr + Demander.find(@demander.id).caption.should match /updated/ + end + context 'html形式' do + before do + Demander.any_instance.stub(:store).with(any_args()).and_return(true) + end + it 'ステータスコード302 Foundを返す' do + put :update, :id => @demander.id, :demander => @attr + response.status.should eq 302 + end + it '更新された借手の表示ページへ遷移する' do + put :update, :id => @demander.id, :demander => @attr + response.should redirect_to(@demander) + end + end + context 'json形式' do + before do + Demander.any_instance.stub(:store).with(any_args()).and_return(true) + end + it 'ステータスコード200 OKを返す' do + put :update, :id => @demander.id, :demander => @attr, :format => :json + response.should be_success + end + it 'ページ本体は特に返さない' do + put :update, :id => @demander.id, :demander => @attr, :format => :json + response.body.should match /./ + end + end + end + context '借手権限がないとき' do + before do + sign_out @demand_user + end + it 'ステータスコード302 Foundを返す' do + put :update, :id => @demander.id, :demander => @attr + response.status.should eq 302 + end + context 'html形式' do + it 'サインインページへ遷移する' do + put :update, :id => @demander.id, :demander => @attr + response.body.should redirect_to '/demand_users/sign_in' + end + end + context 'json形式' do + it '応答メッセージにUnauthorizedを返す' do + put :update, :id => @demander.id, :demander => @attr, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + context '検証、保存に失敗したとき' do + before do + Demander.any_instance.stub(:store).and_return(false) + end + context 'html形式' do + it 'ステータスコード200 Okを返す' do + put :update, :id => @demander.id, :demander => @attr + response.status.should eq 200 + end + it '編集ページを描画する' do + put :update, :id => @demander.id, :demander => @attr + response.should render_template("edit") + end + end + context 'json形式' do + it 'ステータスコード422 unprocessable_entity を返す' do + Demander.any_instance.stub(:save).and_return(false) + put :update, :id => @demander.id, :demander => @attr, :format => :json + response.status.should eq 422 + end + it '応答メッセージUnprocessable Entityを返す' do + put :update, :id => @demander.id, :demander => @attr, :format => :json + response.message.should match(/Unprocessable/) + end + end + end + end + + describe '借受申請に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + @attr = FactoryGirl.attributes_for(:demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id, :caption => 'updated caption') + sign_in @demand_user + end + context '事前チェックしておく' do + it '借手モデルの貸与状況に借受申請を依頼している' do + DemanderStatus.stub(:request).with(any_args()).and_return true + DemanderStatus.any_instance.should_receive(:request).exactly(1) + post :req + end + end + context 'つつがなく終わるとき' do + context 'html形式' do + before do + DemanderStatus.any_instance.stub(:request).with(any_args()).and_return(true) + end + it 'ステータスコード302 Foundを返す' do + post :req + response.status.should eq 302 + end + it '借手ホーム(index)ページへ遷移する' do + post :req + response.should redirect_to(demanders_path) + end + it '一時的メッセージに処理成功を設定する' do + post :req + flash[:notice].should match /success/ + end + end + context 'json形式' do + before do + DemanderStatus.any_instance.stub(:request).with(any_args()).and_return(true) + end + it 'ステータスコード200 OKを返す' do + post :req, :format => :json + response.should be_success + end + it 'ページ本体は特に返さない' do + post :req, :format => :json + response.body.should match /./ + end + end + end + context '借手権限がないとき' do + before do + sign_out @demand_user + end + it 'ステータスコード302 Foundを返す' do + post :req + response.status.should eq 302 + end + context 'html形式' do + it 'サインインページへ遷移する' do + post :req + response.body.should redirect_to '/demand_users/sign_in' + end + end + context 'json形式' do + it '応答メッセージにUnauthorizedを返す' do + post :req, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + context '検証、保存に失敗したとき' do + before do + DemanderStatus.any_instance.stub(:request).with(any_args()).and_return(false) + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + post :req + response.status.should eq 302 + end + it '借手ホーム(index)ページへ遷移する' do + post :req + response.should redirect_to(demanders_path) + end + it '一時的メッセージに処理失敗を設定する' do + post :req + flash[:notice].should match /not/ + end + end + context 'json形式' do + it 'ステータスコード422 unprocessable_entity を返す' do + post :req, :format => :json + response.status.should eq 422 + end + it '応答メッセージUnprocessable Entityを返す' do + post :req, :format => :json + response.message.should match(/Unprocessable/) + end + end + end + end + + describe '借受停止に於いて' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + sign_in @demand_user + end + context '事前チェックしておく' do + it '借手モデルに編集取得を問い合わせている' do + Demander.stub(:edit).with(any_args()).and_return @demander + Demander.should_receive(:edit).exactly(1) + delete :destroy, :id => @demander.id + end + it '借手モデルに借受停止を依頼する' do + Demander.any_instance.stub(:stop).with(any_args).and_return true + Demander.any_instance.should_receive(:stop).exactly(1) + delete :destroy, :id => @demander.id + end + it '@demanderにアレを取得している' do + delete :destroy, :id => @demander.id + assigns(:demander).should eq(@demander) + end + end + context 'つつがなく終わるとき' do + before do + Demander.any_instance.stub(:stop).with(any_args()).and_return(true) + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + delete :destroy, :id => @demander.id + response.status.should eq 302 + end + it '借手ホーム(index)ページに遷移する' do + delete :destroy, :id => @demander.id + response.should redirect_to(demanders_path) + end + it '一時的メッセージに処理成功を設定する' do + delete :destroy, :id => @demander.id + flash[:notice].should match /success/ + end + end + context 'json形式' do + it 'ステータスコード200 OKを返す' do + delete :destroy, :id => @demander.id, :format => :json + response.should be_success + end + it 'ページ本体は特に返さない' do + delete :destroy, :id => @demander.id, :format => :json + response.body.should match /./ + end + end + end + context '管理者権限がないとき' do + before do + sign_out @demand_user + end + it 'ステータスコード302 Foundを返す' do + delete :destroy, :id => @demander.id + response.status.should eq 302 + end + context 'html形式' do + it 'サインインページへ遷移する' do + delete :destroy, :id => @demander.id + response.body.should redirect_to '/demand_users/sign_in' + end + end + context 'json形式' do + it '応答メッセージにUnauthorizedを返す' do + delete :destroy, :id => @demander.id, :format => :json + response.message.should match(/Unauthorized/) + end + end + end + context '借受停止に失敗したとき' do + before do + Demander.any_instance.stub(:stop).with(any_args).and_return(false) + end + context 'html形式' do + it 'ステータスコード302 Foundを返す' do + delete :destroy, :id => @demander.id + response.status.should eq 302 + end + it '借手ホーム(index)ページに遷移する' do + delete :destroy, :id => @demander.id + response.should redirect_to(demanders_path) + end + it '一時的メッセージに処理失敗を設定する' do + delete :destroy, :id => @demander.id + flash[:notice].should match /not/ + end + end + context 'json形式' do + it 'ステータスコード422 unprocessable_entity を返す' do + delete :destroy, :id => @demander.id, :format => :json + response.status.should eq 422 + end + it '応答メッセージUnprocessable Entityを返す' do + delete :destroy, :id => @demander.id, :format => :json + response.message.should match(/Unprocessable/) + end + end + end + end + +end diff --git a/spec/helpers/demander_statuses_helper_spec.rb b/spec/helpers/demander_statuses_helper_spec.rb new file mode 100644 index 00000000..b9bf9699 --- /dev/null +++ b/spec/helpers/demander_statuses_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the DemanderStatusesHelper. For example: +# +# describe DemanderStatusesHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# helper.concat_strings("this","that").should == "this that" +# end +# end +# end +describe DemanderStatusesHelper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/helpers/demanders_helper_spec.rb b/spec/helpers/demanders_helper_spec.rb new file mode 100644 index 00000000..6ef0e197 --- /dev/null +++ b/spec/helpers/demanders_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the DemandersHelper. For example: +# +# describe DemandersHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# helper.concat_strings("this","that").should == "this that" +# end +# end +# end +describe DemandersHelper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/demand_user_spec.rb b/spec/models/demand_user_spec.rb new file mode 100644 index 00000000..d764de64 --- /dev/null +++ b/spec/models/demand_user_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe DemandUser do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/demander_spec.rb b/spec/models/demander_spec.rb new file mode 100644 index 00000000..da6c9cea --- /dev/null +++ b/spec/models/demander_spec.rb @@ -0,0 +1,500 @@ +# -*- encoding: utf-8 -*- +#借手 +require 'spec_helper' + +describe Demander do + before do + @admin = FactoryGirl.create :admin + @sp = FactoryGirl.create :system_picture + @lg = FactoryGirl.create :license_group + @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id + @user = FactoryGirl.create :user_yas + @author = @user.author #ユーザ作成時に連動して作成される + @demand_user = FactoryGirl.create :demand_user + end + describe '検証に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.build :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + + context 'オーソドックスなデータのとき' do + it '下限データが通る' do + @demander.name = 'a' + @demander.caption = 'a' + @demander.url = 'http://test.jp/' + @demander.description = 'a' + @demander.demander_url = 'http://test.jp/' + @demander.should be_valid + end + it '上限データが通る' do + @demander.name = 'a'*50 + @demander.caption = 'a'*30 + @demander.url = 'http://test.jp/aaaaa' + 'a' * 180 + @demander.description = 'a' * 99999 + @demander.demander_url = 'http://test.jp/aaaaa' + 'a' * 180 + @demander.should be_valid + end + end + + context 'demand_user_idを検証するとき' do + it 'nullなら失敗する' do + @demander.demand_user_id = nil + @demander.should_not be_valid + end + it '数値でなければ失敗する' do + @demander.demand_user_id = 'a' + @demander.should_not be_valid + end + it '存在する借手ユーザでなければ失敗する' do + @demander.demand_user_id = 0 + @demander.should_not be_valid + end + end + context 'nameを検証するとき' do + it 'nullなら失敗する' do + @demander.name = '' + @demander.should_not be_valid + end + it '51文字以上なら失敗する' do + @demander.name = 'a'*51 + @demander.should_not be_valid + end + it '重複していたら失敗する' do + l = FactoryGirl.create :demander + @demander.should_not be_valid + end + end + context 'captionを検証するとき' do + it 'nullなら失敗する' do + @demander.caption = '' + @demander.should_not be_valid + end + it '31文字以上なら失敗する' do + @demander.caption = 'a'*31 + @demander.should_not be_valid + end + end + context 'urlを検証するとき' do + it 'nullなら失敗する' do + @demander.url = '' + @demander.should_not be_valid + end + it '201文字以上なら失敗する' do + @demander.url = 'http://test.jp/aaaaa' + 'a' * 181 + @demander.should_not be_valid + end + it 'url形式でないなら失敗する' do + @demander.url = 'aaaaaaa' + @demander.should_not be_valid + end + end + context 'descriptionを検証するとき' do + it 'nullなら失敗する' do + @demander.description= '' + @demander.should_not be_valid + end + end + context 'demander_urlを検証するとき' do + it 'nullなら失敗する' do + @demander.demander_url = '' + @demander.should_not be_valid + end + it '201文字以上なら失敗する' do + @demander.demander_url = 'http://test.jp/aaaaa' + 'a' * 181 + @demander.should_not be_valid + end + it 'url形式でないなら失敗する' do + @demander.demander_url = 'aaaaaaa' + @demander.should_not be_valid + end + end + context 'demander_status_idを検証するとき' do + it 'nullなら失敗する' do + @demander.demander_status_id = nil + @demander.should_not be_valid + end + it '数値でなければ失敗する' do + @demander.demander_status_id = 'a' + @demander.should_not be_valid + end + it '存在する借受状況でなければ失敗する' do + @demander.demander_status_id = 0 + @demander.should_not be_valid + end + end + end + + describe 'デフォルト値補充に於いて' do + it 'defined' do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.build :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + @demander.supply_default + end + end + + describe '上書き補充に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.build :demander, :demander_status_id => @ds.id, :demand_user_id => nil + end + it 'demand_user_idに借手アカウントidを補充している' do + @demander.overwrite @demand_user + @demander.demand_user_id.should_not be_nil + end + end + + describe '所持判定に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.build :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + it 'パラメータが借手アカウントでないならno' do + @demander.own?(nil).should == false + end + it '借手アカウントのidと一致するならyes' do + @demander.own?(@demand_user).should == true + end + it '借手アカウントのidと一致しないならno' do + @other_demand_user = FactoryGirl.create :demand_user + @demander.own?(@other_demand_user).should == false + end + end + + describe '閲覧許可に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.build :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + it 'パラメータが借手アカウントでないならno' do + @demander.visible?(nil).should == false + end + it '借手アカウントのidと一致するならyes' do + @demander.visible?(@demand_user).should == true + end + it '借手アカウントのidと一致しないならno' do + @other_demand_user = FactoryGirl.create :demand_user + @demander.visible?(@other_demand_user).should == false + end + end + + describe '状態に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + it '貸与状況の状態に問い合わせしている' do + DemanderStatus.any_instance.stub(:status).with(any_args).and_return(1) + DemanderStatus.any_instance.should_receive(:status).with(any_args).exactly(1) + r = @demander.status + end + end + + describe '一覧取得に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id, :name => "6" + end + context 'page補正について' do + it '文字列から数値に変換される' do + Demander.page('8').should eq 8 + end + it 'nilの場合は1になる' do + Demander.page().should eq 1 + end + it '0以下の場合は1になる' do + Demander.page('0').should eq 1 + end + end + context 'page_size補正について' do + it '文字列から数値に変換される' do + Demander.page_size('7').should eq 7 + end + it 'nilの場合はDemander.default_page_sizeになる' do + Demander.page_size().should eq Demander.default_page_size + end + it '0以下の場合はDemander.default_page_sizeになる' do + Demander.page_size('0').should eq Demander.default_page_size + end + it 'Demander.max_page_sizeを超えた場合はDemander.max_page_sizeになる' do + Demander.page_size('1000').should eq Demander.max_page_size + end + end + context 'つつがなく終わるとき' do + it '一覧取得オプションを利用している' do + Demander.stub(:list_opt).with(any_args).and_return({}) + Demander.should_receive(:list_opt).with(any_args).exactly(1) + r = Demander.list + end + end + it 'リストを返す' do + r = Demander.list + r.should eq [@demander] + end + it '管理名で並んでいる' do + v = FactoryGirl.create :demander, :name => "0" + r = Demander.list + r.should eq [v, @demander] + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @ds2 = FactoryGirl.create :demander_status + @demander2 = FactoryGirl.create :demander, :demander_status_id => @ds2.id, :demand_user_id => @demand_user.id, :name => "5" + @ds3 = FactoryGirl.create :demander_status + @demander3 = FactoryGirl.create :demander, :demander_status_id => @ds3.id, :demand_user_id => @demand_user.id, :name => "4" + @ds4 = FactoryGirl.create :demander_status + @demander4 = FactoryGirl.create :demander, :demander_status_id => @ds4.id, :demand_user_id => @demand_user.id, :name => "3" + @ds5 = FactoryGirl.create :demander_status + @demander5 = FactoryGirl.create :demander, :demander_status_id => @ds5.id, :demand_user_id => @demand_user.id, :name => "2" + Demander.stub(:default_page_size).and_return(2) + end + it '通常は2件を返す' do + r = Demander.list + r.should have(2).items + end + it 'page=1なら末尾2件を返す' do + #管理名で並んでいる + r = Demander.list(1) + r.should eq [@demander5, @demander4] + end + it 'page=2なら中間2件を返す' do + r = Demander.list(2) + r.should eq [@demander3, @demander2] + end + it 'page=3なら先頭1件を返す' do + r = Demander.list(3) + r.should eq [@demander] + end + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @ds2 = FactoryGirl.create :demander_status + @demander2 = FactoryGirl.create :demander, :demander_status_id => @ds2.id, :demand_user_id => @demand_user.id, :name => "5" + @ds3 = FactoryGirl.create :demander_status + @demander3 = FactoryGirl.create :demander, :demander_status_id => @ds3.id, :demand_user_id => @demand_user.id, :name => "4" + @ds4 = FactoryGirl.create :demander_status + @demander4 = FactoryGirl.create :demander, :demander_status_id => @ds4.id, :demand_user_id => @demand_user.id, :name => "3" + @ds5 = FactoryGirl.create :demander_status + @demander5 = FactoryGirl.create :demander, :demander_status_id => @ds5.id, :demand_user_id => @demand_user.id, :name => "2" + Demander.stub(:default_page_size).and_return(2) + end + it '件数0は全件(5件)を返す' do + r = Demander.list 5, 0 + r.should have(5).items + end + end + end + describe '待機中一覧取得に於いて' do + end + describe '一覧取得オプションに於いて' do + it 'includeキーを含んでいる' do + r = Demander.list_opt + r.has_key?(:include).should be_true + end + it '1つの項目を含んでいる' do + r = Demander.list_opt[:include] + r.should have(1).items + end + it '貸与状況を含んでいる' do + r = Demander.list_opt[:include] + r.has_key?(:demander_status).should be_true + end + end + describe 'json一覧出力オプションに於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + it '貸与状況を含んでいる' do + r = Demander.list.to_json Demander.list_json_opt + j = JSON.parse r + i = j.first + i.has_key?('demander_status').should be_true + end + end + + describe '単体取得に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + context 'つつがなく終わるとき' do + it '単体取得オプションを利用している' do + Demander.stub(:show_opt).with(any_args).and_return({}) + Demander.should_receive(:show_opt).with(any_args).exactly(1) + r = Demander.show @demander.id, @demand_user + end + it '閲覧許可を問い合わせている' do + Demander.any_instance.stub(:visible?).with(any_args).and_return(true) + Demander.any_instance.should_receive(:visible?).with(any_args).exactly(1) + r = Demander.show @demander.id, @demand_user + end + end + it '指定の借手を返す' do + r = Demander.show @demander.id, @demand_user + r.should eq @demander + end + context '閲覧許可が出なかったとき' do + it '403Forbidden例外を返す' do + Demander.any_instance.stub(:visible?).and_return(false) + lambda{ + Demander.show @demander.id, @demand_user + }.should raise_error(ActiveRecord::Forbidden) + end + end + context '存在しない借手を開こうとしたとき' do + it '404RecordNotFound例外を返す' do + lambda{ + Demander.show 110, @demand_user + }.should raise_error(ActiveRecord::RecordNotFound) + end + end + end + + describe '編集取得に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + context 'つつがなく終わるとき' do + it '単体取得オプションを利用している' do + Demander.stub(:show_opt).with(any_args).and_return({}) + Demander.should_receive(:show_opt).with(any_args).exactly(1) + r = Demander.edit @demander.id, @demand_user + end + it '所持判定を問い合わせている' do + Demander.any_instance.stub(:own?).with(any_args).and_return(true) + Demander.any_instance.should_receive(:own?).with(any_args).exactly(1) + r = Demander.edit @demander.id, @demand_user + end + end + it '指定の借手を返す' do + Demander.any_instance.stub(:own?).and_return(true) + r = Demander.edit @demander.id, @demand_user + r.should eq @demander + end + context '権限がなかったとき' do + it '403Forbidden例外を返す' do + Demander.any_instance.stub(:own?).and_return(false) + lambda{ + Demander.edit @demander.id, @demand_user + }.should raise_error(ActiveRecord::Forbidden) + end + end + context '存在しない借手を開こうとしたとき' do + it '404RecordNotFound例外を返す' do + lambda{ + Demander.edit 110, @demand_user + }.should raise_error(ActiveRecord::RecordNotFound) + end + end + end + describe '単体取得オプションに於いて' do + it 'includeキーを含んでいる' do + r = Demander.show_opt + r.has_key?(:include).should be_true + end + it '1つの項目を含んでいる' do + r = Demander.show_opt[:include] + r.should have(1).items + end + it '貸与状況を含んでいる' do + r = Demander.show_opt[:include] + r.has_key?(:demander_status).should be_true + end + end + describe 'json単体出力オプションに於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + it '貸与状況を含んでいる' do + r = Demander.show(@demander.id, @demand_user).to_json Demander.show_json_opt + j = JSON.parse r + i = j + i.has_key?('demander_status').should be_true + end + end + + describe '更新作成に於いて' do + before do + DemanderStatus.any_instance.stub(:supply_default).with(any_args) + end + context 'つつがなく終わるとき' do + before do + @demander = FactoryGirl.build :demander, :demander_status_id => nil, :demand_user_id => @demand_user.id + end + it '借手が追加される' do + lambda { + r = @demander.store + }.should change Demander, :count + end + it '貸与状況が作成される' do + lambda { + r = @demander.store + }.should change DemanderStatus, :count + end + it 'trueを返す' do + r = @demander.store + r.should be_true + end + end + context '貸与状況があるとき' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + it '借手は変化しない' do + lambda { + r = @demander.store + }.should_not change Demander, :count + end + it '貸与状況は変化しない' do + lambda { + r = @demander.store + }.should_not change DemanderStatus, :count + end + end + context '貸与状況の作成に失敗したとき' do + before do + DemanderStatus.any_instance.stub(:save).with(any_args).and_return(false) + @demander = FactoryGirl.build :demander, :demander_status_id => nil, :demand_user_id => @demand_user.id + end + it '借手は変化しない' do + lambda { + r = @demander.store + }.should_not change Demander, :count + end + it '貸与状況は変化しない' do + lambda { + r = @demander.store + }.should_not change DemanderStatus, :count + end + it '借手の検証は失敗している' do + r = @demander.store + r.should be_false + end + end + end + + describe '借受停止に於いて' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => Time.now, :rejected_at => Time.now, :receive_hour1 => 0, :receive_hour2 => 0 + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + context '事前チェックする' do + it '貸与状況に借受停止を依頼している' do + DemanderStatus.any_instance.stub(:stop).with(any_args).and_return(true) + DemanderStatus.any_instance.should_receive(:stop).with(any_args).exactly(1) + r = @demander.stop + end + end + context 'つつがなく終わるとき' do + it 'Trueを返す' do + DemanderStatus.any_instance.stub(:stop).with(any_args).and_return(true) + r = @demander.stop + r.should be_true + end + end + end +end diff --git a/spec/models/demander_status_spec.rb b/spec/models/demander_status_spec.rb new file mode 100644 index 00000000..011a7b03 --- /dev/null +++ b/spec/models/demander_status_spec.rb @@ -0,0 +1,754 @@ +# -*- encoding: utf-8 -*- +#貸与状況 +require 'spec_helper' + +describe DemanderStatus do + before do + @admin = FactoryGirl.create :admin + @sp = FactoryGirl.create :system_picture + @lg = FactoryGirl.create :license_group + @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id + @user = FactoryGirl.create :user_yas + @author = @user.author #ユーザ作成時に連動して作成される + @demand_user = FactoryGirl.create :demand_user + end + describe '検証に於いて' do + before do + @ds = FactoryGirl.build :demander_status + end + + context 'オーソドックスなデータのとき' do + it '下限データが通る' do + @ds.receive_hour1 = -99999 + @ds.receive_hour2 = -99999 + @ds.should be_valid + end + it '上限データが通る' do + @ds.receive_hour1 = 99999 + @ds.receive_hour2 = 99999 + @ds.should be_valid + end + end + context 'requested_atを検証するとき' do + end + context 'rejected_atを検証するとき' do + end + context 'approved_atを検証するとき' do + end + context 'tokenを検証するとき' do + end + context 'receive_hour1を検証するとき' do + it '数値でなければ失敗する' do + @ds.receive_hour1 = 'a' + @ds.should_not be_valid + end + end + context 'receive_hour2を検証するとき' do + it '数値でなければ失敗する' do + @ds.receive_hour2 = 'a' + @ds.should_not be_valid + end + end + end + + describe 'デフォルト値補充に於いて' do + it 'defined' do + @ds = FactoryGirl.build :demander_status + @ds.supply_default + end + end + + describe '上書き補充に於いて' do + it 'defined' do + @ds = FactoryGirl.build :demander_status + @ds.overwrite + end + end + + describe '所持判定に於いて' do + before do + @ds = FactoryGirl.create :demander_status + end + it '管理者ならyes' do + @ds.own?(@admin).should == true + end + it '作家ならno' do + @ds.own?(@author).should == false + end + it 'パラメータが管理者でないならno' do + @ds.own?(nil).should == false + end + end + + describe '閲覧許可に於いて' do + before do + @ds = FactoryGirl.create :demander_status + end + it '管理者なら許可する' do + r = @ds.visible?(@admin) + r.should == true + end + it '作家なら許可しない' do + r = @ds.visible?(@author) + r.should == false + end + it 'それ以外のとき不許可を返す。' do + r = @ds.visible?(nil) + r.should be_false + end + end + + describe '状態に於いて' do + before do + end + context '申請日時がセットされていないとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => nil, :approved_at => Time.now + end + it '待機中0を返す' do + r = @ds.status + r.should eq 0 + end + end + context '申請日時と否決日時がセットされているとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :rejected_at => Time.now + end + it '否決 1を返す' do + r = @ds.status + r.should eq 1 + end + end + context '申請日時がセットされていて、可決日時と否決日時がセットされていないとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + end + it '申請中 2を返す' do + r = @ds.status + r.should eq 2 + end + end + context '申請日時と可決日時がセットされているとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => Time.now + end + it '貸与中 3を返す' do + r = @ds.status + r.should eq 3 + end + end + end + + describe '一覧取得に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id, :name => "6" + end + context 'page補正について' do + it '文字列から数値に変換される' do + DemanderStatus.page('8').should eq 8 + end + it 'nilの場合は1になる' do + DemanderStatus.page().should eq 1 + end + it '0以下の場合は1になる' do + DemanderStatus.page('0').should eq 1 + end + end + context 'page_size補正について' do + it '文字列から数値に変換される' do + DemanderStatus.page_size('7').should eq 7 + end + it 'nilの場合はDemanderStatus.default_page_sizeになる' do + DemanderStatus.page_size().should eq DemanderStatus.default_page_size + end + it '0以下の場合はDemanderStatus.default_page_sizeになる' do + DemanderStatus.page_size('0').should eq DemanderStatus.default_page_size + end + it 'DemanderStatus.max_page_sizeを超えた場合はDemanderStatus.max_page_sizeになる' do + DemanderStatus.page_size('1000').should eq DemanderStatus.max_page_size + end + end + context 'つつがなく終わるとき' do + it '一覧取得オプションを利用している' do + DemanderStatus.stub(:list_opt).with(any_args).and_return({:include => {:demander => {}} }) + DemanderStatus.should_receive(:list_opt).with(any_args).exactly(1) + r = DemanderStatus.list + end + end + it 'リストを返す' do + r = DemanderStatus.list + r.should eq [@ds] + end + it '管理名で並んでいる' do + v = FactoryGirl.create :demander_status + vd = FactoryGirl.create :demander, :demander_status_id => v.id, :demand_user_id => @demand_user.id, :name => "0" + r = DemanderStatus.list + r.should eq [v, @ds] + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @ds2 = FactoryGirl.create :demander_status + @demander2 = FactoryGirl.create :demander, :demander_status_id => @ds2.id, :demand_user_id => @demand_user.id, :name => "5" + @ds3 = FactoryGirl.create :demander_status + @demander3 = FactoryGirl.create :demander, :demander_status_id => @ds3.id, :demand_user_id => @demand_user.id, :name => "4" + @ds4 = FactoryGirl.create :demander_status + @demander4 = FactoryGirl.create :demander, :demander_status_id => @ds4.id, :demand_user_id => @demand_user.id, :name => "3" + @ds5 = FactoryGirl.create :demander_status + @demander5 = FactoryGirl.create :demander, :demander_status_id => @ds5.id, :demand_user_id => @demand_user.id, :name => "2" + DemanderStatus.stub(:default_page_size).and_return(2) + end + it '通常は2件を返す' do + r = DemanderStatus.list + r.should have(2).items + end + it 'page=1なら末尾2件を返す' do + #管理名で並んでいる + r = DemanderStatus.list(1) + r.should eq [@ds5, @ds4] + end + it 'page=2なら中間2件を返す' do + r = DemanderStatus.list(2) + r.should eq [@ds3, @ds2] + end + it 'page=3なら先頭1件を返す' do + r = DemanderStatus.list(3) + r.should eq [@ds] + end + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @ds2 = FactoryGirl.create :demander_status + @demander2 = FactoryGirl.create :demander, :demander_status_id => @ds2.id, :demand_user_id => @demand_user.id, :name => "5" + @ds3 = FactoryGirl.create :demander_status + @demander3 = FactoryGirl.create :demander, :demander_status_id => @ds3.id, :demand_user_id => @demand_user.id, :name => "4" + @ds4 = FactoryGirl.create :demander_status + @demander4 = FactoryGirl.create :demander, :demander_status_id => @ds4.id, :demand_user_id => @demand_user.id, :name => "3" + @ds5 = FactoryGirl.create :demander_status + @demander5 = FactoryGirl.create :demander, :demander_status_id => @ds5.id, :demand_user_id => @demand_user.id, :name => "2" + DemanderStatus.stub(:default_page_size).and_return(2) + end + it '件数0は全件(5件)を返す' do + r = DemanderStatus.list 5, 0 + r.should have(5).items + end + end + end + describe '申請中一覧取得に於いて' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id, :name => "6" + end + context 'つつがなく終わるとき' do + it '一覧取得オプションを利用している' do + DemanderStatus.stub(:list_opt).with(any_args).and_return({:include => {:demander => {}} }) + DemanderStatus.should_receive(:list_opt).with(any_args).exactly(1) + r = DemanderStatus.requested_list + end + end + it 'リストを返す' do + r = DemanderStatus.requested_list + r.should eq [@ds] + end + it '管理名で並んでいる' do + v = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + vd = FactoryGirl.create :demander, :demander_status_id => v.id, :demand_user_id => @demand_user.id, :name => "0" + r = DemanderStatus.requested_list + r.should eq [v, @ds] + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @ds2 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander2 = FactoryGirl.create :demander, :demander_status_id => @ds2.id, :demand_user_id => @demand_user.id, :name => "5" + @ds3 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander3 = FactoryGirl.create :demander, :demander_status_id => @ds3.id, :demand_user_id => @demand_user.id, :name => "4" + @ds4 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander4 = FactoryGirl.create :demander, :demander_status_id => @ds4.id, :demand_user_id => @demand_user.id, :name => "3" + @ds5 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander5 = FactoryGirl.create :demander, :demander_status_id => @ds5.id, :demand_user_id => @demand_user.id, :name => "2" + DemanderStatus.stub(:default_page_size).and_return(2) + end + it '通常は2件を返す' do + r = DemanderStatus.requested_list + r.should have(2).items + end + it 'page=1なら末尾2件を返す' do + #管理名で並んでいる + r = DemanderStatus.requested_list(1) + r.should eq [@ds5, @ds4] + end + it 'page=2なら中間2件を返す' do + r = DemanderStatus.requested_list(2) + r.should eq [@ds3, @ds2] + end + it 'page=3なら先頭1件を返す' do + r = DemanderStatus.requested_list(3) + r.should eq [@ds] + end + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @ds2 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander2 = FactoryGirl.create :demander, :demander_status_id => @ds2.id, :demand_user_id => @demand_user.id, :name => "5" + @ds3 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander3 = FactoryGirl.create :demander, :demander_status_id => @ds3.id, :demand_user_id => @demand_user.id, :name => "4" + @ds4 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander4 = FactoryGirl.create :demander, :demander_status_id => @ds4.id, :demand_user_id => @demand_user.id, :name => "3" + @ds5 = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => nil, :rejected_at => nil + @demander5 = FactoryGirl.create :demander, :demander_status_id => @ds5.id, :demand_user_id => @demand_user.id, :name => "2" + DemanderStatus.stub(:default_page_size).and_return(2) + end + it '件数0は全件(5件)を返す' do + r = DemanderStatus.requested_list 5, 0 + r.should have(5).items + end + end + end + describe '一覧取得オプションに於いて' do + it 'includeキーを含んでいる' do + r = DemanderStatus.list_opt + r.has_key?(:include).should be_true + end + it '1つの項目を含んでいる' do + r = DemanderStatus.list_opt[:include] + r.should have(1).items + end + it '借手を含んでいる' do + r = DemanderStatus.list_opt[:include] + r.has_key?(:demander).should be_true + end + end + describe 'json一覧出力オプションに於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '借手を含んでいる' do + r = DemanderStatus.list.to_json DemanderStatus.list_json_opt + j = JSON.parse r + i = j.first + i.has_key?('demander').should be_true + end + end + + describe '単体取得に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + context 'つつがなく終わるとき' do + it '単体取得オプションを利用している' do + DemanderStatus.stub(:show_opt).with(any_args).and_return({}) + DemanderStatus.should_receive(:show_opt).with(any_args).exactly(1) + r = DemanderStatus.show @ds.id, @admin + end + it '閲覧許可を問い合わせている' do + DemanderStatus.any_instance.stub(:visible?).with(any_args).and_return(true) + DemanderStatus.any_instance.should_receive(:visible?).with(any_args).exactly(1) + r = DemanderStatus.show @ds.id, @admin + end + end + it '指定の貸与状況を返す' do + r = DemanderStatus.show @ds.id, @admin + r.should eq @ds + end + context '閲覧許可が出なかったとき' do + it '403Forbidden例外を返す' do + DemanderStatus.any_instance.stub(:visible?).and_return(false) + lambda{ + DemanderStatus.show @ds.id, @admin + }.should raise_error(ActiveRecord::Forbidden) + end + end + context '存在しない貸与状況を開こうとしたとき' do + it '404RecordNotFound例外を返す' do + lambda{ + DemanderStatus.show 110, @admin + }.should raise_error(ActiveRecord::RecordNotFound) + end + end + end + + describe '編集取得に於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id, :demand_user_id => @demand_user.id + end + context 'つつがなく終わるとき' do + it '単体取得オプションを利用している' do + DemanderStatus.stub(:show_opt).with(any_args).and_return({}) + DemanderStatus.should_receive(:show_opt).with(any_args).exactly(1) + r = DemanderStatus.edit @ds.id, @admin + end + it '所持判定を問い合わせている' do + DemanderStatus.any_instance.stub(:own?).with(any_args).and_return(true) + DemanderStatus.any_instance.should_receive(:own?).with(any_args).exactly(1) + r = DemanderStatus.edit @ds.id, @admin + end + end + it '指定の貸与状況を返す' do + DemanderStatus.any_instance.stub(:own?).and_return(true) + r = DemanderStatus.edit @ds.id, @admin + r.should eq @ds + end + context '権限がなかったとき' do + it '403Forbidden例外を返す' do + DemanderStatus.any_instance.stub(:own?).and_return(false) + lambda{ + DemanderStatus.edit @ds.id, @admin + }.should raise_error(ActiveRecord::Forbidden) + end + end + context '存在しない貸与状況を開こうとしたとき' do + it '404RecordNotFound例外を返す' do + lambda{ + DemanderStatus.edit 110, @admin + }.should raise_error(ActiveRecord::RecordNotFound) + end + end + end + describe '単体取得オプションに於いて' do + it 'includeキーを含んでいる' do + r = DemanderStatus.show_opt + r.has_key?(:include).should be_true + end + it '1つの項目を含んでいる' do + r = DemanderStatus.show_opt[:include] + r.should have(1).items + end + it '借手を含んでいる' do + r = DemanderStatus.show_opt[:include] + r.has_key?(:demander).should be_true + end + end + describe 'json単体出力オプションに於いて' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '借手を含んでいる' do + r = DemanderStatus.show(@ds.id, @admin).to_json DemanderStatus.show_json_opt + j = JSON.parse r + i = j + i.has_key?('demander').should be_true + end + end + + describe '借受申請に於いて' do + before do + end + context '待機中状態がつつがなく終わるとき' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '否決日時をクリアする' do + r = @ds.request + @ds.rejected_at.should be_nil + end + it '可決日時をクリアする' do + r = @ds.request + @ds.approved_at.should be_nil + end + it '申請日時に現在時刻をセットする' do + r = @ds.request + @ds.requested_at.should_not be_nil + end + it 'Trueを返す' do + r = @ds.request + r.should be_true + end + end + context '否決状態がつつがなく終わるとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :rejected_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '否決日時をクリアする' do + r = @ds.request + @ds.rejected_at.should be_nil + end + it '可決日時をクリアする' do + r = @ds.request + @ds.approved_at.should be_nil + end + it '申請日時に現在時刻をセットする' do + r = @ds.request + @ds.requested_at.should_not be_nil + end + it 'Trueを返す' do + r = @ds.request + r.should be_true + end + end + context '状態が申請中のとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it 'Falseを返す' do + r = @ds.request + r.should be_false + end + it '申請中2を返す' do + r = @ds.request + @ds.status.should eq 2 + end + end + context '状態が貸与中のとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it 'Falseを返す' do + r = @ds.request + r.should be_false + end + it '貸与中3を返す' do + r = @ds.request + @ds.status.should eq 3 + end + end + end + + describe '貸与停止に於いて' do + before do + end + context '状態が待機中のとき' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it 'Falseを返す' do + r = @ds.reject + r.should be_false + end + it '待機中0を返す' do + r = @ds.reject + @ds.status.should eq 0 + end + end + context '状態が否決中のとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :rejected_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it 'Falseを返す' do + r = @ds.reject + r.should be_false + end + it '否決中1を返す' do + r = @ds.reject + @ds.status.should eq 1 + end + end + context '申請中の状態がつつがなく終わるとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '否決日時をセットする' do + r = @ds.reject + @ds.rejected_at.should_not be_nil + end + it '可決日時をクリアする' do + r = @ds.reject + @ds.approved_at.should be_nil + end + it '借手の認証トークンをクリアする' do + DemandUser.any_instance.stub(:delete_token).with(any_args).and_return(true) + DemandUser.any_instance.should_receive(:delete_token).with(any_args).exactly(1) + r = @ds.reject + end + it 'Trueを返す' do + r = @ds.reject + r.should be_true + end + end + context '状態が貸与中のとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '否決日時をセットする' do + r = @ds.reject + @ds.rejected_at.should_not be_nil + end + it '可決日時をクリアする' do + r = @ds.reject + @ds.approved_at.should be_nil + end + it '借手の認証トークンをクリアする' do + DemandUser.any_instance.stub(:delete_token).with(any_args).and_return(true) + DemandUser.any_instance.should_receive(:delete_token).with(any_args).exactly(1) + r = @ds.reject + end + it 'Trueを返す' do + r = @ds.reject + r.should be_true + end + end + end + + describe '貸与承認に於いて' do + before do + end + context '状態が待機中のとき' do + before do + @ds = FactoryGirl.create :demander_status + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it 'Falseを返す' do + r = @ds.approve 1,13 + r.should be_false + end + it '待機中0を返す' do + r = @ds.approve 1,13 + @ds.status.should eq 0 + end + end + context '状態が否決中のとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :rejected_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '可決日時をセットする' do + r = @ds.approve 1,13 + @ds.approved_at.should_not be_nil + end + it '巡回時1と巡回時2をセットする' do + r = @ds.approve 1,13 + @ds.receive_hour1.should_not be_nil + @ds.receive_hour2.should_not be_nil + end + it '否決日時をクリアする' do + r = @ds.approve 1,13 + @ds.rejected_at.should be_nil + end + it '借手の認証トークンをセットする' do + DemandUser.any_instance.stub(:create_token).with(any_args).and_return(true) + DemandUser.any_instance.should_receive(:create_token).with(any_args).exactly(1) + r = @ds.approve 1,13 + end + it 'Trueを返す' do + r = @ds.approve 1,13 + r.should be_true + end + end + context '申請中の状態がつつがなく終わるとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it '可決日時をセットする' do + r = @ds.approve 1,13 + @ds.approved_at.should_not be_nil + end + it '巡回時1と巡回時2をセットする' do + r = @ds.approve 1,13 + @ds.receive_hour1.should_not be_nil + @ds.receive_hour2.should_not be_nil + end + it '否決日時をクリアする' do + r = @ds.approve 1,13 + @ds.rejected_at.should be_nil + end + it '借手の認証トークンをセットする' do + DemandUser.any_instance.stub(:create_token).with(any_args).and_return(true) + DemandUser.any_instance.should_receive(:create_token).with(any_args).exactly(1) + r = @ds.approve 1,13 + end + it 'Trueを返す' do + r = @ds.approve 1,13 + r.should be_true + end + end + context '状態が貸与中のとき' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => Time.now + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + it 'Falseを返す' do + r = @ds.approve 1,13 + r.should be_false + end + it '貸与中3を返す' do + r = @ds.approve 1,13 + @ds.status.should eq 3 + end + end + end + + describe '借受停止に於いて' do + before do + @ds = FactoryGirl.create :demander_status, :requested_at => Time.now, :approved_at => Time.now, :rejected_at => Time.now, :receive_hour1 => 0, :receive_hour2 => 0 + @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id + end + context '事前チェックする' do + it '借手の認証トークンにクリアを依頼している' do + DemandUser.any_instance.stub(:delete_token).with(any_args).and_return(true) + DemandUser.any_instance.should_receive(:delete_token).with(any_args).exactly(1) + r = @ds.stop + end + end + context 'つつがなく終わるとき' do + before do + DemandUser.any_instance.stub(:delete_token).with(any_args).and_return(true) + end + it '申請日時をクリアする' do + r = @ds.stop + @ds.approved_at.should be_nil + end + it '可決日時をクリアする' do + r = @ds.stop + @ds.approved_at.should be_nil + end + it '否決日時をクリアする' do + r = @ds.stop + @ds.rejected_at.should be_nil + end + it '巡回時1と巡回時2をクリアする' do + r = @ds.stop + @ds.receive_hour1.should be_nil + @ds.receive_hour2.should be_nil + end + it 'Trueを返す' do + r = @ds.stop + r.should be_true + end + end + context '自身の保存に失敗したとき' do + before do + DemanderStatus.any_instance.stub(:save).with(any_args).and_return(false) + end + it 'ロールバックする' do + r = @ds.stop + @ds.reload + @ds.requested_at.should_not be_nil + @ds.approved_at.should_not be_nil + @ds.receive_hour2.should_not be_nil + end + it 'Falseを返す' do + r = @ds.stop + r.should be_false + end + end + context '借手アカウントの保存に失敗したとき' do + before do + DemandUser.any_instance.stub(:delete_token).with(any_args).and_return(false) + end + it 'ロールバックする' do + r = @ds.stop + @ds.reload + @ds.requested_at.should_not be_nil + @ds.approved_at.should_not be_nil + @ds.receive_hour2.should_not be_nil + end + it 'Falseを返す' do + r = @ds.stop + r.should be_false + end + end + end +end + -- 2.11.0