mirror of
https://github.com/opf/openproject.git
synced 2026-06-14 03:30:14 +00:00
Fix feature tests for new global project selection
This commit is contained in:
+1
-1
@@ -27,13 +27,13 @@
|
||||
</div>
|
||||
<div
|
||||
class="op-project-list-modal--body spot-container"
|
||||
data-qa-selector="op-project-menu-autocomplete--body"
|
||||
>
|
||||
<spot-text-field
|
||||
[disabled]="(loading$ | async)"
|
||||
[placeholder]="text.search_placeholder"
|
||||
[(ngModel)]="searchableProjectListService.searchText"
|
||||
[ngModelOptions]="{standalone: true}"
|
||||
data-qa-selector="op-project-menu-autocomplete--search"
|
||||
>
|
||||
<span
|
||||
slot="before"
|
||||
|
||||
@@ -43,7 +43,7 @@ export class OpSearchHighlightDirective implements AfterViewChecked {
|
||||
const end = content.slice(startIndex + query.length);
|
||||
|
||||
const newNode = document.createElement('span');
|
||||
newNode.innerHTML = `${start}<span class="op-search-highlight">${result}</span>${end}`;
|
||||
newNode.innerHTML = `${_.escape(start)}<span class="op-search-highlight">${_.escape(result)}</span>${_.escape(end)}`;
|
||||
el.replaceChild(newNode, textNode);
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ describe 'project menu', type: :feature do
|
||||
it 'leads to cost reports' do
|
||||
click_on 'Time and costs'
|
||||
|
||||
expect(page).to have_selector('.op-app-menu--item-title', text: 'Ponyo')
|
||||
expect(page).to have_current_path("/projects/ponyo/cost_reports")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@ describe 'Top menu items', js: true, selenium: true do
|
||||
end
|
||||
|
||||
it 'visits the projects page' do
|
||||
click_link_in_open_menu(all_projects)
|
||||
page.find_link(all_projects).click
|
||||
|
||||
expect(page).to have_current_path(projects_path)
|
||||
end
|
||||
|
||||
@@ -60,7 +60,7 @@ describe 'onboarding tour for new users', js: true do
|
||||
select 'Deutsch', from: 'user_language'
|
||||
click_button 'Save'
|
||||
|
||||
expect(page).to have_text 'Projekt auswählen'
|
||||
expect(page).to have_text "Neueste sichtbare Projekte in dieser Instanz."
|
||||
end
|
||||
|
||||
context 'the tutorial does not start' do
|
||||
|
||||
@@ -91,63 +91,49 @@ describe 'Projects autocomplete page', type: :feature, js: true do
|
||||
top_menu.expect_open
|
||||
|
||||
# projects are displayed initially
|
||||
within(top_menu.search_results) do
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper', text: project.name)
|
||||
# public project is displayed as it is public
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper', text: public_project.name)
|
||||
# only projects the user is member in are displayed
|
||||
expect(page).to have_no_selector('.ui-menu-item-wrapper', text: non_member_project.name)
|
||||
end
|
||||
top_menu.expect_result project.name
|
||||
# public project is displayed as it is public
|
||||
top_menu.expect_result public_project.name
|
||||
# only projects the user is member in are displayed
|
||||
top_menu.expect_no_result non_member_project.name
|
||||
|
||||
# Filter for projects
|
||||
top_menu.search '<strong'
|
||||
|
||||
# Expect highlights
|
||||
within(top_menu.search_results) do
|
||||
expect(page).to have_selector('mark', text: '<strong')
|
||||
expect(page).to have_selector('.op-search-highlight', text: '<strong')
|
||||
expect(page).to have_no_selector('strong')
|
||||
end
|
||||
|
||||
# Expect fuzzy matches for plain
|
||||
top_menu.search 'Plain pr'
|
||||
within(top_menu.search_results) do
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper', text: 'Plain project')
|
||||
expect(page).to have_no_selector('.ui-menu-item-wrapper', text: 'Plain other project')
|
||||
end
|
||||
top_menu.expect_result 'Plain project'
|
||||
top_menu.expect_no_result 'Plain other project'
|
||||
|
||||
# Expect hierarchy
|
||||
top_menu.clear_search
|
||||
|
||||
within(top_menu.search_results) do
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper', text: 'Plain project')
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper', text: '<strong>foobar</strong>')
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper', text: '» Plain other project')
|
||||
end
|
||||
top_menu.expect_result 'Plain project'
|
||||
top_menu.expect_result '<strong>foobar</strong>'
|
||||
top_menu.expect_item_with_hierarchy_level hierarchy_level: 2, item_name: 'Plain other project'
|
||||
|
||||
# Show hierarchy of project
|
||||
top_menu.search 'Plain other project'
|
||||
|
||||
within(top_menu.search_results) do
|
||||
expect(page).to have_selector('.ui-state-disabled .ui-menu-item-wrapper', text: '<strong>foobar</strong>')
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper.ui-state-active', text: '» Plain other project')
|
||||
end
|
||||
# TODO: test for foobar being disabled
|
||||
top_menu.expect_result '<strong>foobar</strong>'
|
||||
top_menu.expect_item_with_hierarchy_level hierarchy_level: 2, item_name: 'Plain other project'
|
||||
|
||||
# find terms at the end of project names
|
||||
top_menu.search 'END'
|
||||
within(top_menu.search_results) do
|
||||
expect(page).to have_selector(
|
||||
'.ui-menu-item-wrapper',
|
||||
text: 'Very long project name with term at the END'
|
||||
)
|
||||
end
|
||||
top_menu.expect_result 'Very long project name with term at the END'
|
||||
|
||||
# Find literal matches exclusively if present
|
||||
top_menu.search 'INK15'
|
||||
within(top_menu.search_results) do
|
||||
expect(page).to have_selector('.ui-menu-item-wrapper', text: 'INK15 - Bar')
|
||||
expect(page).to have_no_selector('.ui-menu-item-wrapper', text: 'INK14 - Foo')
|
||||
expect(page).to have_no_selector('.ui-menu-item-wrapper', text: 'INK16 - Baz')
|
||||
end
|
||||
top_menu.expect_result 'INK15 - Bar'
|
||||
top_menu.expect_no_result 'INK14 - Foo'
|
||||
top_menu.expect_no_result 'INK16 - Baz'
|
||||
|
||||
# Visit a project
|
||||
top_menu.search_and_select '<strong'
|
||||
|
||||
@@ -51,7 +51,7 @@ module Components
|
||||
end
|
||||
|
||||
def search(query)
|
||||
search_autocomplete(autocompleter, query:)
|
||||
search_autocomplete(autocompleter, query:, results_selector: autocompleter_results_selector)
|
||||
end
|
||||
|
||||
def clear_search
|
||||
@@ -62,7 +62,7 @@ module Components
|
||||
def search_and_select(query)
|
||||
select_autocomplete autocompleter,
|
||||
results_selector: autocompleter_results_selector,
|
||||
item_selector: autocompleter_item_selector,
|
||||
item_selector: autocompleter_item_title_selector,
|
||||
query:
|
||||
end
|
||||
|
||||
@@ -74,7 +74,31 @@ module Components
|
||||
page.find autocompleter_selector
|
||||
end
|
||||
|
||||
def expect_result(name)
|
||||
within search_results do
|
||||
expect(page).to have_selector(autocompleter_item_title_selector, text: name)
|
||||
end
|
||||
end
|
||||
|
||||
def expect_no_result(name)
|
||||
within search_results do
|
||||
expect(page).to have_no_selector(autocompleter_item_title_selector, text: name)
|
||||
end
|
||||
end
|
||||
|
||||
def expect_item_with_hierarchy_level(hierarchy_level:, item_name:)
|
||||
within search_results do
|
||||
hierarchy_selector = hierarchy_level.times.collect { autocompleter_item_selector }.join(' ')
|
||||
expect(page)
|
||||
.to have_selector("#{hierarchy_selector} #{autocompleter_item_title_selector}", text: item_name)
|
||||
end
|
||||
end
|
||||
|
||||
def autocompleter_item_selector
|
||||
'[data-qa-selector="op-project-list--item"]'
|
||||
end
|
||||
|
||||
def autocompleter_item_title_selector
|
||||
'[data-qa-selector="op-project-list--item-title"]'
|
||||
end
|
||||
|
||||
@@ -83,7 +107,7 @@ module Components
|
||||
end
|
||||
|
||||
def autocompleter_selector
|
||||
'[data-qa-selector="op-project-menu-autocomplete--body"]'
|
||||
'[data-qa-selector="op-project-menu-autocomplete--search"] input'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -50,32 +50,6 @@ describe 'layouts/base', type: :view do
|
||||
allow(view).to receive(:current_user).and_return current_user
|
||||
end
|
||||
|
||||
describe 'projects menu visibility' do
|
||||
context 'when the user is not logged in' do
|
||||
let(:current_user) { anonymous }
|
||||
|
||||
before do
|
||||
render
|
||||
end
|
||||
|
||||
it 'the projects menu should not be displayed' do
|
||||
expect(rendered).not_to have_text('Select a project')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the user is logged in' do
|
||||
let(:current_user) { user }
|
||||
|
||||
before do
|
||||
render
|
||||
end
|
||||
|
||||
it 'the projects menu should be displayed' do
|
||||
expect(rendered).to have_text('Select a project')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'Sign in button' do
|
||||
let(:current_user) { anonymous }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user