Refactor, specs for creating p2p campaign
This commit is contained in:
		
							parent
							
								
									dc1e8d769e
								
							
						
					
					
						commit
						d17c54b538
					
				
					 4 changed files with 121 additions and 36 deletions
				
			
		| 
						 | 
				
			
			@ -57,13 +57,12 @@ class CampaignsController < ApplicationController
 | 
			
		|||
 | 
			
		||||
    if !params[:campaign][:parent_campaign_id]
 | 
			
		||||
      campaign = current_nonprofit.campaigns.create params[:campaign]
 | 
			
		||||
      json_saved campaign, 'Campaign created! Well done.'
 | 
			
		||||
    else
 | 
			
		||||
      profile_id = params[:campaign][:profile_id]
 | 
			
		||||
      Profile.find(profile_id).update_attributes params[:profile]
 | 
			
		||||
      campaign = create_peer_to_peer_campaign params[:campaign], profile_id
 | 
			
		||||
      render json: CreatePeerToPeerCampaign.create(params[:campaign], profile_id)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    json_saved campaign, 'Campaign created! Well done.'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def update
 | 
			
		||||
| 
						 | 
				
			
			@ -120,41 +119,10 @@ class CampaignsController < ApplicationController
 | 
			
		|||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  # TODO: test if this can be passed by p2p campaign editor
 | 
			
		||||
  def check_nonprofit_status
 | 
			
		||||
    if !current_role?(:super_admin) && !current_nonprofit.published
 | 
			
		||||
      raise ActionController::RoutingError.new('Not Found')
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # TODO: refactor
 | 
			
		||||
  def create_peer_to_peer_campaign(params, profile_id)
 | 
			
		||||
    parent_campaign = Campaign.find(params[:parent_campaign_id])
 | 
			
		||||
    profile = Profile.find(profile_id)
 | 
			
		||||
 | 
			
		||||
    p2p_params = params.except(:nonprofit_id, :summary,:goal_amount)
 | 
			
		||||
    p2p_params.merge!(parent_campaign.child_params)
 | 
			
		||||
 | 
			
		||||
    base_slug = Format::Url.convert_to_slug "#{p2p_params[:name]}-#{profile.name}"
 | 
			
		||||
    algo = SlugP2pCampaignNamingAlgorithm.new(p2p_params[:nonprofit_id])
 | 
			
		||||
    p2p_params[:slug]  = algo.create_copy_name(base_slug)
 | 
			
		||||
 | 
			
		||||
    campaign = Campaign.create(p2p_params)
 | 
			
		||||
 | 
			
		||||
    # campaign.remote_main_image_url = parent_campaign.main_image_url unless !parent_campaign.main_image rescue AWS::S3::Errors::NoSuchKey
 | 
			
		||||
    # campaign.remote_background_image_url = parent_campaign.background_image_url unless !parent_campaign.background_image rescue AWS::S3::Errors::NoSuchKey
 | 
			
		||||
    # campaign.remote_banner_image_url = parent_campaign.background_image_url unless !parent_campaign.background_image rescue AWS::S3::Errors::NoSuchKey
 | 
			
		||||
 | 
			
		||||
    campaign.published = true
 | 
			
		||||
    campaign.save
 | 
			
		||||
 | 
			
		||||
    return campaign unless campaign.errors.empty?
 | 
			
		||||
 | 
			
		||||
    gift_option_params = []
 | 
			
		||||
    parent_campaign.campaign_gift_options.each do |option|
 | 
			
		||||
      excluded_for_peer_to_peer = %w(id campaign_id created_at updated_at)
 | 
			
		||||
      campaign.campaign_gift_options.create option.attributes.except(*excluded_for_peer_to_peer)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    campaign
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -173,7 +173,7 @@ class Campaign < ActiveRecord::Base
 | 
			
		|||
    excluded_for_peer_to_peer = %w(
 | 
			
		||||
      id created_at updated_at slug profile_id campaign_template_id url
 | 
			
		||||
      total_raised show_recurring_amount external_identifier parent_campaign_id
 | 
			
		||||
      reason_for_supporting
 | 
			
		||||
      reason_for_supporting metadata
 | 
			
		||||
    )
 | 
			
		||||
    excluded_for_peer_to_peer.push(customizable_attributes_list)
 | 
			
		||||
    attributes.except(*excluded_for_peer_to_peer)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										39
									
								
								lib/create/create_peer_to_peer_campaign.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								lib/create/create_peer_to_peer_campaign.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
 | 
			
		||||
module CreatePeerToPeerCampaign
 | 
			
		||||
  def self.create(campaign_params, profile_id)
 | 
			
		||||
    begin
 | 
			
		||||
    parent_campaign = Campaign.find(campaign_params[:parent_campaign_id])
 | 
			
		||||
 | 
			
		||||
    rescue ActiveRecord::RecordNotFound
 | 
			
		||||
      return { errors: { parent_campaign_id: 'not found' } }.as_json
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    p2p_params = campaign_params.except(:nonprofit_id, :summary,:goal_amount)
 | 
			
		||||
    p2p_params.merge!(parent_campaign.child_params)
 | 
			
		||||
 | 
			
		||||
    profile = Profile.find(profile_id)
 | 
			
		||||
    base_slug = Format::Url.convert_to_slug "#{p2p_params[:name]}-#{profile.name}"
 | 
			
		||||
    algo = SlugP2pCampaignNamingAlgorithm.new(p2p_params[:nonprofit_id])
 | 
			
		||||
    p2p_params[:slug] = algo.create_copy_name(base_slug)
 | 
			
		||||
 | 
			
		||||
    campaign = Campaign.create(p2p_params)
 | 
			
		||||
 | 
			
		||||
    # campaign.remote_main_image_url = parent_campaign.main_image_url unless !parent_campaign.main_image rescue AWS::S3::Errors::NoSuchKey
 | 
			
		||||
    # campaign.remote_background_image_url = parent_campaign.background_image_url unless !parent_campaign.background_image rescue AWS::S3::Errors::NoSuchKey
 | 
			
		||||
    # campaign.remote_banner_image_url = parent_campaign.background_image_url unless !parent_campaign.background_image rescue AWS::S3::Errors::NoSuchKey
 | 
			
		||||
 | 
			
		||||
    campaign.published = true
 | 
			
		||||
    campaign.profile = profile
 | 
			
		||||
    campaign.save
 | 
			
		||||
 | 
			
		||||
    return { errors: campaign.errors.messages }.as_json unless campaign.errors.empty?
 | 
			
		||||
 | 
			
		||||
    gift_option_params = []
 | 
			
		||||
    parent_campaign.campaign_gift_options.each do |option|
 | 
			
		||||
      excluded_for_peer_to_peer = %w(id campaign_id created_at updated_at)
 | 
			
		||||
      campaign.campaign_gift_options.create option.attributes.except(*excluded_for_peer_to_peer)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    campaign.as_json
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										78
									
								
								spec/lib/create/create_peer_to_peer_campaign_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								spec/lib/create/create_peer_to_peer_campaign_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,78 @@
 | 
			
		|||
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
describe CreatePeerToPeerCampaign do
 | 
			
		||||
  describe '.create' do
 | 
			
		||||
    let!(:profile) { force_create(:profile,  :user => force_create(:user)) }
 | 
			
		||||
    let!(:parent_campaign) { force_create(:campaign, name: 'Parent campaign') }
 | 
			
		||||
 | 
			
		||||
    context 'on success' do
 | 
			
		||||
      it 'returns a hash' do
 | 
			
		||||
        campaign_params = { name: 'Child campaign', parent_campaign_id: parent_campaign.id, goal_amount_dollars: "1000" }
 | 
			
		||||
        Timecop.freeze(2020, 4, 5) do
 | 
			
		||||
          result = CreatePeerToPeerCampaign.create(campaign_params, profile.id)
 | 
			
		||||
 | 
			
		||||
          expect(result).to be_kind_of Hash
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns created peer-to-peer campaign' do
 | 
			
		||||
        campaign_params = { name: 'Child campaign', parent_campaign_id: parent_campaign.id, goal_amount_dollars: "1000" }
 | 
			
		||||
        Timecop.freeze(2020, 4, 5) do
 | 
			
		||||
          result = CreatePeerToPeerCampaign.create(campaign_params, profile.id)
 | 
			
		||||
 | 
			
		||||
          expect(result).not_to include 'errors'
 | 
			
		||||
          expect(result['parent_campaign_id']).to eq parent_campaign.id
 | 
			
		||||
          expect(result['created_at']).to eq 'Sun, 05 Apr 2020 00:00:00 UTC +00:00'
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'assigns proper slug' do
 | 
			
		||||
        campaign_params = { name: 'Child campaign', parent_campaign_id: parent_campaign.id, goal_amount_dollars: "1000" }
 | 
			
		||||
        Timecop.freeze(2020, 4, 5) do
 | 
			
		||||
          result = CreatePeerToPeerCampaign.create(campaign_params, profile.id)
 | 
			
		||||
 | 
			
		||||
          expect(result).not_to include 'errors'
 | 
			
		||||
          expect(result['slug']).to eq 'child-campaign_000'
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'saves campaign' do
 | 
			
		||||
        campaign_params = { name: 'Child campaign', parent_campaign_id: parent_campaign.id, goal_amount_dollars: "1000" }
 | 
			
		||||
        Timecop.freeze(2020, 4, 5) do
 | 
			
		||||
          expect { CreatePeerToPeerCampaign.create(campaign_params, profile.id) }.to change(Campaign, :count).by 1
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'on failure' do
 | 
			
		||||
      it "returns an error if parent campaign can't be found" do
 | 
			
		||||
        campaign_params = {}
 | 
			
		||||
        Timecop.freeze(2020, 4, 5) do
 | 
			
		||||
          result = CreatePeerToPeerCampaign.create(campaign_params, profile.id)
 | 
			
		||||
 | 
			
		||||
          expect(result).to be_kind_of Hash
 | 
			
		||||
          expect(result['errors']['parent_campaign_id']).to eq 'not found'
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns a list of error messages for attribute validation' do
 | 
			
		||||
        campaign_params = { parent_campaign_id: parent_campaign.id }
 | 
			
		||||
        Timecop.freeze(2020, 4, 5) do
 | 
			
		||||
          result = CreatePeerToPeerCampaign.create(campaign_params, profile.id)
 | 
			
		||||
 | 
			
		||||
          expect(result).to be_kind_of Hash
 | 
			
		||||
          expect(result).to include 'errors'
 | 
			
		||||
          expect(result['errors']['goal_amount']).to match ["can't be blank", 'is not a number']
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "doesn't save campaign" do
 | 
			
		||||
        campaign_params = {}
 | 
			
		||||
        Timecop.freeze(2020, 4, 5) do
 | 
			
		||||
          expect { CreatePeerToPeerCampaign.create(campaign_params, profile.id) }.not_to change(Campaign, :count)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue