Skip to content

Commit

Permalink
Merge pull request #16988 from opf/implementation/58426-add-feature-s…
Browse files Browse the repository at this point in the history
…pec-covering-the-hierarchy-lifecycle-in-the-admin-view

[#58426] add feature spec for custom fields of type hierarchy
  • Loading branch information
Kharonus authored Oct 25, 2024
2 parents 1657091 + 485ea7f commit a618078
Show file tree
Hide file tree
Showing 25 changed files with 351 additions and 55 deletions.
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|
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"
) 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" }
) 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
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?
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" %>
</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",
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

0 comments on commit a618078

Please sign in to comment.