OpenProject is the leading open source project management software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openproject/spec/features/work_packages/highlighting_spec.rb

228 lines
9.8 KiB

require 'spec_helper'
describe 'Work Package highlighting fields',
with_ee: %i[conditional_highlighting],
js: true do
let(:user) { FactoryBot.create :admin }
let(:project) { FactoryBot.create(:project) }
let(:status1) { FactoryBot.create :status, color: FactoryBot.create(:color, hexcode: '#FF0000') } # rgba(255, 0, 0, 1)
let(:status2) { FactoryBot.create :status, color: FactoryBot.create(:color, hexcode: '#F0F0F0') } # rgba(240, 240, 240, 1)
let(:priority1) { FactoryBot.create :issue_priority, color: FactoryBot.create(:color, hexcode: '#123456') } #rgba(18, 52, 86, 1)
let(:priority_no_color) { FactoryBot.create :issue_priority, color: nil }
let!(:wp_1) do
FactoryBot.create :work_package,
project: project,
status: status1,
subject: 'B',
due_date: (Date.today - 1.days),
priority: priority1
end
let!(:wp_2) do
FactoryBot.create :work_package,
project: project,
status: status2,
subject: 'A',
due_date: Date.today,
priority: priority_no_color
end
let(:wp_table) { Pages::WorkPackagesTable.new(project) }
let(:highlighting) { ::Components::WorkPackages::Highlighting.new }
let(:sort_by) { ::Components::WorkPackages::SortBy.new }
let(:query_title) { ::Components::WorkPackages::QueryTitle.new }
let!(:query) do
query = FactoryBot.build(:query, user: user, project: project)
query.column_names = %w[id subject status priority due_date]
query.highlighted_attributes = %i[status priority due_date]
query.highlighting_mode = :inline
query.save!
query
end
before do
6 years ago
# Ensure Rails and Capybara caches are cleared
Rails.cache.clear
Capybara.reset!
allow(EnterpriseToken).to receive(:show_banners?).and_return(false)
login_as(user)
wp_table.visit_query query
wp_table.expect_work_package_listed wp_1, wp_2
end
it 'provides highlighting through css classes' do
# Default inline highlight
wp1_row = wp_table.row(wp_1)
wp2_row = wp_table.row(wp_2)
## Status
expect(SelectorHelpers.get_pseudo_class_property(page,
wp1_row.find('[class^="__hl_inline_status_"]'),
':before',
"background-color")).to eq('rgb(255, 0, 0)')
expect(SelectorHelpers.get_pseudo_class_property(page,
wp2_row.find('[class^="__hl_inline_status_"]'),
':before',
"background-color")).to eq('rgb(240, 240, 240)')
## Priority
expect(SelectorHelpers.get_pseudo_class_property(page,
wp1_row.find('[class^="__hl_inline_priority_"]'),
':before',
"background-color")).to eq('rgb(18, 52, 86)')
expect(SelectorHelpers.get_pseudo_class_property(page,
wp2_row.find('[class^="__hl_inline_priority_"]'),
':before',
"background-color")).to eq('rgba(0, 0, 0, 0)')
## Overdue
expect(wp1_row).to have_selector('.__hl_date_overdue')
expect(wp2_row).to have_selector('.__hl_date_due_today')
# Highlight only one attribute
highlighting.switch_inline_attribute_highlight "Priority"
wp1_row = wp_table.row(wp_1)
wp2_row = wp_table.row(wp_2)
## Priority should have a dot
expect(SelectorHelpers.get_pseudo_class_property(page,
wp1_row.find('[class^="__hl_inline_priority_"]'),
':before',
"background-color")).to eq('rgb(18, 52, 86)')
expect(SelectorHelpers.get_pseudo_class_property(page,
wp2_row.find('[class^="__hl_inline_priority_"]'),
':before',
"background-color")).to eq('rgba(0, 0, 0, 0)')
## Status should not have a dot
expect(wp1_row).not_to have_selector('.status [class^="__hl_inline_"]')
# Highlight multiple attributes
highlighting.switch_inline_attribute_highlight "Priority", "Status"
wp1_row = wp_table.row(wp_1)
expect(SelectorHelpers.get_pseudo_class_property(page,
wp1_row.find('[class^="__hl_inline_priority_"]'),
':before',
"background-color")).to eq('rgb(18, 52, 86)')
expect(SelectorHelpers.get_pseudo_class_property(page,
wp1_row.find('[class^="__hl_inline_status_"]'),
':before',
"background-color")).to eq('rgb(255, 0, 0)')
# Highlight entire row by status
6 years ago
highlighting.switch_entire_row_highlight 'Status'
expect(page).to have_selector("#{wp_table.row_selector(wp_1)}.__hl_background_status_#{status1.id}")
expect(page).to have_selector("#{wp_table.row_selector(wp_2)}.__hl_background_status_#{status2.id}")
# Unselect all rows to ensure we get the correct background
find('body').send_keys [:control, 'd']
wp1_row = wp_table.row(wp_1)
wp2_row = wp_table.row(wp_2)
expect(wp1_row.native.css_value('background-color')).to eq('rgba(255, 0, 0, 1)')
expect(wp2_row.native.css_value('background-color')).to eq('rgba(240, 240, 240, 1)')
# Save query
wp_table.save
wp_table.expect_and_dismiss_notification message: 'Successful update.'
query.reload
expect(query.highlighting_mode).to eq(:status)
## This disables any inline styles
expect(page).to have_no_selector('[class*="__hl_inline_status"]')
expect(page).to have_no_selector('[class*="__hl_inline_priority"]')
expect(page).to have_no_selector('[class*="__hl_date"]')
# Highlight entire row by priority
6 years ago
highlighting.switch_entire_row_highlight 'Priority'
expect(page).to have_selector("#{wp_table.row_selector(wp_1)}.__hl_background_priority_#{priority1.id}")
expect(page).to have_selector("#{wp_table.row_selector(wp_2)}.__hl_background_priority_#{priority_no_color.id}")
# Remove selection from table row
find('body').send_keys [:control, 'd']
6 years ago
wp1_row = wp_table.row(wp_1)
wp2_row = wp_table.row(wp_2)
expect(wp1_row.native.css_value('background-color')).to eq('rgba(18, 52, 86, 1)')
expect(wp2_row.native.css_value('background-color')).to eq('rgba(0, 0, 0, 0)')
# Highlighting is kept even after a hard reload (Regression #30217)
page.driver.refresh
expect(page).to have_selector("#{wp_table.row_selector(wp_1)}.__hl_background_priority_#{priority1.id}")
expect(page).to have_selector("#{wp_table.row_selector(wp_2)}.__hl_background_priority_#{priority_no_color.id}")
expect(page).to have_no_selector('[class*="__hl_inline_status"]')
expect(page).to have_no_selector('[class*="__hl_inline_priority"]')
expect(page).to have_no_selector('[class*="__hl_date"]')
# Save query
wp_table.save
wp_table.expect_and_dismiss_notification message: 'Successful update.'
query.reload
expect(query.highlighting_mode).to eq(:priority)
## This disables any inline styles
expect(page).to have_no_selector('[class*="__hl_inline_status"]')
expect(page).to have_no_selector('[class*="__hl_inline_priority"]')
expect(page).to have_no_selector('[class*="__hl_date"]')
# No highlighting
6 years ago
highlighting.switch_highlighting_mode 'No highlighting'
expect(page).to have_no_selector('[class*="__hl_background"]')
expect(page).to have_no_selector('[class*="__hl_background_status"]')
expect(page).to have_no_selector('[class*="__hl_background_priority"]')
expect(page).to have_no_selector('[class*="__hl_date"]')
# Save query
wp_table.save
wp_table.expect_and_dismiss_notification message: 'Successful update.'
query.reload
expect(query.highlighting_mode).to eq(:none)
# Expect highlighted fields in single view even when table disabled
wp_table.open_full_screen_by_doubleclick wp_1
expect(page).to have_selector(".wp-status-button .__hl_background_status_#{status1.id}")
expect(page).to have_selector(".__hl_inline_priority_#{priority1.id}")
end
it 'correctly parses custom selected inline attributes' do
# Highlight only one attribute
highlighting.switch_inline_attribute_highlight "Priority"
# Regression test, resort table
sort_by.sort_via_header 'Subject'
wp_table.expect_work_package_order wp_2, wp_1
# Regression test, resort table
sort_by.sort_via_header 'Subject', descending: true
wp_table.expect_work_package_order wp_1, wp_2
end
it 'does not set query_props when switching in view (Regression #32118)' do
prio_wp1 = wp_table.edit_field(wp_1, :priority)
prio_wp1.update priority_no_color.name
prio_wp1.expect_state_text priority_no_color.name
wp_table.expect_and_dismiss_notification message: 'Successful update.'
wp_1.reload
expect(wp_1.priority).to eq priority_no_color
# We need to wait a bit for the query_props to load
# I don't have a better idea than waiting explicitly here
sleep 5
query_title.expect_not_changed
url = URI.parse(page.current_url).query
expect(url).to include("query_id=#{query.id}")
expect(url).not_to match(/query_props=.+/)
end
end