1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
# frozen_string_literal: true
# These helpers help you interact within the Web IDE.
#
# Usage:
# describe "..." do
# include WebIdeSpecHelpers
# ...
#
# ide_visit(project)
# ide_create_new_file('path/to/file.txt', content: 'Lorem ipsum')
# ide_commit
#
module WebIdeSpecHelpers
include ActionView::Helpers::JavaScriptHelper
def ide_visit(project)
visit project_path(project)
wait_for_requests
click_link('Web IDE')
wait_for_requests
save_monaco_editor_reference
end
def ide_tree_body
page.find('.ide-tree-body')
end
def ide_tree_actions
page.find('.ide-tree-actions')
end
def ide_tab_selector(mode)
".js-ide-#{mode}-mode"
end
def ide_folder_row_open?(row)
row.matches_css?('.folder.is-open')
end
# Creates a file in the IDE by expanding directories
# then using the dropdown next to the parent directory
#
# - Throws an error if the parent directory is not found
def ide_create_new_file(path, content: '')
parent_path = path.split('/')[0...-1].join('/')
container = ide_traverse_to_file(parent_path)
if container
click_file_action(container, 'New file')
else
ide_tree_actions.click_button('New file')
end
within '#ide-new-entry' do
find('input').fill_in(with: path)
click_button('Create file')
end
ide_set_editor_value(content)
end
def ide_rename_file(path, new_path)
container = ide_traverse_to_file(path)
click_file_action(container, 'Rename/Move')
within '#ide-new-entry' do
find('input').fill_in(with: new_path)
click_button('Rename file')
end
end
# Deletes a file by traversing to `path`
# then clicking the 'Delete' action.
#
# - Throws an error if the file is not found
def ide_delete_file(path)
container = ide_traverse_to_file(path)
click_file_action(container, 'Delete')
end
# Opens parent directories until the file at `path`
# is exposed.
#
# - Returns a reference to the file row at `path`
# - Throws an error if the file is not found
def ide_traverse_to_file(path)
paths = path.split('/')
container = nil
paths.each_with_index do |path, index|
ide_open_file_row(container) if container
container = find_file_child(container, path, level: index)
end
container
end
def ide_close_file(name)
within page.find('.multi-file-tabs') do
click_button("Close #{name}")
end
end
def ide_open_file(path)
row = ide_traverse_to_file(path)
ide_open_file_row(row)
wait_for_requests
end
def ide_open_file_row(row)
return if ide_folder_row_open?(row)
row.click
end
def ide_set_editor_value(value)
editor = find('.monaco-editor')
uri = editor['data-uri']
execute_script("monaco.editor.getModel('#{uri}').setValue('#{escape_javascript(value)}')")
end
def ide_set_editor_position(line, col)
execute_script("TEST_EDITOR.setPosition(#{{ lineNumber: line, column: col }.to_json})")
end
def ide_editor_value
editor = find('.monaco-editor')
uri = editor['data-uri']
evaluate_script("monaco.editor.getModel('#{uri}').getValue()")
end
def ide_commit_tab_selector
ide_tab_selector('commit')
end
def ide_commit
find(ide_commit_tab_selector).click
commit_to_current_branch
end
private
def file_row_container(row)
row ? row.find(:xpath, '..') : ide_tree_body
end
def find_file_child(row, name, level: nil)
container = file_row_container(row)
container.find(".file-row[data-level=\"#{level}\"]", text: name)
end
def click_file_action(row, text)
row.hover
dropdown = row.find('.ide-new-btn')
dropdown.find('button').click
dropdown.find('button', text: text).click
end
def commit_to_current_branch(option: 'Commit to master branch', message: '')
within '.multi-file-commit-form' do
fill_in('commit-message', with: message) if message
choose(option)
click_button('Commit')
wait_for_requests
end
end
def save_monaco_editor_reference
evaluate_script("monaco.editor.onDidCreateEditor(editor => { window.TEST_EDITOR = editor; })")
end
end
|