From 6f0cdc64c3b86e8d7c26da041eb7605bd4e77ac5 Mon Sep 17 00:00:00 2001 From: Ana Date: Fri, 22 Jul 2016 17:57:26 +0200 Subject: [PATCH 1/3] Introduce a "Save" button for the admin schedule The changes were saved after you drop an event, and now it only saves the schedule when you're done with the changes and click the "Save" button. --- app/assets/javascripts/osem-schedule.js | 146 +++++++++++------- app/assets/javascripts/osem-switch.js | 2 +- .../admin/event_schedules_controller.rb | 12 +- app/views/admin/schedules/show.html.haml | 2 + 4 files changed, 105 insertions(+), 57 deletions(-) diff --git a/app/assets/javascripts/osem-schedule.js b/app/assets/javascripts/osem-schedule.js index baae1933..fa9cec70 100644 --- a/app/assets/javascripts/osem-schedule.js +++ b/app/assets/javascripts/osem-schedule.js @@ -1,10 +1,13 @@ var url; // Should be initialize in Schedule.initialize var schedule_id; // Should be initialize in Schedule.initialize -function showError(error){ - // Delete other error messages before showing the new one +var events_to_save = {}; +var events_to_remove = {}; + +function showMessage(message, type){ + // Delete other messages before showing the new one $('.unobtrusive-flash-container').empty(); - UnobtrusiveFlash.showFlashMessage(error, {type: 'error'}); + UnobtrusiveFlash.showFlashMessage(message, {type: type}); } var Schedule = { @@ -14,66 +17,99 @@ var Schedule = { }, remove: function(element) { var e = $("#" + element); - var event_schedule_id = e.attr("event_schedule_id"); - if(event_schedule_id != null){ - var my_url = url + '/' + event_schedule_id; - var success_callback = function(data) { - console.log(data); - e.attr("event_schedule_id", null); - e.appendTo($(".unscheduled-events")); - e.find(".schedule-event-delete-button").hide(); + var event_id = e.attr("event_id"); + if(e.attr("event_schedule_id")!= null){ + events_to_remove[event_id] = { + event: e, + previous_parent: e.parent() + }; + } + delete events_to_save[event_id]; + var unscheduled = $(".unscheduled-events"); + e.appendTo(unscheduled); + e.find(".schedule-event-delete-button").hide(); + }, + add: function (previous_parent, new_parent, event) { + var params = { + previous_parent: previous_parent, + new_parent: new_parent, + event: event + } + var event_id = event.attr("event_id"); + events_to_save[event_id] = params; + delete events_to_remove[event_id]; + event.appendTo(new_parent); + $("#event-" + event_id).find(".schedule-event-delete-button").show(); + }, + saveEvents: function () { + var errors = ''; + for (var key in events_to_save){ + var event = events_to_save[key]['event']; + var event_schedule_id = event.attr("event_schedule_id"); + var new_parent = events_to_save[key]['new_parent']; + var my_url = url; + var type = 'POST'; + var params = { event_schedule: { + room_id: new_parent.attr("room_id"), + start_time: (new_parent.attr("date") + ' ' + new_parent.attr("hour")) + }}; + if(event_schedule_id != null){ + type = 'PUT'; + my_url += ('/' + event_schedule_id); } - var error_callback = function(data) { + else{ + params['event_schedule']['event_id'] = event.attr("event_id"); + params['event_schedule']['schedule_id'] = schedule_id; + } + var success_callback_save = function(data) { console.log(data); - showError($.parseJSON(data.responseText).errors); + event.attr("event_schedule_id", data.event_schedule_id); + } + var error_callback_save = function(data) { + console.log(data); + errors += $.parseJSON(data.responseText).errors; + event.appendTo(events_to_save[key]['previous_parent']); + if(parent.hasClass('unscheduled-events')) + event.find(".schedule-event-delete-button").hide(); } $.ajax({ + async: false, url: my_url, - type: 'DELETE', - success: success_callback, - error: error_callback, + type: type, + data: params, + success: success_callback_save, + error: error_callback_save, dataType : 'json' }); } - else{ - showError("The event couldn't be unscheduled"); - } - }, - add: function (previous_parent, new_parent, event) { - event.appendTo(new_parent); - var event_schedule_id = event.attr("event_schedule_id"); - var my_url = url; - var type = 'POST'; - var params = { event_schedule: { - room_id: new_parent.attr("room_id"), - start_time: (new_parent.attr("date") + ' ' + new_parent.attr("hour")) - }}; - if(event_schedule_id != null){ - type = 'PUT'; - my_url += ('/' + event_schedule_id); - } - else{ - params['event_schedule']['event_id'] = event.attr("event_id"); - params['event_schedule']['schedule_id'] = schedule_id; - } - var success_callback = function(data) { - console.log(data); - event.attr("event_schedule_id", data.event_schedule_id); - event.find(".schedule-event-delete-button").show(); + for (var key in events_to_remove){ + var event = events_to_remove[key]['event']; + var success_callback_remove = function(data) { + console.log(data); + event.attr("event_schedule_id", null); } - var error_callback = function(data) { - console.log(data); - showError($.parseJSON(data.responseText).errors); - event.appendTo(previous_parent); + var error_callback_remove = function(data) { + console.log(data); + errors += $.parseJSON(data.responseText).errors; + events_to_remove[key]['previous_parent'].append(event); + if(!parent.hasClass('unscheduled-events')) + event.find(".schedule-event-delete-button").show(); + } + $.ajax({ + async: false, + url: url + '/' + event.attr("event_schedule_id"), + type: 'DELETE', + success: success_callback_remove, + error: error_callback_remove, + dataType : 'json' + }); } - $.ajax({ - url: my_url, - type: type, - data: params, - success: success_callback, - error: error_callback, - dataType : 'json' - }); + events_to_remove = {}; + events_to_save = {}; + if(errors == '') + showMessage('Schedule correctly saved', 'notice'); + else + showMessage(errors, 'error'); } }; @@ -115,6 +151,10 @@ $(document).ready( function() { $(this).css("background-color", "#ffffff"); } }); + + $('.schedule-save').on('click', function(e) { + Schedule.saveEvents(); + }); }); function eventClicked(e, element){ diff --git a/app/assets/javascripts/osem-switch.js b/app/assets/javascripts/osem-switch.js index 1bdda72c..b98feb50 100644 --- a/app/assets/javascripts/osem-switch.js +++ b/app/assets/javascripts/osem-switch.js @@ -23,7 +23,7 @@ $(function () { } var callback = function(data) { - showError($.parseJSON(data.responseText).errors); + showMessage($.parseJSON(data.responseText).errors, 'error'); } $.ajax({ url: url, diff --git a/app/controllers/admin/event_schedules_controller.rb b/app/controllers/admin/event_schedules_controller.rb index 04713093..69de1b9c 100644 --- a/app/controllers/admin/event_schedules_controller.rb +++ b/app/controllers/admin/event_schedules_controller.rb @@ -6,7 +6,7 @@ module Admin if @event_schedule.save render json: { event_schedule_id: @event_schedule.id } else - render json: { errors: "The event couldn't be scheduled. #{@event_schedule.errors.full_messages.join('. ')}" }, status: 422 + render json: { errors: parse_errors(@event_schedule) }, status: 422 end end @@ -14,7 +14,7 @@ module Admin if @event_schedule.update(event_schedule_params) render json: { event_schedule_id: @event_schedule.id } else - render json: { errors: "The event couldn't be scheduled. #{@event_schedule.errors.full_messages.join('. ')}" }, status: 422 + render json: { errors: parse_errors(@event_schedule) }, status: 422 end end @@ -22,7 +22,7 @@ module Admin if @event_schedule.destroy render json: {} else - render json: { errors: "The event couldn't be unscheduled. #{@event_schedule.errors.full_messages.join('. ')}" }, status: 422 + render json: { errors: parse_errors(@event_schedule) }, status: 422 end end @@ -31,5 +31,11 @@ module Admin def event_schedule_params params.require(:event_schedule).permit(:schedule_id, :event_id, :room_id, :start_time) end + + def parse_errors(event_schedule) + title = event_schedule.event.try(:title).present? ? event_schedule.event.title : 'The event' + errors = event_schedule.errors.full_messages.present? ? " (#{event_schedule.errors.full_messages.join('. ')})" : '' + "#{title} couldn't be scheduled#{errors}. " + end end end diff --git a/app/views/admin/schedules/show.html.haml b/app/views/admin/schedules/show.html.haml index 9b2d3571..d6c44f34 100644 --- a/app/views/admin/schedules/show.html.haml +++ b/app/views/admin/schedules/show.html.haml @@ -17,6 +17,8 @@ off_color: 'warning', on_text: 'Yes', off_text: 'No' } + %button.btn.btn-success.schedule-save + Save .h4 Unscheduled events .unscheduled-events From 10561129f99482d2d5dfe890f7343364c376db49 Mon Sep 17 00:00:00 2001 From: Ana Date: Fri, 12 Aug 2016 21:35:21 +0200 Subject: [PATCH 2/3] Move save button One save button on the top rigth and another one on the bottom of the page. --- app/views/admin/schedules/show.html.haml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/views/admin/schedules/show.html.haml b/app/views/admin/schedules/show.html.haml index d6c44f34..c53755b0 100644 --- a/app/views/admin/schedules/show.html.haml +++ b/app/views/admin/schedules/show.html.haml @@ -4,8 +4,14 @@ .col-md-12 .page-header %h1 Schedule - %p.text-muted - Create the schedules for the conference + .row + .col-md-10.col-xs-8 + %p.text-muted + Create the schedules for the conference + .col-md-2.col-xs-4 + .text-right + %button.btn.btn-success.schedule-save + Save - if @rooms.present? .row @@ -17,8 +23,6 @@ off_color: 'warning', on_text: 'Yes', off_text: 'No' } - %button.btn.btn-success.schedule-save - Save .h4 Unscheduled events .unscheduled-events @@ -34,6 +38,10 @@ - @dates.each do |date| .tab-pane{ class: "#{ (@dates.first == date) ? 'active' : '' }", id: "#{date}" } = render partial: 'day_tab', locals: { date: date } + .row + .col-md-12.text-right + %button.btn.btn-success.schedule-save + Save - else .h3 No Rooms! From bcff982d3da3cbdc4987b7bc54c5d33710589a40 Mon Sep 17 00:00:00 2001 From: Ana Date: Thu, 18 Aug 2016 00:27:52 +0200 Subject: [PATCH 3/3] Introduce bulk :create, :update and :destroy Introduce bulk :create, :update and :destroy actions to avoid doing several request in the admin schedule. --- app/assets/javascripts/osem-schedule.js | 143 +++++++++--------- .../admin/event_schedules_controller.rb | 54 +++---- app/views/admin/schedules/show.html.haml | 10 +- config/routes.rb | 4 +- .../admin/event_schedules_controller_spec.rb | 111 +++++++++----- 5 files changed, 186 insertions(+), 136 deletions(-) diff --git a/app/assets/javascripts/osem-schedule.js b/app/assets/javascripts/osem-schedule.js index fa9cec70..f3e7e93c 100644 --- a/app/assets/javascripts/osem-schedule.js +++ b/app/assets/javascripts/osem-schedule.js @@ -1,7 +1,8 @@ -var url; // Should be initialize in Schedule.initialize +var conference_id; // Should be initialize in Schedule.initialize var schedule_id; // Should be initialize in Schedule.initialize -var events_to_save = {}; +var events_to_create = {}; +var events_to_update = {}; var events_to_remove = {}; function showMessage(message, type){ @@ -11,105 +12,101 @@ function showMessage(message, type){ } var Schedule = { - initialize: function(url_param, schedule_id_param) { - url = url_param; + initialize: function(conference_id_param, schedule_id_param) { + conference_id = conference_id_param; schedule_id = schedule_id_param; }, remove: function(element) { var e = $("#" + element); var event_id = e.attr("event_id"); - if(e.attr("event_schedule_id")!= null){ - events_to_remove[event_id] = { - event: e, - previous_parent: e.parent() - }; + var event_schedule_id = e.attr("event_schedule_id"); + if(event_schedule_id != null){ + events_to_remove[event_id] = event_schedule_id; } - delete events_to_save[event_id]; + delete events_to_create[event_id]; + delete events_to_update[event_id]; var unscheduled = $(".unscheduled-events"); e.appendTo(unscheduled); e.find(".schedule-event-delete-button").hide(); }, - add: function (previous_parent, new_parent, event) { - var params = { - previous_parent: previous_parent, - new_parent: new_parent, - event: event - } + add: function (new_parent, event) { var event_id = event.attr("event_id"); - events_to_save[event_id] = params; + var event_schedule_id = event.attr("event_schedule_id"); + var room_id = new_parent.attr("room_id"); + var start_time = (new_parent.attr("date") + ' ' + new_parent.attr("hour")); + if(event_schedule_id != null){ + var params = {}; + params[event_schedule_id] = { + room_id: room_id, + start_time: start_time + }; + events_to_update[event_id] = params; + delete events_to_create[event_id]; + } + else{ + events_to_create[event_id] = { + room_id: room_id, + start_time: start_time, + event_id: event_id, + schedule_id: schedule_id + }; + delete events_to_update[event_id]; + } delete events_to_remove[event_id]; event.appendTo(new_parent); $("#event-" + event_id).find(".schedule-event-delete-button").show(); }, saveEvents: function () { var errors = ''; - for (var key in events_to_save){ - var event = events_to_save[key]['event']; - var event_schedule_id = event.attr("event_schedule_id"); - var new_parent = events_to_save[key]['new_parent']; - var my_url = url; - var type = 'POST'; - var params = { event_schedule: { - room_id: new_parent.attr("room_id"), - start_time: (new_parent.attr("date") + ' ' + new_parent.attr("hour")) - }}; - if(event_schedule_id != null){ - type = 'PUT'; - my_url += ('/' + event_schedule_id); - } - else{ - params['event_schedule']['event_id'] = event.attr("event_id"); - params['event_schedule']['schedule_id'] = schedule_id; - } - var success_callback_save = function(data) { - console.log(data); - event.attr("event_schedule_id", data.event_schedule_id); - } - var error_callback_save = function(data) { - console.log(data); + var with_errors = false; + var error_callback = function(data) { + try{ errors += $.parseJSON(data.responseText).errors; - event.appendTo(events_to_save[key]['previous_parent']); - if(parent.hasClass('unscheduled-events')) - event.find(".schedule-event-delete-button").hide(); + with_errors = true; + }catch(e){ + with_errors = true; } + } + if(!jQuery.isEmptyObject(events_to_create)){ $.ajax({ async: false, - url: my_url, - type: type, - data: params, - success: success_callback_save, - error: error_callback_save, + url: ("/admin/conferences/" + conference_id + "/bulk_create"), + type: 'POST', + data: { event_schedules: events_to_create }, + error: error_callback, dataType : 'json' }); } - for (var key in events_to_remove){ - var event = events_to_remove[key]['event']; - var success_callback_remove = function(data) { - console.log(data); - event.attr("event_schedule_id", null); - } - var error_callback_remove = function(data) { - console.log(data); - errors += $.parseJSON(data.responseText).errors; - events_to_remove[key]['previous_parent'].append(event); - if(!parent.hasClass('unscheduled-events')) - event.find(".schedule-event-delete-button").show(); - } + if(!jQuery.isEmptyObject(events_to_update)){ $.ajax({ async: false, - url: url + '/' + event.attr("event_schedule_id"), - type: 'DELETE', - success: success_callback_remove, - error: error_callback_remove, + url: ("/admin/conferences/" + conference_id + "/bulk_update"), + type: 'POST', + data: { event_schedules: events_to_update }, + error: error_callback, dataType : 'json' }); } - events_to_remove = {}; - events_to_save = {}; - if(errors == '') - showMessage('Schedule correctly saved', 'notice'); - else - showMessage(errors, 'error'); + if(!jQuery.isEmptyObject(events_to_remove)){ + $.ajax({ + async: false, + url: ("/admin/conferences/" + conference_id + "/bulk_destroy"), + type: 'POST', + data: { event_schedules: events_to_remove }, + error: error_callback, + dataType : 'json' + }); + } + var url = (window.location.href).substring(0, window.location.href.indexOf('?')); + if(with_errors){ + var msg = "Some events couldn't be scheduled" + if(errors != ''){ + msg += (": " + errors); + } + window.location.href = (url + "?flash=" + msg + "&type=error"); + } else { + window.location.href = (url + "?flash=Schedule correctly saved&type=notice"); + } } }; @@ -142,7 +139,7 @@ $(document).ready( function() { $(ui.draggable).css("left", 0); $(ui.draggable).css("top", 0); $(this).css("background-color", "#ffffff"); - Schedule.add($(ui.draggable).parent(), $(this), $(ui.draggable)); + Schedule.add($(this), $(ui.draggable)); }, over: function(event, ui) { $(this).css("background-color", "#009ED8"); diff --git a/app/controllers/admin/event_schedules_controller.rb b/app/controllers/admin/event_schedules_controller.rb index 69de1b9c..6b8ecc14 100644 --- a/app/controllers/admin/event_schedules_controller.rb +++ b/app/controllers/admin/event_schedules_controller.rb @@ -2,40 +2,40 @@ module Admin class EventSchedulesController < Admin::BaseController load_and_authorize_resource :event_schedule - def create - if @event_schedule.save - render json: { event_schedule_id: @event_schedule.id } - else - render json: { errors: parse_errors(@event_schedule) }, status: 422 - end - end - - def update - if @event_schedule.update(event_schedule_params) - render json: { event_schedule_id: @event_schedule.id } - else - render json: { errors: parse_errors(@event_schedule) }, status: 422 - end - end - - def destroy - if @event_schedule.destroy + def bulk_create + result = EventSchedule.create(params[:event_schedules].values).reject { |p| p.errors.empty? } + if result.empty? render json: {} else - render json: { errors: parse_errors(@event_schedule) }, status: 422 + event_names = result.collect { |event_schedule| event_schedule.event.try(:title) } + render json: { errors: event_names.to_s }, status: 422 end end - private - - def event_schedule_params - params.require(:event_schedule).permit(:schedule_id, :event_id, :room_id, :start_time) + def bulk_update + keys = [] + values = [] + params[:event_schedules].values.each do |e| + keys << e.keys[0] + values << e.values[0] + end + result = EventSchedule.update(keys, values).reject { |p| p.errors.empty? } + if result.empty? + render json: {} + else + event_names = result.collect { |event_schedule| event_schedule.event.try(:title) } + render json: { errors: event_names.to_s }, status: 422 + end end - def parse_errors(event_schedule) - title = event_schedule.event.try(:title).present? ? event_schedule.event.title : 'The event' - errors = event_schedule.errors.full_messages.present? ? " (#{event_schedule.errors.full_messages.join('. ')})" : '' - "#{title} couldn't be scheduled#{errors}. " + def bulk_destroy + result = EventSchedule.destroy(params[:event_schedules].values).reject { |p| p.errors.empty? } + if result.empty? + render json: {} + else + event_names = result.collect { |event_schedule| event_schedule.event.try(:title) } + render json: { errors: event_names.to_s }, status: 422 + end end end end diff --git a/app/views/admin/schedules/show.html.haml b/app/views/admin/schedules/show.html.haml index c53755b0..8a139796 100644 --- a/app/views/admin/schedules/show.html.haml +++ b/app/views/admin/schedules/show.html.haml @@ -51,5 +51,13 @@ :javascript $(document).ready( function() { - Schedule.initialize("#{admin_conference_event_schedules_path(@conference)}", "#{@schedule.id}"); + // When reload the page after saving, show flash messages in the url. + var url = window.location.href; + if (url.indexOf("?") > 0){ + var params = (url.split("?"))[1].split(/[&=]/); + if(params[0] == 'flash' && params[2] == 'type') + showMessage(decodeURI(params[1]), params[3]); + } + + Schedule.initialize("#{@conference.short_title}", "#{@schedule.id}"); }); diff --git a/config/routes.rb b/config/routes.rb index 7bd331d9..92c12b0f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,7 +28,9 @@ Osem::Application.routes.draw do resources :conferences do resource :contact, except: [:index, :new, :create, :show, :destroy] resources :schedules, only: [:index, :create, :show, :update, :destroy] - resources :event_schedules, only: [:create, :update, :destroy] + post '/bulk_create' => 'event_schedules#bulk_create' + post '/bulk_update' => 'event_schedules#bulk_update' + post '/bulk_destroy' => 'event_schedules#bulk_destroy' get 'commercials/render_commercial' => 'commercials#render_commercial' resources :commercials, only: [:index, :create, :update, :destroy] get '/volunteers_list' => 'volunteers#show' diff --git a/spec/controllers/admin/event_schedules_controller_spec.rb b/spec/controllers/admin/event_schedules_controller_spec.rb index 4d0569ec..88c29a54 100644 --- a/spec/controllers/admin/event_schedules_controller_spec.rb +++ b/spec/controllers/admin/event_schedules_controller_spec.rb @@ -4,30 +4,39 @@ describe Admin::EventSchedulesController do let(:venue) { create(:venue) } let(:conference) { create(:conference, venue: venue) } let(:room) { create(:room, venue: venue) } - let(:schedule) { create(:schedule, program: conference.program)} - let(:event_schedule) { create(:event_schedule, schedule: schedule)} + let(:schedule) { create(:schedule, program: conference.program) } let!(:organizer_role) { Role.find_by(name: 'organizer', resource: conference) } let(:organizer) { create(:user, role_ids: organizer_role.id) } context 'logged in as an organizer' do before :each do sign_in(organizer) - event_schedule end describe 'POST #create' do context 'with valid attributes' do + let(:event1) { create(:event, program: conference.program) } + let(:event2) { create(:event, program: conference.program) } let(:create_action) do - post :create, conference_id: conference.short_title, event_schedule: - attributes_for(:event_schedule, - schedule_id: schedule.id, - event_id: create(:event, program: conference.program).id, - room_id: create(:room, venue: venue).id, - start_time: conference.start_date) + post :bulk_create, conference_id: conference.short_title, + event_schedules: { + event1.id => { + schedule_id: schedule.id, + event_id: event1.id, + room_id: create(:room, venue: venue).id, + start_time: conference.start_date + }, + event2.id => { + schedule_id: schedule.id, + event_id: event2.id, + room_id: create(:room, venue: venue).id, + start_time: conference.start_date + } + } end it 'saves the event schedule to the database' do - expect{ create_action }.to change { EventSchedule.count }.by 1 + expect{ create_action }.to change { EventSchedule.count }.by 2 end it 'has 200 status code' do @@ -37,14 +46,17 @@ describe Admin::EventSchedulesController do end context 'with invalid attributes' do - + let(:event1) { create(:event, program: conference.program) } let(:create_action) do - post :create, conference_id: conference.short_title, event_schedule: - attributes_for(:event_schedule, - schedule_id: schedule.id, - event_id: nil, - room_id: nil, - start_time: nil) + post :bulk_create, conference_id: conference.short_title, + event_schedules: { + event1.id => { + schedule_id: schedule.id, + event_id: event1.id, + room_id: nil, + start_time: nil + } + } end it 'does not save the event schedule to the database' do @@ -60,22 +72,38 @@ describe Admin::EventSchedulesController do describe 'POST #update' do context 'with valid attributes' do + let(:event1) { create(:event, program: conference.program) } + let(:event2) { create(:event, program: conference.program) } + let(:event_schedule1) { create(:event_schedule, schedule: schedule, event: event1) } + let(:event_schedule2) { create(:event_schedule, schedule: schedule, event: event2) } before :each do - patch :update, id: event_schedule.id, conference_id: conference.short_title, event_schedule: - attributes_for(:event_schedule, - schedule_id: schedule.id, - event_id: create(:event, program: conference.program).id, - room_id: room.id, - start_time: conference.start_date) - event_schedule.reload + post :bulk_update, conference_id: conference.short_title, + event_schedules: { + event1.id => { + event_schedule1.id => { + room_id: room.id, + start_time: conference.start_date + } + }, + event2.id => { + event_schedule2.id => { + room_id: room.id, + start_time: conference.start_date + 1.day + } + } + } + event_schedule1.reload + event_schedule2.reload end it 'updates the room' do - expect(event_schedule.room_id).to eq(room.id) + expect(event_schedule1.room_id).to eq(room.id) + expect(event_schedule2.room_id).to eq(room.id) end it 'updates the start_time' do - expect(event_schedule.start_time).to eq(conference.start_date) + expect(event_schedule1.start_time).to eq(conference.start_date) + expect(event_schedule2.start_time).to eq(conference.start_date + 1.day) end it 'has 200 status code' do @@ -84,13 +112,18 @@ describe Admin::EventSchedulesController do end context 'with invalid attributes' do + let(:event) { create(:event, program: conference.program) } + let(:event_schedule) { create(:event_schedule, schedule: schedule, event: event) } let(:update_action) do - patch :update, id: event_schedule.id, conference_id: conference.short_title, event_schedule: - attributes_for(:event_schedule, - schedule_id: schedule.id, - event_id: nil, - room_id: nil, - start_time: nil) + post :bulk_update, conference_id: conference.short_title, + event_schedules: { + event.id => { + event_schedule.id => { + room_id: nil, + start_time: nil + } + } + } end it 'does not save the event schedule to the database' do expect{ update_action }.to_not change { event_schedule } @@ -104,12 +137,22 @@ describe Admin::EventSchedulesController do end describe 'DELETE #destroy' do + let(:event1) { create(:event, program: conference.program) } + let(:event2) { create(:event, program: conference.program) } + let(:event_schedule1) { create(:event_schedule, schedule: schedule, event: event1) } + let(:event_schedule2) { create(:event_schedule, schedule: schedule, event: event2) } let(:destroy_action) do - delete :destroy, id: event_schedule.id, conference_id: conference.short_title + post :bulk_destroy, conference_id: conference.short_title, + event_schedules: { + event1.id => event_schedule1, + event2.id => event_schedule2 + } end it 'deletes the event schedule' do - expect{ destroy_action }.to change { EventSchedule.count }.by(-1) + event_schedule1.reload + event_schedule2.reload + expect{ destroy_action }.to change { EventSchedule.count }.by(-2) end it 'has 200 status code' do