153 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# 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
 | 
						|
  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
 | 
						|
 | 
						|
  # 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_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_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
 | 
						|
end
 |