Skip to content
This repository has been archived by the owner on Mar 27, 2023. It is now read-only.

Commit

Permalink
Merge pull request #597 from SumOfUs/ak-campaigns-sync
Browse files Browse the repository at this point in the history
Publish event after creating a Campaign
  • Loading branch information
osahyoun committed Aug 4, 2016
2 parents c2adab5 + 8acab7b commit 730688b
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 8 deletions.
19 changes: 14 additions & 5 deletions app/controllers/campaigns_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,13 @@ def new
end

def create
@campaign = Campaign.create permitted_params
redirect_to :campaigns, notice: t('campaigns.create.notice')
@campaign = CampaignCreator.run campaign_params
if @campaign.persisted?
redirect_to :campaigns, notice: t('campaigns.create.notice')
else
flash[:error] = t('campaigns.error')
render :edit, status: :unprocessable_entity
end
end

def show
Expand All @@ -21,8 +26,12 @@ def edit
end

def update
@campaign.update permitted_params
redirect_to :campaigns, notice: t('campaigns.update.notice')
if CampaignUpdater.run(@campaign, campaign_params)
redirect_to :campaigns, notice: t('campaigns.update.notice')
else
flash[:error] = t('campaigns.error')
render :edit, status: :unprocessable_entity
end
end

# Deactives campaign and its associated pages
Expand All @@ -35,7 +44,7 @@ def destroy

private

def permitted_params
def campaign_params
params.require(:campaign).permit(:id, :name)
end

Expand Down
27 changes: 27 additions & 0 deletions app/services/campaign_creator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
class CampaignCreator
def self.run(params)
new(params).run
end

def initialize(params)
@params = params
end

def run
@campaign = Campaign.create(@params)
if @campaign.persisted?
publish_event
end
@campaign
end

private

def publish_event
ChampaignQueue.push({
type: 'create_campaign',
name: @campaign.name,
campaign_id: @campaign.id
})
end
end
28 changes: 28 additions & 0 deletions app/services/campaign_updater.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
class CampaignUpdater
def self.run(campaign, params)
new(campaign, params).run
end

def initialize(campaign, params)
@campaign = campaign
@params = params
end

def run
@campaign.update(@params).tap do |success|
if success
publish_event
end
end
end

private

def publish_event
ChampaignQueue.push({
type: 'update_campaign',
name: @campaign.name,
campaign_id: @campaign.id
})
end
end
1 change: 1 addition & 0 deletions config/locales/champaign.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ en:
notice: "Campaign has been updated."
destroy:
notice: "The campaign '%{name}' was deactivated. Contact an admin if you'd like to reactivate it."
error: "There was an error, please try again."

forms:
index:
Expand Down
7 changes: 4 additions & 3 deletions spec/controllers/campaigns_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,15 @@

describe "POST create" do
let(:fake_params) { { 'name' => 'Foo'} }
let(:campaign) { double( :persisted? => true) }

before do
allow(Campaign).to receive(:create) { campaign }
allow(CampaignCreator).to receive(:run) { campaign }
post :create, campaign: fake_params
end

it 'creates new campaign' do
expect(Campaign).to have_received(:create).with(fake_params)
it 'calls CampaignCreator.run' do
expect(CampaignCreator).to have_received(:run).with(fake_params)
end

it 'responds with notice' do
Expand Down
96 changes: 96 additions & 0 deletions spec/requests/campaigns_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
require 'rails_helper'

describe "Campaigns", type: :request do
before do
login_as(create(:user), scope: :user)
end

describe "#create" do
context "given valid params" do
let(:params) do
{ campaign: { name: "Super Campaign" } }
end

it "creates a new campaign" do
expect {
post "/campaigns", params
}.to change(Campaign, :count).by(1)
end

it "redirects to /campaigns" do
post "/campaigns", params
expect(response).to redirect_to "/campaigns"
end

it "publishes the event" do
expect(ChampaignQueue).to receive(:push).with({
name: 'Super Campaign',
type: 'create_campaign',
campaign_id: be_a(Integer)
})
post "/campaigns", params
end
end

context "given invalid params" do
let(:params) do
{ campaign: { name: "" } }
end

it "returns 422 Unprocessable Entity" do
post '/campaigns', params
expect(response).to have_http_status(:unprocessable_entity)
end

it "displays an error message" do
post '/campaigns', params
expect(response.body).to include "There was an error"
end
end
end

describe "#update" do
let!(:campaign) { create(:campaign) }
context "given valid params" do
let(:params) do
{ campaign: { name: "Updated Campaign" } }
end

it "updates the campaign" do
put "/campaigns/#{campaign.id}", params
expect(campaign.reload.name).to eq "Updated Campaign"
end

it "redirects to /campaigns" do
put "/campaigns/#{campaign.id}", params
expect(response).to redirect_to "/campaigns"
end

it "publishes the event" do
expect(ChampaignQueue).to receive(:push).with(
type: 'update_campaign',
name: 'Updated Campaign',
campaign_id: campaign.id
);
put "/campaigns/#{campaign.id}", params
end
end

context "given invalid params" do
let(:params) do
{ campaign: { name: "" } }
end

it "returns 422 Unprocessable Entity" do
put "/campaigns/#{campaign.id}", params
expect(response).to have_http_status(:unprocessable_entity)
end

it "displays an error message" do
put "/campaigns/#{campaign.id}", params
expect(response.body).to include "There was an error"
end
end

end
end

0 comments on commit 730688b

Please sign in to comment.