diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4924b5ed..582314ec 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -11,6 +11,7 @@ class ApplicationController < ActionController::Base include LoggerHelper include LoginHelper include RegisterHelper + include UpdateHelper protect_from_forgery prepend: true, unless: -> { request.format.json? } diff --git a/app/controllers/sponsor_tiers_controller.rb b/app/controllers/sponsor_tiers_controller.rb index f3739806..8aaf1327 100644 --- a/app/controllers/sponsor_tiers_controller.rb +++ b/app/controllers/sponsor_tiers_controller.rb @@ -23,9 +23,8 @@ class SponsorTiersController < ApplicationController # print("------------\n", sponsor_tier_params, "\n------------\n") @check_sponsorship = nil @sponsor_tier = SponsorTier.new(sponsor_tier_params) - respond_to do |format| - if @sponsor_tier.save + if @sponsor_tier.user_id == User.current.id && @sponsor_tier.save format.html { redirect_to @sponsor_tier, notice: 'Sponsor tier was successfully created.' } format.json { render :show, status: :created, location: @sponsor_tier } # render json: {status: 1, message: '创建成功' } @@ -40,8 +39,10 @@ class SponsorTiersController < ApplicationController # PATCH/PUT /sponsor_tiers/1.json def update @check_sponsorship = nil + old_value = old_value_to_hash(@sponsor_tier, params) respond_to do |format| - if User.current.id == @sponsor_tier.user_id && @sponsor_tier.update(sponsor_tier_params) + if User.current.id == @sponsor_tier.user_id && @sponsor_tier.update(sponsor_tier_update_params) + user_trace_update_log(old_value) format.html { redirect_to @sponsor_tier, notice: 'Sponsor tier was successfully updated.' } format.json { render :show, status: :ok, location: @sponsor_tier } # render json: {status: 1, message: '修改成功' } @@ -71,13 +72,17 @@ class SponsorTiersController < ApplicationController private # Use callbacks to share common setup or constraints between actions. def check_sponsor - @check_sponsorship = Sponsorship.where("sponsor_id=? AND developer_id=?", current_user.id, @sponsor_tier.user) + @check_sponsorship = Sponsorship.where("sponsor_id=? AND developer_id=?", current_user.id, @sponsor_tier.user.id) end def set_sponsor_tier @sponsor_tier = SponsorTier.find(params[:id]) end + def sponsor_tier_update_params + params.require(:sponsor_tier).permit(:tier, :description) + end + # Only allow a list of trusted parameters through. def sponsor_tier_params params.require(:sponsor_tier).permit(:tier, :user_id, :description) diff --git a/app/controllers/sponsorships_controller.rb b/app/controllers/sponsorships_controller.rb index 9a59358f..2e18a075 100644 --- a/app/controllers/sponsorships_controller.rb +++ b/app/controllers/sponsorships_controller.rb @@ -1,7 +1,7 @@ class SponsorshipsController < ApplicationController before_action :set_sponsorship, only: [:show, :edit, :update, :destroy] # before_action :require_login, except: [:index, :stopped, :sponsored, :sponsoring, :stopped_sponsored, :stopped_sponsoring] - before_action :require_login, only: [:new, :create, :edit, :update, :destroy] + before_action :require_login, only: [:create, :edit, :update, :destroy] skip_after_action :user_trace_log, only: [:update] # GET /sponsorships @@ -78,7 +78,7 @@ class SponsorshipsController < ApplicationController check_sponsorship = Sponsorship.where("sponsor_id=? AND developer_id=?", sponsor_id, params[:developer_id]) @sponsorship = Sponsorship.new(sponsorship_params.merge({sponsor_id: sponsor_id})) - # print('#######################', params[:single].class) + unless check_sponsorship.length.zero? return render json: {status: -1, message: '您已经赞助了TA' } end @@ -119,11 +119,12 @@ class SponsorshipsController < ApplicationController # format.json { render json: @sponsorship.errors, status: :unprocessable_entity } # end # end + if @sponsorship.sponsor.id != current_user.id - return render json: {status: -1, message: '没有权限' } + return render json: {status: 401, message: '没有权限' } end old_value = old_value_to_hash(@sponsorship, params) - # params.delete :sponsorship + if @sponsorship.update(sponsorship_params) user_trace_update_log(old_value) render json: {status: 1, message: '修改成功' } @@ -140,7 +141,9 @@ class SponsorshipsController < ApplicationController # format.html { redirect_to sponsorships_url, notice: 'Sponsorship was successfully destroyed.' } # format.json { head :no_content } # end - if (User.current.id == @sponsorship.developer.id || User.current.id == @sponsorship.sponsor.id) && @sponsorship.stop + developer = @sponsorship.developer + sponsor = @sponsorship.sponsor + if (User.current.id == developer.id || User.current.id == sponsor.id) && developer.update(sponsored_num: developer.sponsored_num-1) && sponsor.update(sponsor_num: sponsor.sponsor_num-1) && @sponsorship.stop render json: {status: 1, message: "终止成功"} else render json: {status: -1, message: "失败"} diff --git a/spec/controllers/sponsor_tiers_controller_spec.rb b/spec/controllers/sponsor_tiers_controller_spec.rb index cf233c3c..f848bca7 100644 --- a/spec/controllers/sponsor_tiers_controller_spec.rb +++ b/spec/controllers/sponsor_tiers_controller_spec.rb @@ -29,112 +29,159 @@ RSpec.describe SponsorTiersController, type: :controller do # SponsorTier. As you add validations to SponsorTier, be sure to # adjust the attributes here as well. let(:valid_attributes) { - skip("Add a hash of attributes valid for your model") + {tier: 10, user_id: 5, description: 'Rspec test description'} } let(:invalid_attributes) { - skip("Add a hash of attributes invalid for your model") + {t: '10', user_id: -1, descrip: 'Rspec test description'} } + let(:invalid_user_attributes) { + {tier: 10, user_id: 4, description: 'Rspec test invalid user description'} + } # This should return the minimal set of values that should be in the session # in order to pass any filters (e.g. authentication) defined in # SponsorTiersController. Be sure to keep this updated too. - let(:valid_session) { {} } + let(:valid_session) { + # user = User.find 5 + # User.current = user + # cookies.signed[:user_id] = user.id + # cookies["autologin"] = "060a555275563b9f096c6ceed84518f64a4614ee" + {user_id: 5, www_user_id: 5} + } - describe "GET #index" do - it "returns a success response" do + describe 'GET #index' do + it 'returns a success response' do SponsorTier.create! valid_attributes - get :index, params: {login: qyzh123123}, session: valid_session + get :index, params: {login: 'qyzh123123'}, session: valid_session expect(response).to be_successful end end - describe "GET #show" do - it "returns a success response" do + describe 'GET #show' do + it 'returns a success response' do sponsor_tier = SponsorTier.create! valid_attributes get :show, params: {id: sponsor_tier.to_param}, session: valid_session expect(response).to be_successful end end - describe "GET #new" do - it "returns a success response" do - get :new, params: {}, session: valid_session - expect(response).to be_successful - end - end - - describe "GET #edit" do - it "returns a success response" do - sponsor_tier = SponsorTier.create! valid_attributes - get :edit, params: {id: sponsor_tier.to_param}, session: valid_session - expect(response).to be_successful - end - end - - describe "POST #create" do - context "with valid params" do - it "creates a new SponsorTier" do + describe 'POST #create' do + context 'with valid params' do + it 'creates a new SponsorTier' do expect { post :create, params: {sponsor_tier: valid_attributes}, session: valid_session }.to change(SponsorTier, :count).by(1) end - it "redirects to the created sponsor_tier" do + it 'redirects to the created sponsor_tier' do post :create, params: {sponsor_tier: valid_attributes}, session: valid_session expect(response).to redirect_to(SponsorTier.last) + # expect(response).to be_successful end end - context "with invalid params" do + context 'with invalid params' do it "returns a success response (i.e. to display the 'new' template)" do post :create, params: {sponsor_tier: invalid_attributes}, session: valid_session expect(response).to be_successful end end + + context 'with invalid user id' do + it 'does not creates a new SponsorTier' do + expect { + post :create, params: {sponsor_tier: invalid_user_attributes}, session: valid_session + }.to change(SponsorTier, :count).by(0) + end + + it "returns a success response" do + post :create, params: {sponsor_tier: invalid_user_attributes}, session: valid_session + expect(response).to be_successful + end + end end - describe "PUT #update" do - context "with valid params" do + describe 'PUT #update' do + context 'with valid params' do let(:new_attributes) { - skip("Add a hash of attributes valid for your model") + {tier: 12, description: 'Rspec test update description'} } - it "updates the requested sponsor_tier" do + it 'updates the requested sponsor_tier' do sponsor_tier = SponsorTier.create! valid_attributes put :update, params: {id: sponsor_tier.to_param, sponsor_tier: new_attributes}, session: valid_session sponsor_tier.reload - skip("Add assertions for updated state") + expect(sponsor_tier.tier).to eq(12) + expect(sponsor_tier.description).to eq('Rspec test update description') end - it "redirects to the sponsor_tier" do + it 'redirects to the sponsor_tier' do sponsor_tier = SponsorTier.create! valid_attributes put :update, params: {id: sponsor_tier.to_param, sponsor_tier: valid_attributes}, session: valid_session expect(response).to redirect_to(sponsor_tier) end end - context "with invalid params" do - it "returns a success response (i.e. to display the 'edit' template)" do + context 'with invalid params' do + it 'does not update and redirects to the sponsor_tier' do sponsor_tier = SponsorTier.create! valid_attributes put :update, params: {id: sponsor_tier.to_param, sponsor_tier: invalid_attributes}, session: valid_session - expect(response).to be_successful + expect(response).to redirect_to(sponsor_tier) + expect(sponsor_tier.tier).to eq(10) + expect(sponsor_tier.description).to eq('Rspec test description') + end + end + + context 'with invalid user id' do + let(:new_attributes) { + {tier: 12, description: 'Rspec test update description'} + } + it 'does not update SponsorTier' do + sponsor_tier = SponsorTier.create! invalid_user_attributes + put :update, params: {id: sponsor_tier.to_param, sponsor_tier: new_attributes}, session: valid_session + sponsor_tier.reload + expect(sponsor_tier.tier).to eq(10) + expect(sponsor_tier.description).to eq('Rspec test invalid user description') + end + + it 'redirects to the sponsor_tier' do + sponsor_tier = SponsorTier.create! invalid_user_attributes + put :update, params: {id: sponsor_tier.to_param, sponsor_tier: valid_attributes}, session: valid_session + expect(response).to be_ok end end end - describe "DELETE #destroy" do - it "destroys the requested sponsor_tier" do - sponsor_tier = SponsorTier.create! valid_attributes - expect { + describe 'DELETE #destroy' do + context 'with valid user id' do + it 'destroys the requested sponsor_tier' do + sponsor_tier = SponsorTier.create! valid_attributes + expect { + delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session + }.to change(SponsorTier, :count).by(-1) + end + + it 'redirects to the sponsor_tiers list' do + sponsor_tier = SponsorTier.create! valid_attributes delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session - }.to change(SponsorTier, :count).by(-1) + expect(response).to redirect_to(sponsor_tiers_url) + end end - it "redirects to the sponsor_tiers list" do - sponsor_tier = SponsorTier.create! valid_attributes - delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session - expect(response).to redirect_to(sponsor_tiers_url) + context 'with invalid user id' do + it 'does not destroy the requested sponsor_tier' do + sponsor_tier = SponsorTier.create! invalid_user_attributes + expect { + delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session + }.to change(SponsorTier, :count).by(0) + end + + it 'be ok' do + sponsor_tier = SponsorTier.create! invalid_user_attributes + delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session + expect(response).to be_ok + end end end diff --git a/spec/controllers/sponsorships_controller_spec.rb b/spec/controllers/sponsorships_controller_spec.rb index 6098d4d6..d2fb975c 100644 --- a/spec/controllers/sponsorships_controller_spec.rb +++ b/spec/controllers/sponsorships_controller_spec.rb @@ -29,22 +29,38 @@ RSpec.describe SponsorshipsController, type: :controller do # Sponsorship. As you add validations to Sponsorship, be sure to # adjust the attributes here as well. let(:valid_attributes) { - skip("Add a hash of attributes valid for your model") + {amount: 10, visible: 1, developer_id: 1, sponsor_id: 5} + } + + let(:valid_create_api_attributes) { + {amount: 10, visible: 1, developer_id: 1} + } + + let(:invalid_user_attributes) { + {amount: 10, visible: 1, sponsor_id: 4, developer_id: 1} } let(:invalid_attributes) { - skip("Add a hash of attributes invalid for your model") + {amunt: 10, visible: 1, developid: 1, sponsoid: 5} } # This should return the minimal set of values that should be in the session # in order to pass any filters (e.g. authentication) defined in # SponsorshipsController. Be sure to keep this updated too. - let(:valid_session) { {} } + let(:valid_session) { {www_user_id: 5} } describe "GET #index" do it "returns a success response" do Sponsorship.create! valid_attributes - get :index, params: {}, session: valid_session + get :index, params: {}, format: 'json', session: valid_session + expect(response.body).to eq('[]') + end + end + + describe "GET #stopped" do + it "returns a success response" do + sponsorship=StoppedSponsorship.create! valid_attributes + get :stopped, params: {}, format: 'json', session: valid_session expect(response).to be_successful end end @@ -57,32 +73,37 @@ RSpec.describe SponsorshipsController, type: :controller do end end - describe "GET #new" do - it "returns a success response" do - get :new, params: {}, session: valid_session - expect(response).to be_successful - end - end - - describe "GET #edit" do - it "returns a success response" do - sponsorship = Sponsorship.create! valid_attributes - get :edit, params: {id: sponsorship.to_param}, session: valid_session - expect(response).to be_successful - end - end - describe "POST #create" do context "with valid params" do it "creates a new Sponsorship" do expect { - post :create, params: {sponsorship: valid_attributes}, session: valid_session + post :create, params: {sponsorship: valid_create_api_attributes}, session: valid_session }.to change(Sponsorship, :count).by(1) end it "redirects to the created sponsorship" do - post :create, params: {sponsorship: valid_attributes}, session: valid_session - expect(response).to redirect_to(Sponsorship.last) + post :create, params: {sponsorship: valid_create_api_attributes}, session: valid_session + expect(response).to be_ok + end + end + + context "single sponsor" do + let(:valid_single_params){ + {amount: 10, visible: 1, developer_id: 1, single: true} + } + it "creates a stopped sponsorship" do + expect { + post :create, params: {amount: 10, visible: 1, developer_id: 1, single: true}, session: valid_session + }.to change(StoppedSponsorship, :count).by(0) + end + end + + context "repeat sponsor" do + it "creates only one new Sponsorship" do + Sponsorship.create! valid_attributes + expect { + post :create, params: {sponsorship: valid_create_api_attributes}, session: valid_session + }.to change(Sponsorship, :count).by(1) end end @@ -97,20 +118,29 @@ RSpec.describe SponsorshipsController, type: :controller do describe "PUT #update" do context "with valid params" do let(:new_attributes) { - skip("Add a hash of attributes valid for your model") + {amount: 20, visible: 0} } it "updates the requested sponsorship" do sponsorship = Sponsorship.create! valid_attributes put :update, params: {id: sponsorship.to_param, sponsorship: new_attributes}, session: valid_session sponsorship.reload - skip("Add assertions for updated state") + expect(sponsorship.amount).to eq(20) + expect(sponsorship.visible).to eq(0) end - it "redirects to the sponsorship" do + it "does not updates the requested sponsorship with wrong user" do + sponsorship = Sponsorship.create! invalid_user_attributes + put :update, params: {id: sponsorship.to_param, sponsorship: new_attributes}, session: valid_session + sponsorship.reload + expect(sponsorship.amount).to eq(10) + expect(sponsorship.visible).to eq(1) + end + + it "return ok" do sponsorship = Sponsorship.create! valid_attributes put :update, params: {id: sponsorship.to_param, sponsorship: valid_attributes}, session: valid_session - expect(response).to redirect_to(sponsorship) + expect(response).to be_ok end end @@ -131,10 +161,23 @@ RSpec.describe SponsorshipsController, type: :controller do }.to change(Sponsorship, :count).by(-1) end - it "redirects to the sponsorships list" do + it "destroys the requested sponsorship" do + sponsorship = Sponsorship.create! invalid_user_attributes + expect { + delete :destroy, params: {id: sponsorship.to_param}, session: valid_session + }.to change(Sponsorship, :count).by(0) + end + + it "return ok" do sponsorship = Sponsorship.create! valid_attributes delete :destroy, params: {id: sponsorship.to_param}, session: valid_session - expect(response).to redirect_to(sponsorships_url) + expect(response).to be_ok + end + + it "return ok" do + sponsorship = Sponsorship.create! invalid_user_attributes + delete :destroy, params: {id: sponsorship.to_param}, session: valid_session + expect(response).to be_ok end end diff --git a/spec/requests/sponsorships_spec.rb b/spec/requests/sponsorships_spec.rb index 795504c7..74065abb 100644 --- a/spec/requests/sponsorships_spec.rb +++ b/spec/requests/sponsorships_spec.rb @@ -1,10 +1,13 @@ require 'rails_helper' RSpec.describe "Sponsorships", type: :request do + let(:valid_session) { {www_user_id: 5} } + describe "GET /sponsorships" do it "works! (now write some real specs)" do get sponsorships_path expect(response).to have_http_status(200) end end + end diff --git a/spec/routing/log_routing_spec.rb b/spec/routing/log_routing_spec.rb new file mode 100644 index 00000000..550d21a3 --- /dev/null +++ b/spec/routing/log_routing_spec.rb @@ -0,0 +1,10 @@ +require "rails_helper" + +RSpec.describe LogController, type: :routing do + describe "routing" do + it "routes to #index" do + expect(:get => "/api/log/list").to route_to("log#list") + end + end +end + diff --git a/spec/routing/sponsor_tiers_routing_spec.rb b/spec/routing/sponsor_tiers_routing_spec.rb index f2c95b1e..64da8d55 100644 --- a/spec/routing/sponsor_tiers_routing_spec.rb +++ b/spec/routing/sponsor_tiers_routing_spec.rb @@ -3,36 +3,27 @@ require "rails_helper" RSpec.describe SponsorTiersController, type: :routing do describe "routing" do it "routes to #index" do - expect(:get => "/sponsor_tiers").to route_to("sponsor_tiers#index") - end - - it "routes to #new" do - expect(:get => "/sponsor_tiers/new").to route_to("sponsor_tiers#new") + expect(:get => "/api/sponsor_tiers").to route_to("sponsor_tiers#index") end it "routes to #show" do - expect(:get => "/sponsor_tiers/1").to route_to("sponsor_tiers#show", :id => "1") + expect(:get => "/api/sponsor_tiers/1").to route_to("sponsor_tiers#show", :id => "1") end - it "routes to #edit" do - expect(:get => "/sponsor_tiers/1/edit").to route_to("sponsor_tiers#edit", :id => "1") - end - - it "routes to #create" do - expect(:post => "/sponsor_tiers").to route_to("sponsor_tiers#create") + expect(:post => "/api/sponsor_tiers").to route_to("sponsor_tiers#create") end it "routes to #update via PUT" do - expect(:put => "/sponsor_tiers/1").to route_to("sponsor_tiers#update", :id => "1") + expect(:put => "/api/sponsor_tiers/1").to route_to("sponsor_tiers#update", :id => "1") end it "routes to #update via PATCH" do - expect(:patch => "/sponsor_tiers/1").to route_to("sponsor_tiers#update", :id => "1") + expect(:patch => "/api/sponsor_tiers/1").to route_to("sponsor_tiers#update", :id => "1") end it "routes to #destroy" do - expect(:delete => "/sponsor_tiers/1").to route_to("sponsor_tiers#destroy", :id => "1") + expect(:delete => "/api/sponsor_tiers/1").to route_to("sponsor_tiers#destroy", :id => "1") end end end diff --git a/spec/routing/sponsorships_routing_spec.rb b/spec/routing/sponsorships_routing_spec.rb index 4e0cd20b..a5efe9b8 100644 --- a/spec/routing/sponsorships_routing_spec.rb +++ b/spec/routing/sponsorships_routing_spec.rb @@ -3,36 +3,47 @@ require "rails_helper" RSpec.describe SponsorshipsController, type: :routing do describe "routing" do it "routes to #index" do - expect(:get => "/sponsorships").to route_to("sponsorships#index") + expect(:get => "/api/sponsorships").to route_to("sponsorships#index") end - it "routes to #new" do - expect(:get => "/sponsorships/new").to route_to("sponsorships#new") + it "routes to stopped" do + expect(:get => "/api/sponsorships/stopped").to route_to("sponsorships#stopped") + end + + it "routes to sponsoring" do + expect(:get => "/api/sponsorships/sponsoring").to route_to("sponsorships#sponsoring") + end + + it "routes to stopped_sponsoring" do + expect(:get => "/api/sponsorships/stopped_sponsoring").to route_to("sponsorships#stopped_sponsoring") + end + + it "routes to sponsored" do + expect(:get => "/api/sponsorships/sponsored").to route_to("sponsorships#sponsored") + end + + it "routes to stopped_sponsored" do + expect(:get => "/api/sponsorships/stopped_sponsored").to route_to("sponsorships#stopped_sponsored") end it "routes to #show" do - expect(:get => "/sponsorships/1").to route_to("sponsorships#show", :id => "1") + expect(:get => "/api/sponsorships/1").to route_to("sponsorships#show", :id => "1") end - it "routes to #edit" do - expect(:get => "/sponsorships/1/edit").to route_to("sponsorships#edit", :id => "1") - end - - it "routes to #create" do - expect(:post => "/sponsorships").to route_to("sponsorships#create") + expect(:post => "/api/sponsorships").to route_to("sponsorships#create") end it "routes to #update via PUT" do - expect(:put => "/sponsorships/1").to route_to("sponsorships#update", :id => "1") + expect(:put => "/api/sponsorships/1").to route_to("sponsorships#update", :id => "1") end it "routes to #update via PATCH" do - expect(:patch => "/sponsorships/1").to route_to("sponsorships#update", :id => "1") + expect(:patch => "/api/sponsorships/1").to route_to("sponsorships#update", :id => "1") end it "routes to #destroy" do - expect(:delete => "/sponsorships/1").to route_to("sponsorships#destroy", :id => "1") + expect(:delete => "/api/sponsorships/1").to route_to("sponsorships#destroy", :id => "1") end end end