Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#58426] add feature spec for custom fields of type hierarchy #16988

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ See COPYRIGHT and LICENSE files for more details.
++#%>

<%=
render(Primer::Alpha::Dialog.new(id: DIALOG_ID, title: "Delete item")) do |dialog|
render(Primer::Alpha::Dialog.new(id: DIALOG_ID,
title: "Delete item",
data: { test_selector: TEST_SELECTOR })) do |dialog|
Kharonus marked this conversation as resolved.
Show resolved Hide resolved
dialog.with_header(variant: :large)
dialog.with_body do
"Are you sure you want to delete this item from the current hierarchy level?"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class DeleteItemDialogComponent < ApplicationComponent
include OpTurbo::Streamable

DIALOG_ID = "op-hierarchy-item--deletion-confirmation"
TEST_SELECTOR = "op-custom-fields--delete-item-dialog"

def initialize(custom_field:, hierarchy_item:)
super
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ See COPYRIGHT and LICENSE files for more details.
++#%>

<%=
component_wrapper do
component_wrapper(data: { test_selector: "op-custom-fields--hierarchy-item" }) do
flex_layout(align_items: :center, justify_content: :space_between) do |item_container|
item_container.with_column(flex_layout: true) do |item_information|
item_information.with_column(mr: 2) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@ See COPYRIGHT and LICENSE files for more details.
flex_layout do |container|
if items.empty? && !show_new_item_form?
container.with_row(mb: 3) do
render Primer::Beta::Blankslate.new(border: true) do |component|
render Primer::Beta::Blankslate.new(
border: true,
test_selector: "op-custom-fields--hierarchy-items-blankslate"
Kharonus marked this conversation as resolved.
Show resolved Hide resolved
) do |component|
component.with_visual_icon(icon: "list-ordered")
component.with_heading(tag: :h3).with_content(I18n.t("custom_fields.admin.items.blankslate.title"))
component.with_description { I18n.t("custom_fields.admin.items.blankslate.description") }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ See COPYRIGHT and LICENSE files for more details.
primer_form_with(
url: custom_field_items_path(@custom_field),
method: :post,
data: { test_selector: "op-custom-fields--new-item-form" }
Kharonus marked this conversation as resolved.
Show resolved Hide resolved
) do |f|
render(CustomFields::Hierarchy::NewItemForm.new(f, custom_field: @custom_field, label: @label, short: @short))
end
Expand Down
11 changes: 8 additions & 3 deletions app/components/custom_fields/details_component.html.erb
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
<%=
component_wrapper do
flex_layout do |content|
content.with_row(mb: 3) do
render Primer::Alpha::Banner.new(scheme: :default, icon: :info, dismiss_scheme: :hide) do
I18n.t("custom_fields.admin.notice.remember_items_and_projects")
if has_no_items_or_projects?
content.with_row(mb: 3) do
render Primer::Alpha::Banner.new(scheme: :default,
icon: :info,
dismiss_scheme: :hide,
test_selector: "op-custom-fields--new-hierarchy-banner") do
Kharonus marked this conversation as resolved.
Show resolved Hide resolved
I18n.t("custom_fields.admin.notice.remember_items_and_projects")
end
end
end

Expand Down
8 changes: 8 additions & 0 deletions app/components/custom_fields/details_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,13 @@ module CustomFields
class DetailsComponent < ApplicationComponent
include OpPrimer::ComponentHelpers
include OpTurbo::Streamable

alias_method :custom_field, :model

def has_no_items_or_projects?
Kharonus marked this conversation as resolved.
Show resolved Hide resolved
custom_field.field_format_hierarchy? &&
custom_field.hierarchy_root.children.empty? &&
custom_field.projects.empty?
end
end
end
5 changes: 4 additions & 1 deletion app/views/custom_fields/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@ See COPYRIGHT and LICENSE files for more details.
data-admin--custom-fields-format-config-value="<%= OpenProject::CustomFieldFormatDependent.stimulus_config %>"
>
<div class="form--field -required" id="custom_field_name_attributes">
<%= f.text_field :name, required: true, container_class: '-middle' %>
<%= f.text_field :name,
required: true,
container_class: "-middle",
"data-test-selector": "op-custom-fields--new-custom-field-name" %>
Kharonus marked this conversation as resolved.
Show resolved Hide resolved
</div>
<% if @custom_field.type == 'ProjectCustomField' %>
<div class="form--field -required">
Expand Down
2 changes: 1 addition & 1 deletion config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -245,10 +245,10 @@ en:
heading: For all projects
description: This custom field is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects.
items:
actions: "Item actions"
blankslate:
title: "Your list of items is empty"
description: "Start by adding items to the custom field of type hierarchy. Each item can be used to create a hierarchy bellow it. To navigate and create sub-items inside a hierarchy click on the created item."
actions: "Item actions"
placeholder:
label: "Item label"
short: "Short name"
Expand Down
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ services:
environment:
PROXY_HOSTNAME: backend-test
CHROME_BIN: chromium
FE_PORT: 4200
FE_HOST: frontend-test
networks:
- testing

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

RSpec.describe "Link custom fields edit", :js, :with_cuprite do
shared_let(:admin) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

before do
login_as(admin)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

RSpec.describe "User custom fields edit", :js, :with_cuprite do
shared_let(:admin) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

before do
login_as(admin)
Expand Down
4 changes: 2 additions & 2 deletions spec/features/custom_fields/activate_in_project_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@
#++

require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "custom fields", :js, :with_cuprite do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }
let(:for_all_cf) { create(:list_wp_custom_field, is_for_all: true) }
let(:project_specific_cf) { create(:integer_wp_custom_field) }
let(:work_package) do
Expand Down
4 changes: 2 additions & 2 deletions spec/features/custom_fields/create_bool_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "custom fields", :js, :with_cuprite do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

before do
login_as user
Expand Down
4 changes: 2 additions & 2 deletions spec/features/custom_fields/create_date_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "custom fields", :js, :with_cuprite do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

before do
login_as user
Expand Down
4 changes: 2 additions & 2 deletions spec/features/custom_fields/create_float_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "custom fields", :js, :with_cuprite do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

before do
login_as user
Expand Down
4 changes: 2 additions & 2 deletions spec/features/custom_fields/create_int_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "custom fields", :js, :with_cuprite do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

before do
login_as user
Expand Down
4 changes: 2 additions & 2 deletions spec/features/custom_fields/create_long_text_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "custom fields", :js do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }
let(:editor) { Components::WysiwygEditor.new "#custom_field_form" }
let(:type) { create(:type_task) }
let!(:project) { create(:project, enabled_module_names: %i[work_package_tracking], types: [type]) }
Expand Down
4 changes: 2 additions & 2 deletions spec/features/custom_fields/custom_fields_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "custom fields", :js, :with_cuprite do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

before do
login_as user
Expand Down
157 changes: 157 additions & 0 deletions spec/features/custom_fields/hierarchy_custom_field_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
# frozen_string_literal: true

#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
#++

require "spec_helper"

RSpec.describe "custom fields of type hierarchy", :js, :with_cuprite do
let(:user) { create(:admin) }
let(:custom_field_index_page) { Pages::CustomFields::IndexPage.new }
let(:new_custom_field_page) { Pages::CustomFields::NewPage.new }
let(:hierarchy_page) { Pages::CustomFields::HierarchyPage.new }

it "lets you create, update and delete a custom field of type hierarchy",
Kharonus marked this conversation as resolved.
Show resolved Hide resolved
with_flag: { custom_field_of_type_hierarchy: true } do
login_as user

# region CustomField creation

custom_field_index_page.visit!

click_on "New custom field"
new_custom_field_page.expect_current_path

hierarchy_name = "Stormtrooper Organisation"
fill_in "Name", with: hierarchy_name
select "Hierarchy", from: "Format"
click_on "Save"

custom_field_index_page.expect_current_path("tab=WorkPackageCustomField")
expect(page).to have_list_item(hierarchy_name)

# endregion

# region Edit the details of the custom field

CustomField.find_by(name: hierarchy_name).tap do |custom_field|
hierarchy_page.add_custom_field_state(custom_field)
end

click_on hierarchy_name
hierarchy_page.expect_current_path

expect(page).to have_test_selector("op-custom-fields--new-hierarchy-banner")
expect(page).to have_css(".PageHeader-title", text: hierarchy_name)

# Now, that was the wrong name, so I can change it to the correct one
hierarchy_name = "Imperial Organisation"
fill_in "Name", with: "", fill_options: { clear: :backspace }
fill_in "Name", with: hierarchy_name
click_on "Save"
expect(page).to have_css(".PageHeader-title", text: hierarchy_name)

# endregion

# region Adding items to the hierarchy

# Now we want to create our first hierarchy items
hierarchy_page.switch_tab "Items"
hierarchy_page.expect_current_path
expect(page).to have_test_selector("op-custom-fields--hierarchy-items-blankslate")

click_on "Item"
expect(page).not_to have_test_selector("op-custom-fields--hierarchy-items-blankslate")
fill_in "Label", with: "Stormtroopers"
fill_in "Short", with: "ST"
click_on "Save"
expect(page).not_to have_test_selector("op-custom-fields--hierarchy-items-blankslate")
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", count: 1)
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", text: "Stormtroopers")
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", text: "(ST)")

# And the inline form should still be there
expect(page).to have_test_selector("op-custom-fields--new-item-form")

# Can I add the same item again?
fill_in "Label", with: "Stormtroopers"
click_on "Save"
within_test_selector("op-custom-fields--new-item-form") do
expect(page).to have_css(".FormControl-inlineValidation", text: "Label must be unique within the same hierarchy level")
end

# Is the form cancelable?
fill_in "Label", with: "Dark Troopers"
click_on "Cancel"
expect(page).not_to have_test_selector("op-custom-fields--new-item-form")
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", count: 1)
expect(page).not_to have_test_selector("op-custom-fields--hierarchy-item", text: "Dark Troopers")

# endregion

# region Deleting items from the hierarchy

# What happens if I added a wrong item?
click_on "Item"
fill_in "Label", with: "Phoenix Squad"
click_on "Save"
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", count: 2)
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", text: "Phoenix Squad")
hierarchy_page.open_action_menu_for("Phoenix Squad")
click_on "Delete"
expect(page).to have_test_selector("op-custom-fields--delete-item-dialog")
click_on "Delete"
expect(page).not_to have_test_selector("op-custom-fields--delete-item-dialog")
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", count: 1)
expect(page).not_to have_test_selector("op-custom-fields--hierarchy-item", text: "Phoenix Squad")

# Can I cancel the deletion?
hierarchy_page.open_action_menu_for("Stormtroopers")
click_on "Delete"
expect(page).to have_test_selector("op-custom-fields--delete-item-dialog")
click_on "Cancel"
expect(page).not_to have_test_selector("op-custom-fields--delete-item-dialog")
expect(page).to have_test_selector("op-custom-fields--hierarchy-item", text: "Stormtroopers")

# endregion

# region Status check and cleanup

# And is the blue banner gone, now that I have added some items?
hierarchy_page.switch_tab "Details"
expect(page).not_to have_test_selector("op-custom-fields--new-hierarchy-banner")

# Finally, we delete the custom field ... I'm done with this ...
custom_field_index_page.visit!
expect(page).to have_list_item(hierarchy_name)
within("tr", text: hierarchy_name) { accept_prompt { click_on "Delete" } }
expect(page).to have_no_text(hierarchy_name)

# endregion
end
end
4 changes: 2 additions & 2 deletions spec/features/custom_fields/reorder_options_spec.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

def get_possible_values(amount)
(1..amount).to_a.map { |x| "PREFIX #{x}" }
Expand All @@ -15,7 +15,7 @@ def get_possible_values_reordered(amount)

RSpec.describe "Reordering custom options of a list custom field", :js do
let(:user) { create(:admin) }
let(:cf_page) { Pages::CustomFields.new }
let(:cf_page) { Pages::CustomFields::IndexPage.new }

let!(:custom_field) do
create(
Expand Down
2 changes: 1 addition & 1 deletion spec/features/types/activate_in_project_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
#++

require "spec_helper"
require "support/pages/custom_fields"
require "support/pages/custom_fields/index_page"

RSpec.describe "types", :js, :with_cuprite do
let(:user) do
Expand Down
Loading