Skip to content

Commit 2d4af42

Browse files
AndrewKvalheimhennevogel
authored andcommitted
Test drag-and-drop schedule editor
1 parent 8c1c451 commit 2d4af42

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

spec/features/schedule_spec.rb

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
def expect_scheduled(event, time)
6+
visit admin_conference_program_event_path(event.conference.short_title, event)
7+
if time
8+
date = event.conference.start_date.strftime('%F')
9+
expect(page).to have_text("Scheduled time #{date} #{time} #{event.conference.timezone}")
10+
else
11+
expect(page).to have_no_text('Scheduled')
12+
end
13+
end
14+
15+
def move(event, to:)
16+
draggable = find("#event-#{event.id}.ui-draggable")
17+
droppable = find("#schedule-room-#{to[0].guid}-#{to[1]}-#{to[2]}.ui-droppable")
18+
wait_for_ajax { draggable.drag_to droppable }
19+
end
20+
21+
def remove(event)
22+
button = find("#event-#{event.id} .schedule-event-delete-button")
23+
wait_for_ajax { button.click }
24+
end
25+
26+
feature Schedule do
27+
let(:venue) { create(:venue) }
28+
let(:conference) { create(:conference, venue: venue) }
29+
let!(:room) { create(:room, venue: venue) }
30+
let!(:event) { create(:event, program: conference.program, state: 'confirmed') }
31+
32+
context 'as an organizer' do
33+
let(:organizer) { create(:organizer, resource: conference) }
34+
35+
before :each do
36+
sign_in organizer
37+
end
38+
39+
scenario 'create a schedule', js: true do
40+
expect_scheduled event, nil
41+
42+
visit admin_conference_schedules_path(conference)
43+
click_on 'Add Schedule'
44+
move event, to: [room, 9, 30]
45+
wait_for_ajax { switch conference.short_title, to: true }
46+
47+
expect_scheduled event, '09:30'
48+
end
49+
50+
scenario 'reschedule an event', js: true do
51+
create(:event_schedule, event: event, room: room)
52+
expect_scheduled event, '09:00'
53+
54+
visit admin_conference_schedule_path(conference, conference.program.selected_schedule)
55+
move event, to: [room, 12, 15]
56+
57+
expect_scheduled event, '12:15'
58+
end
59+
60+
scenario 'unschedule an event', js: true do
61+
create(:event_schedule, event: event, room: room)
62+
expect_scheduled event, '09:00'
63+
64+
visit admin_conference_schedule_path(conference, conference.program.selected_schedule)
65+
remove event
66+
67+
expect_scheduled event, nil
68+
end
69+
end
70+
end

spec/spec_helper.rb

+2
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@
9292
config.include FactoryBot::Syntax::Methods
9393
config.include OmniauthMacros
9494
config.include Devise::Test::ControllerHelpers, type: :controller
95+
config.include BootstrapMacros, type: :feature
96+
config.include JQueryMacros, type: :feature
9597
config.include LoginMacros, type: :feature
9698
config.include Flash, type: :feature
9799
config.include Sidebar, type: :view

spec/support/bootstrap_macros.rb

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# frozen_string_literal: true
2+
3+
module BootstrapMacros
4+
# Interact with Bootstrap Switch
5+
def switch(locator, to:, **options)
6+
checkbox = find(:checkbox, locator, **options, visible: :hidden)
7+
8+
checkbox.ancestor('.bootstrap-switch').click unless checkbox.checked? == to
9+
expect(page).to have_selector(:checkbox, locator, **options, visible: :hidden, checked: to)
10+
end
11+
end

spec/support/jquery_macros.rb

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# frozen_string_literal: true
2+
3+
module JQueryMacros
4+
# Wait for one jQuery Ajax request during the block
5+
def wait_for_ajax
6+
flag = "window.ajax_#{SecureRandom.alphanumeric(16)}"
7+
page.execute_script "#{flag} = false; $(document).one('ajaxComplete', () => #{flag} = true);"
8+
9+
yield
10+
11+
Timeout.timeout(Capybara.default_max_wait_time) { loop until page.evaluate_script(flag) }
12+
page.execute_script "delete #{flag};"
13+
end
14+
end

0 commit comments

Comments
 (0)