From 28f0ffafef076a02001920ee5bd20d23a40d2fe4 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Mon, 16 Dec 2024 09:06:36 +0100 Subject: [PATCH 1/9] Extract JWT parsing into separate class JWT parsing is rather involved, because we need to fetch proper certificates first. We will need to parse JWTs in a different context than authorization as well, so it makes sense to have the parsing centralized. This also allowed to add specs for this previously not (unit) tested piece of code. --- .../strategies/warden/jwt_oidc.rb | 68 ++------ .../app/services/openid_connect/jwt_parser.rb | 97 ++++++++++++ .../openid_connect/jwt_parser_spec.rb | 149 ++++++++++++++++++ spec/requests/api/v3/authentication_spec.rb | 103 +++++++----- 4 files changed, 324 insertions(+), 93 deletions(-) create mode 100644 modules/openid_connect/app/services/openid_connect/jwt_parser.rb create mode 100644 modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb diff --git a/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb b/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb index 94d3edb0d56e..7c392f5957c9 100644 --- a/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb +++ b/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb @@ -5,12 +5,6 @@ module Warden class JwtOidc < ::Warden::Strategies::Base include FailWithHeader - SUPPORTED_ALG = %w[ - RS256 - RS384 - RS512 - ].freeze - # The strategy is supposed to only handle JWT. # These tokens are supposed to be issued by configured OIDC. def valid? @@ -19,60 +13,28 @@ def valid? ) return false if @access_token.blank? - @unverified_payload, @unverified_header = JWT.decode(@access_token, nil, false) - @unverified_header.present? && @unverified_payload.present? + unverified_payload, unverified_header = JWT.decode(@access_token, nil, false) + unverified_payload.present? && unverified_header.present? rescue JWT::DecodeError false end def authenticate! - issuer = @unverified_payload["iss"] - provider = OpenProject::OpenIDConnect.providers.find { |p| p.configuration[:issuer] == issuer } if issuer.present? - if provider.blank? - return fail_with_header!(error: "invalid_token", error_description: "The access token issuer is unknown") - end - - client_id = provider.configuration.fetch(:identifier) - alg = @unverified_header.fetch("alg") - if SUPPORTED_ALG.exclude?(alg) - return fail_with_header!(error: "invalid_token", error_description: "Token signature algorithm is not supported") - end - - kid = @unverified_header.fetch("kid") - jwks_uri = provider.configuration[:jwks_uri] - begin - key = JSON::JWK::Set::Fetcher.fetch(jwks_uri, kid:).to_key - rescue JSON::JWK::Set::KidNotFound - return fail_with_header!(error: "invalid_token", error_description: "The access token signature kid is unknown") - end - - begin - verified_payload, = JWT.decode( - @access_token, - key, - true, - { - algorithm: alg, - verify_iss: true, - verify_aud: true, - iss: issuer, - aud: client_id, - required_claims: ["sub", "iss", "aud"] - } - ) - rescue JWT::ExpiredSignature - return fail_with_header!(error: "invalid_token", error_description: "The access token expired") - rescue JWT::ImmatureSignature - # happens when nbf time is less than current - return fail_with_header!(error: "invalid_token", error_description: "The access token is used too early") - rescue JWT::InvalidIssuerError - return fail_with_header!(error: "invalid_token", error_description: "The access token issuer is wrong") - rescue JWT::InvalidAudError - return fail_with_header!(error: "invalid_token", error_description: "The access token audience claim is wrong") - end + verified_payload, provider = ::OpenIDConnect::JwtParser.new(required_claims: ["sub"]).parse(@access_token) - user = User.find_by(identity_url: "#{provider.name}:#{verified_payload['sub']}") + user = User.find_by(identity_url: "#{provider.slug}:#{verified_payload['sub']}") success!(user) if user + rescue JWT::ExpiredSignature + fail_with_header!(error: "invalid_token", error_description: "The access token expired") + rescue JWT::ImmatureSignature + # happens when nbf time is less than current + fail_with_header!(error: "invalid_token", error_description: "The access token is used too early") + rescue JWT::InvalidAudError + fail_with_header!(error: "invalid_token", error_description: "The access token audience claim is wrong") + rescue JSON::JWK::Set::KidNotFound + fail_with_header!(error: "invalid_token", error_description: "The access token signature kid is unknown") + rescue ::OpenIDConnect::JwtParser::Error => e + fail_with_header!(error: "invalid_token", error_description: e.message) end end end diff --git a/modules/openid_connect/app/services/openid_connect/jwt_parser.rb b/modules/openid_connect/app/services/openid_connect/jwt_parser.rb new file mode 100644 index 000000000000..f371e6e5f7de --- /dev/null +++ b/modules/openid_connect/app/services/openid_connect/jwt_parser.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is a project management system. +# 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-2017 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. +# + + +module OpenIDConnect + class JwtParser + class Error < StandardError; end + + SUPPORTED_JWT_ALGORITHMS = %w[ + RS256 + RS384 + RS512 + ].freeze + + def initialize(verify_audience: true, required_claims: []) + @verify_audience = verify_audience + @required_claims = required_claims + end + + def parse(token) + issuer, alg, kid = parse_unverified_iss_alg_kid(token) + raise Error, "Token signature algorithm #{alg} is not supported" if SUPPORTED_JWT_ALGORITHMS.exclude?(alg) + + provider = fetch_provider(issuer) + raise Error, "The access token issuer is unknown" if provider.blank? + + jwks_uri = provider.jwks_uri + key = JSON::JWK::Set::Fetcher.fetch(jwks_uri, kid:).to_key + + verified_payload, = JWT.decode( + token, + key, + true, + { + algorithm: alg, + verify_aud: @verify_audience, + aud: provider.client_id, + required_claims: all_required_claims + } + ) + + [verified_payload, provider] + end + + private + + def parse_unverified_iss_alg_kid(token) + unverified_payload, unverified_header = JWT.decode(token, nil, false) + raise Error, "The token's Key Identifier (kid) is missing" unless unverified_header.key?("kid") + + [ + unverified_payload["iss"], + unverified_header.fetch("alg"), + unverified_header.fetch("kid") + ] + end + + def fetch_provider(issuer) + return nil if issuer.blank? + + OpenIDConnect::Provider.where(available: true).where("options->>'issuer' = ?", issuer).first + end + + def all_required_claims + claims = ["iss"] + @required_claims + claims << "aud" if @verify_audience + + claims.uniq + end + end +end diff --git a/modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb b/modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb new file mode 100644 index 000000000000..d22156b0e0a6 --- /dev/null +++ b/modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb @@ -0,0 +1,149 @@ +# 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 OpenIDConnect::JwtParser do + subject(:parse) { described_class.new.parse(token) } + + let(:private_key) { OpenSSL::PKey::RSA.generate(2048) } + let(:payload) { { "sub" => "M. Curie", "iss" => "International Space Station", "aud" => our_client_id } } + let(:token) { JWT.encode(payload, private_key, "RS256", { kid: "key-identifier" }) } + + let!(:provider) { create(:oidc_provider) } + let(:known_issuer) { "International Space Station" } + let(:our_client_id) { "openproject.org" } + + before do + allow(JSON::JWK::Set::Fetcher).to receive(:fetch).and_return( + instance_double(JSON::JWK, to_key: private_key.public_key) + ) + + provider.options["issuer"] = known_issuer + provider.options["client_id"] = our_client_id + provider.options["jwks_uri"] = "https://example.com/certs" + provider.save! + end + + it "parses the token" do + parsed, = parse + expect(parsed).to eq payload + end + + it "returns the provider configuration for the associated provider" do + _, p = parse + expect(p).to eq provider + end + + it "correctly queries for the token's public key" do + parse + + expect(JSON::JWK::Set::Fetcher).to have_received(:fetch).with("https://example.com/certs", kid: "key-identifier") + end + + context "when the provider signing the token is not known" do + let(:known_issuer) { "Lunar Gateway" } + + it "raises an error" do + expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /issuer is unknown/) + end + end + + context "when the provider signing the token is not available" do + before do + provider.update!(available: false) + end + + it "raises an error" do + expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /issuer is unknown/) + end + end + + context "when the token is not a valid JWT" do + let(:token) { Base64.encode64("banana").strip } + + it "raises an error" do + expect { parse }.to raise_error(JWT::DecodeError) + end + end + + context "when the token is signed using an unsupported signature" do + let(:token) { JWT.encode(payload, "secret", "HS256", { kid: "key-identifier" }) } + + it "raises an error" do + expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /HS256 is not supported/) + end + end + + context "when we are not the token's audience" do + before do + payload["aud"] = "Alice" + end + + it "raises an error" do + expect { parse }.to raise_error(JWT::InvalidAudError) + end + + context "and the audience shall not be verified" do + subject(:parse) { described_class.new(verify_audience: false).parse(token) } + + it "parses the token" do + parsed, = parse + expect(parsed).to eq payload + end + end + end + + context "when the token does not indicate a Key Identifier" do + let(:token) { JWT.encode(payload, private_key, "RS256") } + + it "raises an error" do + expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /Key Identifier .+ is missing/) + end + end + + context "when requiring a specific claim" do + subject(:parse) { described_class.new(required_claims: ["sub"]).parse(token) } + + it "parses the token" do + parsed, = parse + expect(parsed).to eq payload + end + + context "and when the required claim is missing" do + before do + payload.delete("sub") + end + + it "raises an error" do + expect { parse }.to raise_error(JWT::MissingRequiredClaim) + end + end + end +end diff --git a/spec/requests/api/v3/authentication_spec.rb b/spec/requests/api/v3/authentication_spec.rb index 1c95c9e62165..4bc41dadf225 100644 --- a/spec/requests/api/v3/authentication_spec.rb +++ b/spec/requests/api/v3/authentication_spec.rb @@ -367,14 +367,54 @@ def set_basic_auth_header(user, password) end describe("OIDC", :webmock) do - let(:rsa_signed_access_token_without_aud) do - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5N0FteXZvUzhCRkZSZm01ODVHUGdBMTZHMUgyVjIyRWR4eHVBWVV1b0trIn0.eyJleHAiOjE3MjEyODM0MzAsImlhdCI6MTcyMTI4MzM3MCwianRpIjoiYzUyNmI0MzUtOTkxZi00NzRhLWFkMWItYzM3MTQ1NmQxZmQwIiwiaXNzIjoiaHR0cHM6Ly9rZXljbG9hay5sb2NhbC9yZWFsbXMvbWFzdGVyIiwiYXVkIjpbIm1hc3Rlci1yZWFsbSIsImFjY291bnQiXSwic3ViIjoiYjcwZTJmYmYtZWE2OC00MjBjLWE3YTUtMGEyODdjYjY4OWM2IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiaHR0cHM6Ly9vcGVucHJvamVjdC5sb2NhbCIsInNlc3Npb25fc3RhdGUiOiJlYjIzNTI0MC0wYjQ3LTQ4ZmEtOGIzZS1mM2IzMTBkMzUyZTMiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbImh0dHBzOi8vb3BlbnByb2plY3QubG9jYWwiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImNyZWF0ZS1yZWFsbSIsImRlZmF1bHQtcm9sZXMtbWFzdGVyIiwib2ZmbGluZV9hY2Nlc3MiLCJhZG1pbiIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsibWFzdGVyLXJlYWxtIjp7InJvbGVzIjpbInZpZXctcmVhbG0iLCJ2aWV3LWlkZW50aXR5LXByb3ZpZGVycyIsIm1hbmFnZS1pZGVudGl0eS1wcm92aWRlcnMiLCJpbXBlcnNvbmF0aW9uIiwiY3JlYXRlLWNsaWVudCIsIm1hbmFnZS11c2VycyIsInF1ZXJ5LXJlYWxtcyIsInZpZXctYXV0aG9yaXphdGlvbiIsInF1ZXJ5LWNsaWVudHMiLCJxdWVyeS11c2VycyIsIm1hbmFnZS1ldmVudHMiLCJtYW5hZ2UtcmVhbG0iLCJ2aWV3LWV2ZW50cyIsInZpZXctdXNlcnMiLCJ2aWV3LWNsaWVudHMiLCJtYW5hZ2UtYXV0aG9yaXphdGlvbiIsIm1hbmFnZS1jbGllbnRzIiwicXVlcnktZ3JvdXBzIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJlYjIzNTI0MC0wYjQ3LTQ4ZmEtOGIzZS1mM2IzMTBkMzUyZTMiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIn0.cLgbN9kygRwthUx0R0FazPfIUeEUVnw4HnDgN-Hsnm9oXVr6MqmfTRKEI-6n62dlnVKsdadF_tWf3jp26d6neLj1zlR-vojwaHm8A08S9m6IeMr9e0CGiYVHjrJtEeTgq6P9cJJfe7uuhSSvlG3ltFPDxaAe14Dz3BjhLO3iaCRkWfAZjKmnW-IMzzzHfGH-7of7qCAlF5ObEax38mf1Q0OmsPA4_5po-FFtw7H7FfDjsr6EXgtdwloDePkk2XIHs2XsIo0YugVHC9GqCWgBA8MBvCirFivqM53paZMnjhpQH-xgTpYGWlw3WNbG2Rny2GoEwIxdYOUO2amDQ_zkrQ" + let(:jwk) { JWT::JWK.new(OpenSSL::PKey::RSA.new(2048), kid: "my-kid", use: "sig", alg: "RS256") } + let(:payload) do + { + "exp" => token_exp.to_i, + "iat" => 1721283370, + "jti" => "c526b435-991f-474a-ad1b-c371456d1fd0", + "iss" => token_issuer, + "aud" => token_aud, + "sub" => token_sub, + "typ" => "Bearer", + "azp" => "https://openproject.local", + "session_state" => "eb235240-0b47-48fa-8b3e-f3b310d352e3", + "acr" => "1", + "allowed-origins" => ["https://openproject.local"], + "realm_access" => { "roles" => ["create-realm", "default-roles-master", "offline_access", "admin", "uma_authorization"] }, + "resource_access" => + { "master-realm" => + { "roles" => + ["view-realm", + "view-identity-providers", + "manage-identity-providers", + "impersonation", + "create-client", + "manage-users", + "query-realms", + "view-authorization", + "query-clients", + "query-users", + "manage-events", + "manage-realm", + "view-events", + "view-users", + "view-clients", + "manage-authorization", + "manage-clients", + "query-groups"] }, + "account" => { "roles" => ["manage-account", "manage-account-links", "view-profile"] } }, + "scope" => "email profile", + "sid" => "eb235240-0b47-48fa-8b3e-f3b310d352e3", + "email_verified" => false, + "preferred_username" => "admin" + } end - let(:rsa_signed_access_token_with_aud) do - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5N0FteXZvUzhCRkZSZm01ODVHUGdBMTZHMUgyVjIyRWR4eHVBWVV1b0trIn0.eyJleHAiOjE3MjEyODQ3NjksImlhdCI6MTcyMTI4NDcwOSwianRpIjoiNjhiYzNmZTMtNDFhZi00MGUwLTg4NGEtNDgxNTM1MTU3NjIyIiwiaXNzIjoiaHR0cHM6Ly9rZXljbG9hay5sb2NhbC9yZWFsbXMvbWFzdGVyIiwiYXVkIjpbImh0dHBzOi8vb3BlbnByb2plY3QubG9jYWwiLCJtYXN0ZXItcmVhbG0iLCJhY2NvdW50Il0sInN1YiI6ImI3MGUyZmJmLWVhNjgtNDIwYy1hN2E1LTBhMjg3Y2I2ODljNiIsInR5cCI6IkJlYXJlciIsImF6cCI6Imh0dHBzOi8vb3BlbnByb2plY3QubG9jYWwiLCJzZXNzaW9uX3N0YXRlIjoiNWI5OWM3M2EtY2QwNS00N2MwLTgwZTctODRjYTNiYTI0MDQ1IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL29wZW5wcm9qZWN0LmxvY2FsIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJjcmVhdGUtcmVhbG0iLCJkZWZhdWx0LXJvbGVzLW1hc3RlciIsIm9mZmxpbmVfYWNjZXNzIiwiYWRtaW4iLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7Im1hc3Rlci1yZWFsbSI6eyJyb2xlcyI6WyJ2aWV3LXJlYWxtIiwidmlldy1pZGVudGl0eS1wcm92aWRlcnMiLCJtYW5hZ2UtaWRlbnRpdHktcHJvdmlkZXJzIiwiaW1wZXJzb25hdGlvbiIsImNyZWF0ZS1jbGllbnQiLCJtYW5hZ2UtdXNlcnMiLCJxdWVyeS1yZWFsbXMiLCJ2aWV3LWF1dGhvcml6YXRpb24iLCJxdWVyeS1jbGllbnRzIiwicXVlcnktdXNlcnMiLCJtYW5hZ2UtZXZlbnRzIiwibWFuYWdlLXJlYWxtIiwidmlldy1ldmVudHMiLCJ2aWV3LXVzZXJzIiwidmlldy1jbGllbnRzIiwibWFuYWdlLWF1dGhvcml6YXRpb24iLCJtYW5hZ2UtY2xpZW50cyIsInF1ZXJ5LWdyb3VwcyJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJlbWFpbCBwcm9maWxlIiwic2lkIjoiNWI5OWM3M2EtY2QwNS00N2MwLTgwZTctODRjYTNiYTI0MDQ1IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiJ9.WS2TWDHFU2Amglj6j4LYhsUY5oyw3J7PhllGf0MH3Kz_ETT7GZCR6MvtvY1EuOb11t_YKrQ6M8LBHhh5j9mrFNrg-vTXMaYmXwXCQxfKtHvTVbo4coEPpnW_8NEVBG8dvduLRVK_o7BbNhZH9FCe5sb_7EbA18E7evHNLWi9co4nLsSBQSeBoHRSJqD28Yr2Xj1u618bVz_grAlm0DiwhJhGzkv-JJtUGa1xQyIkNeogPWalnLpzspa2Q2i5LeLB02aoPDlQ_PkUF6Tn6IGY2for8HQQlYkjBvhxL_wMBDoNRKlFycqkCBSedsPx2m6NdmBK8ppLgaMfKe0uVGvaTg" - end - let(:token_exp) { Time.zone.at(JWT.decode(token, nil, false)[0]["exp"]) } - let(:token_sub) { JWT.decode(token, nil, false)[0]["sub"] } + let(:token) { JWT.encode(payload, jwk.signing_key, jwk[:alg], { kid: jwk[:kid] }) } + let(:token_exp) { 5.minutes.from_now } + let(:token_sub) { "b70e2fbf-ea68-420c-a7a5-0a287cb689c6" } + let(:token_aud) { ["https://openproject.local", "master-realm", "account"] } + let(:token_issuer) { "https://keycloak.local/realms/master" } let(:expected_message) { "You did not provide the correct credentials." } let(:keys_request_stub) { nil } @@ -387,9 +427,7 @@ def set_basic_auth_header(user, password) end context "when token is issued by provider not configured in OP" do - let(:token) do - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJpc3N1ZXIuY29tIn0.C9gEPaqdNSEZ4dZHz0z51VCylScIEqRLnwMCkNXuz6g" - end + let(:token_issuer) { "https://eve.example.com" } it do get resource @@ -402,15 +440,12 @@ def set_basic_auth_header(user, password) context "when token is issued by provider configured in OP" do context "when token signature algorithm is not supported" do - let(:token) do - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5" \ - "MDIyLCJpc3MiOiJodHRwczovL2tleWNsb2FrLmxvY2FsL3JlYWxtcy9tYXN0ZXIifQ.Pwod8ZJqq3jWsbnrGw4ZU1-aLS2bSicb8PgiF78JHUc" - end + let(:token) { JWT.encode(payload, "secret", "HS256", { kid: "97AmyvoS8BFFRfm585GPgA16G1H2V22EdxxuAYUuoKk" }) } it do get resource expect(last_response).to have_http_status :unauthorized - error = "Token signature algorithm is not supported" + error = "Token signature algorithm HS256 is not supported" expect(last_response.header["WWW-Authenticate"]) .to eq(%{Bearer realm="OpenProject API", error="invalid_token", error_description="#{error}"}) expect(JSON.parse(last_response.body)).to eq(error_response_body) @@ -427,17 +462,16 @@ def set_basic_auth_header(user, password) "User-Agent" => "JSON::JWK::Set::Fetcher 2.9.1" } ) - .to_return(status: 200, body: '{"keys":[{"kid":"CANAG6lJUPKqKDoWxxXL5wAHf2U18BAzm_LJm7RPTGk","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"nqJexS6n-SxKSDUxXp_dsNwDW6cZ4Rtgqq9ut_lp1CNSph5wTnLG3aQQsTEvx5o3-SZ-pHjJ0gtEpg7clAz-w-YQyZoAXkFtQqmZJxsmdS4K0yILxO3WUNdJQlutjmq-Ri50Senn5IV7yEYWLo8St1qzUqWZhp0HKudyty24triC9UJTK03W3_Tr5c1X8vKL8duAjvLB7p_sYUOrnLq5pD5lqwxVSAiN8qS5zVNZMrhGV5aN1vN_vue_tw8c2SVOCLLTrUh3441rYaeo-UwQZF7ZTm30xflqAIfe8qMoB20wtWYAXR0D5iqkkdEH4XanCYVm5vdUFIPPvXZhRDWoNQ","e":"AQAB","x5c":["MIICmzCCAYMCBgGQupeGPzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjQwNzE2MDgwODMwWhcNMzQwNzE2MDgxMDEwWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCeol7FLqf5LEpINTFen92w3ANbpxnhG2Cqr263+WnUI1KmHnBOcsbdpBCxMS/Hmjf5Jn6keMnSC0SmDtyUDP7D5hDJmgBeQW1CqZknGyZ1LgrTIgvE7dZQ10lCW62Oar5GLnRJ6efkhXvIRhYujxK3WrNSpZmGnQcq53K3Lbi2uIL1QlMrTdbf9OvlzVfy8ovx24CO8sHun+xhQ6ucurmkPmWrDFVICI3ypLnNU1kyuEZXlo3W83++57+3DxzZJU4IstOtSHfjjWthp6j5TBBkXtlObfTF+WoAh97yoygHbTC1ZgBdHQPmKqSR0QfhdqcJhWbm91QUg8+9dmFENag1AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAB/AGvP0gviPoJszj/oQgBsMpPGRHLpnTmrXnTaa7Xk2sgExAb4zUAwxGjtR347t697cpiKQYBkR2ndswnt93Sx/Ot+yn5BdYcNvZuEh5jb5bkH2V4h6/LrYljTymby+XPBEf+XLhBOjoI3SKtNJk4pEqVNwLuKKbObqJcE3G3VBVSdzRUcIrjZr7yAQeLnhczS3hJ0Ct6Y7S5Q6DK+/PU1+AvlW+7GfzpRMqVfLcqhNpRwdCVGlJYKaUJfIe1vav10D94xA0U1sKex3iA1S+1HlS2BCWx/0rXwgcquMpUZlOAKiT0K6SIFxBFFnM9eQbF97Dz7Bzw+jyqStGUcH9YA="],"x5t":"TuBfrOL00KXDrOWTv3jw7Uxx3hA","x5t#S256":"7su5lOXF5qcMuvp44ynsoyk3B0l9Sr_bOVlg768shpY"},{"kid":"97AmyvoS8BFFRfm585GPgA16G1H2V22EdxxuAYUuoKk","kty":"RSA","alg":"RS256","use":"sig","n":"jMB2r7BG4QJzLnA2_fgG1mxlh2RX_MSx0lc2lrPIVFGYBuAu8irwRLSexX5aQdD_AtnxLD4g9jiG6VEDwmWopEe0fr-QMl0IiES5tJuQMrjhajOkzr8xTYu6zl-knL0tu99iRbmKNYzEcv0TAgY_95n4gD5tPhYvY4gXuHrFKqYkJQPsSgoThlH7hAtfzsDt6yp3P2lQUESGg3pzc_J_NKnQkkggcNB06Hlz4DmcHxhWXK51P1V9cE7qh4PrhsJ-SOH5grcN9PtOZi6f2VlWdFdyisT-YehNklfVqBtdCLm7Ocghhl0HSgLuV-9dHCdwBLUpABsdsd0L3LRCUgRfjQ","e":"AQAB","x5c":["MIICmzCCAYMCBgGQupeFFTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjQwNzE2MDgwODMwWhcNMzQwNzE2MDgxMDEwWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCMwHavsEbhAnMucDb9+AbWbGWHZFf8xLHSVzaWs8hUUZgG4C7yKvBEtJ7FflpB0P8C2fEsPiD2OIbpUQPCZaikR7R+v5AyXQiIRLm0m5AyuOFqM6TOvzFNi7rOX6ScvS2732JFuYo1jMRy/RMCBj/3mfiAPm0+Fi9jiBe4esUqpiQlA+xKChOGUfuEC1/OwO3rKnc/aVBQRIaDenNz8n80qdCSSCBw0HToeXPgOZwfGFZcrnU/VX1wTuqHg+uGwn5I4fmCtw30+05mLp/ZWVZ0V3KKxP5h6E2SV9WoG10Iubs5yCGGXQdKAu5X710cJ3AEtSkAGx2x3QvctEJSBF+NAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIoBCsOO0bXiVspoXkqdOts4+3sULbbp5aEwQscmLX017Zvv5jxdkZxUYk8L08lNB+WlC1ES4VlmtE06D0cWYErGpArJzVBKgYSA3CkA9veBEugHviMqfwg3suNc8S+GtaRBvpbVZtXydjjqA8GZ4eKhPoJLHHCX6X2Ad33Cdt0/ftucjTqAKVzzzgWZejy+ZKP6ybAqYJ+EZoPUXlyWT3uwcpGEJ3nzOYYGTfxOSmAwnH2v5Z/JWr9ex5o/+QBuBhFcg0z8NcHa3Z0E6ZC9GGxV7XztBqYicO+nONHTLCctoJmyXvLM4j8qIG2UQgPIiwIL0Jkz6xQAYyXvsb+LhM8="],"x5t":"BFrni6MoX-CJwtMT4vzij1HBSTI","x5t#S256":"-Ge3y4JRezxhGTDfbkNoz7prkokzYtbKQ9ardPtfcz4"}]}', headers: {}) + .to_return(status: 200, body: JWT::JWK::Set.new(jwk).export.to_json, headers: {}) end context "when access token has not expired yet" do context "when aud does not contain client_id" do - let(:token) { rsa_signed_access_token_without_aud } + let(:token_aud) { ["master-realm", "account"] } it do - Timecop.freeze(token_exp - 20.seconds) do - get resource - end + get resource + expect(last_response).to have_http_status :unauthorized error = "The access token audience claim is wrong" expect(last_response.header["WWW-Authenticate"]) @@ -447,24 +481,19 @@ def set_basic_auth_header(user, password) end context "when aud contains client_id" do - let(:token) { rsa_signed_access_token_with_aud } - it do - Timecop.freeze(token_exp - 20.seconds) do - get resource - end + get resource + expect(last_response).to have_http_status :ok end end end context "when access token has expired already" do - let(:token) { rsa_signed_access_token_without_aud } + let(:token_exp) { 5.minutes.ago } it do - Timecop.freeze(token_exp + 20.seconds) do - get resource - end + get resource expect(last_response).to have_http_status :unauthorized expect(last_response.header["WWW-Authenticate"]) @@ -473,14 +502,10 @@ def set_basic_auth_header(user, password) end it "caches keys request to keycloak" do - Timecop.freeze(token_exp + 20.seconds) do - get resource - end + get resource expect(last_response).to have_http_status :unauthorized - Timecop.freeze(token_exp + 20.seconds) do - get resource - end + get resource expect(last_response).to have_http_status :unauthorized expect(keys_request_stub).to have_been_made.once @@ -490,6 +515,7 @@ def set_basic_auth_header(user, password) context "when kid is absent in keycloak keys response" do let(:keys_request_stub) do + wrong_key = JWT::JWK.new(OpenSSL::PKey::RSA.new(2048), kid: "your-kid", use: "sig", alg: "RS256") stub_request(:get, "https://keycloak.local/realms/master/protocol/openid-connect/certs") .with( headers: { @@ -498,14 +524,11 @@ def set_basic_auth_header(user, password) "User-Agent" => "JSON::JWK::Set::Fetcher 2.9.1" } ) - .to_return(status: 200, body: '{"keys":[{"kid":"CANAG6lJUPKqKDoWxxXL5wAHf2U18BAzm_LJm7RPTGk","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"nqJexS6n-SxKSDUxXp_dsNwDW6cZ4Rtgqq9ut_lp1CNSph5wTnLG3aQQsTEvx5o3-SZ-pHjJ0gtEpg7clAz-w-YQyZoAXkFtQqmZJxsmdS4K0yILxO3WUNdJQlutjmq-Ri50Senn5IV7yEYWLo8St1qzUqWZhp0HKudyty24triC9UJTK03W3_Tr5c1X8vKL8duAjvLB7p_sYUOrnLq5pD5lqwxVSAiN8qS5zVNZMrhGV5aN1vN_vue_tw8c2SVOCLLTrUh3441rYaeo-UwQZF7ZTm30xflqAIfe8qMoB20wtWYAXR0D5iqkkdEH4XanCYVm5vdUFIPPvXZhRDWoNQ","e":"AQAB","x5c":["MIICmzCCAYMCBgGQupeGPzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjQwNzE2MDgwODMwWhcNMzQwNzE2MDgxMDEwWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCeol7FLqf5LEpINTFen92w3ANbpxnhG2Cqr263+WnUI1KmHnBOcsbdpBCxMS/Hmjf5Jn6keMnSC0SmDtyUDP7D5hDJmgBeQW1CqZknGyZ1LgrTIgvE7dZQ10lCW62Oar5GLnRJ6efkhXvIRhYujxK3WrNSpZmGnQcq53K3Lbi2uIL1QlMrTdbf9OvlzVfy8ovx24CO8sHun+xhQ6ucurmkPmWrDFVICI3ypLnNU1kyuEZXlo3W83++57+3DxzZJU4IstOtSHfjjWthp6j5TBBkXtlObfTF+WoAh97yoygHbTC1ZgBdHQPmKqSR0QfhdqcJhWbm91QUg8+9dmFENag1AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAB/AGvP0gviPoJszj/oQgBsMpPGRHLpnTmrXnTaa7Xk2sgExAb4zUAwxGjtR347t697cpiKQYBkR2ndswnt93Sx/Ot+yn5BdYcNvZuEh5jb5bkH2V4h6/LrYljTymby+XPBEf+XLhBOjoI3SKtNJk4pEqVNwLuKKbObqJcE3G3VBVSdzRUcIrjZr7yAQeLnhczS3hJ0Ct6Y7S5Q6DK+/PU1+AvlW+7GfzpRMqVfLcqhNpRwdCVGlJYKaUJfIe1vav10D94xA0U1sKex3iA1S+1HlS2BCWx/0rXwgcquMpUZlOAKiT0K6SIFxBFFnM9eQbF97Dz7Bzw+jyqStGUcH9YA="],"x5t":"TuBfrOL00KXDrOWTv3jw7Uxx3hA","x5t#S256":"7su5lOXF5qcMuvp44ynsoyk3B0l9Sr_bOVlg768shpY"},{"kid":"9755555S8BFFRfm585GPgA16G1H2V22EdxxuAYUuoKk","kty":"RSA","alg":"RS256","use":"sig","n":"jMB2r7BG4QJzLnA2_fgG1mxlh2RX_MSx0lc2lrPIVFGYBuAu8irwRLSexX5aQdD_AtnxLD4g9jiG6VEDwmWopEe0fr-QMl0IiES5tJuQMrjhajOkzr8xTYu6zl-knL0tu99iRbmKNYzEcv0TAgY_95n4gD5tPhYvY4gXuHrFKqYkJQPsSgoThlH7hAtfzsDt6yp3P2lQUESGg3pzc_J_NKnQkkggcNB06Hlz4DmcHxhWXK51P1V9cE7qh4PrhsJ-SOH5grcN9PtOZi6f2VlWdFdyisT-YehNklfVqBtdCLm7Ocghhl0HSgLuV-9dHCdwBLUpABsdsd0L3LRCUgRfjQ","e":"AQAB","x5c":["MIICmzCCAYMCBgGQupeFFTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjQwNzE2MDgwODMwWhcNMzQwNzE2MDgxMDEwWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCMwHavsEbhAnMucDb9+AbWbGWHZFf8xLHSVzaWs8hUUZgG4C7yKvBEtJ7FflpB0P8C2fEsPiD2OIbpUQPCZaikR7R+v5AyXQiIRLm0m5AyuOFqM6TOvzFNi7rOX6ScvS2732JFuYo1jMRy/RMCBj/3mfiAPm0+Fi9jiBe4esUqpiQlA+xKChOGUfuEC1/OwO3rKnc/aVBQRIaDenNz8n80qdCSSCBw0HToeXPgOZwfGFZcrnU/VX1wTuqHg+uGwn5I4fmCtw30+05mLp/ZWVZ0V3KKxP5h6E2SV9WoG10Iubs5yCGGXQdKAu5X710cJ3AEtSkAGx2x3QvctEJSBF+NAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIoBCsOO0bXiVspoXkqdOts4+3sULbbp5aEwQscmLX017Zvv5jxdkZxUYk8L08lNB+WlC1ES4VlmtE06D0cWYErGpArJzVBKgYSA3CkA9veBEugHviMqfwg3suNc8S+GtaRBvpbVZtXydjjqA8GZ4eKhPoJLHHCX6X2Ad33Cdt0/ftucjTqAKVzzzgWZejy+ZKP6ybAqYJ+EZoPUXlyWT3uwcpGEJ3nzOYYGTfxOSmAwnH2v5Z/JWr9ex5o/+QBuBhFcg0z8NcHa3Z0E6ZC9GGxV7XztBqYicO+nONHTLCctoJmyXvLM4j8qIG2UQgPIiwIL0Jkz6xQAYyXvsb+LhM8="],"x5t":"BFrni6MoX-CJwtMT4vzij1HBSTI","x5t#S256":"-Ge3y4JRezxhGTDfbkNoz7prkokzYtbKQ9ardPtfcz4"}]}', headers: {}) + .to_return(status: 200, body: JWT::JWK::Set.new(wrong_key).export.to_json, headers: {}) end - let(:token) { rsa_signed_access_token_with_aud } it do - Timecop.freeze(token_exp - 20.seconds) do - get resource - end + get resource expect(last_response).to have_http_status :unauthorized expect(JSON.parse(last_response.body)).to eq(error_response_body) error = "The access token signature kid is unknown" From c4caf985170030b35b9bc44a3fc78c59345ab789 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Mon, 16 Dec 2024 10:12:57 +0100 Subject: [PATCH 2/9] Discover audiences from access token We want to know for which purposes tokens can be used. Assuming that we receive JWTs as access tokens, it's possible to read their audience and thus check where these tokens are usable. Importantly, it's still possible that an access token is not a JWT, so we have to allow that as well. The code could be extended in the future to send such tokens to the introspection endpoint of the IDP, hoping to receive an audience list as a result of that. --- .../openid_connect/associate_user_token.rb | 20 ++++- .../associate_user_token_spec.rb | 84 +++++++++++++++++-- 2 files changed, 94 insertions(+), 10 deletions(-) diff --git a/modules/openid_connect/app/services/openid_connect/associate_user_token.rb b/modules/openid_connect/app/services/openid_connect/associate_user_token.rb index 893107e86478..3c5f7da91e64 100644 --- a/modules/openid_connect/app/services/openid_connect/associate_user_token.rb +++ b/modules/openid_connect/app/services/openid_connect/associate_user_token.rb @@ -30,8 +30,9 @@ module OpenIDConnect class AssociateUserToken - def initialize(user) + def initialize(user, jwt_parser: JwtParser.new(verify_audience: false, required_claims: ["aud"])) @user = user + @jwt_parser = jwt_parser end def call(access_token:, refresh_token: nil, known_audiences: [], clear_previous: false) @@ -47,9 +48,22 @@ def call(access_token:, refresh_token: nil, known_audiences: [], clear_previous: @user.oidc_user_tokens.destroy_all if clear_previous - token = @user.oidc_user_tokens.build(access_token:, refresh_token:, audiences: Array(known_audiences)) - # We should discover further audiences from the token in the future + token = @user.oidc_user_tokens.build(access_token:, refresh_token:) + token.audiences = merge_audiences(known_audiences, discover_audiences(access_token)) token.save! if token.audiences.any? end + + private + + def discover_audiences(access_token) + decoded, = @jwt_parser.parse(access_token) + Array(decoded["aud"]) + rescue StandardError + [] + end + + def merge_audiences(*args) + args.flatten.uniq + end end end diff --git a/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb b/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb index 0d80085ff57d..aa7db97e443d 100644 --- a/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb +++ b/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" RSpec.describe OpenIDConnect::AssociateUserToken do - subject { described_class.new(user).call(**args) } + subject { described_class.new(user, jwt_parser: parser).call(**args) } let(:user) { create(:user) } @@ -39,6 +39,9 @@ let(:access_token) { "access-token-foo" } let(:refresh_token) { "refresh-token-bar" } + let(:parser) { instance_double(OpenIDConnect::JwtParser, parse: [parsed_jwt, nil]) } + let(:parsed_jwt) { { "aud" => ["aud1", "aud2"] } } + before do allow(Rails.logger).to receive(:error) end @@ -50,7 +53,7 @@ expect(token.user_id).to eq user.id expect(token.access_token).to eq access_token expect(token.refresh_token).to eq refresh_token - expect(token.audiences).to eq ["io"] + expect(token.audiences).to contain_exactly("io", "aud1", "aud2") end it "logs no error" do @@ -58,6 +61,44 @@ expect(Rails.logger).not_to have_received(:error) end + context "when the JWT encodes aud as a string" do + let(:parsed_jwt) { { "aud" => "aud1" } } + + it "creates a correct user token", :aggregate_failures do + expect { subject }.to change(OpenIDConnect::UserToken, :count).by(1) + + token = OpenIDConnect::UserToken.last + expect(token.access_token).to eq access_token + expect(token.refresh_token).to eq refresh_token + expect(token.audiences).to contain_exactly("io", "aud1") + end + + it "logs no error" do + subject + expect(Rails.logger).not_to have_received(:error) + end + end + + context "when the access token is not a valid JWT" do + before do + allow(parser).to receive(:parse).and_raise("Oops, not a JWT!") + end + + it "creates a correct user token", :aggregate_failures do + expect { subject }.to change(OpenIDConnect::UserToken, :count).by(1) + + token = OpenIDConnect::UserToken.last + expect(token.access_token).to eq access_token + expect(token.refresh_token).to eq refresh_token + expect(token.audiences).to contain_exactly("io") + end + + it "logs no error" do + subject + expect(Rails.logger).not_to have_received(:error) + end + end + context "when there is no refresh token" do let(:refresh_token) { nil } @@ -68,7 +109,7 @@ expect(token.user_id).to eq user.id expect(token.access_token).to eq access_token expect(token.refresh_token).to be_nil - expect(token.audiences).to eq ["io"] + expect(token.audiences).to contain_exactly("io", "aud1", "aud2") end it "logs no error" do @@ -106,14 +147,32 @@ context "when there is no audience" do let(:args) { { access_token:, refresh_token:, known_audiences: [] } } - it "does not create a user token" do - expect { subject }.not_to change(OpenIDConnect::UserToken, :count) + it "creates a correct user token", :aggregate_failures do + expect { subject }.to change(OpenIDConnect::UserToken, :count).by(1) + + token = OpenIDConnect::UserToken.last + expect(token.access_token).to eq access_token + expect(token.refresh_token).to eq refresh_token + expect(token.audiences).to contain_exactly("aud1", "aud2") end it "logs no error" do subject expect(Rails.logger).not_to have_received(:error) end + + context "and the token has no audience defined" do + let(:parsed_jwt) { { "sub" => "ject" } } + + it "does not create a user token" do + expect { subject }.not_to change(OpenIDConnect::UserToken, :count) + end + + it "logs no error" do + subject + expect(Rails.logger).not_to have_received(:error) + end + end end context "when another user token existed before" do @@ -131,7 +190,7 @@ expect(token.user_id).to eq user.id expect(token.access_token).to eq access_token expect(token.refresh_token).to eq refresh_token - expect(token.audiences).to eq ["io"] + expect(token.audiences).to contain_exactly("io", "aud1", "aud2") end context "and when previous tokens shall be cleared" do @@ -149,7 +208,7 @@ expect(token.user_id).to eq user.id expect(token.access_token).to eq access_token expect(token.refresh_token).to eq refresh_token - expect(token.audiences).to eq ["io"] + expect(token.audiences).to contain_exactly("io", "aud1", "aud2") end it "logs no error" do @@ -158,4 +217,15 @@ end end end + + context "when audiences from token and arguments overlap" do + let(:parsed_jwt) { { "aud" => ["io", "aud2"] } } + + it "normalizes the audience array" do + subject + + token = OpenIDConnect::UserToken.last + expect(token.audiences).to contain_exactly("io", "aud2") + end + end end From 17a366f002907dfbf94fad8aa138bc7b5f4cb749 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Mon, 13 Jan 2025 11:03:05 +0100 Subject: [PATCH 3/9] Monadize JwtParser Instead of relying on raised exceptions for lots of our control flow, we are now using a failed operation to represent these. We are using the Failure result for all previously considered exceptions, because all of them were kind of expectable error conditions. --- .../strategies/warden/jwt_oidc.rb | 23 +++---- .../openid_connect/associate_user_token.rb | 14 +++-- .../app/services/openid_connect/jwt_parser.rb | 62 ++++++++++--------- .../associate_user_token_spec.rb | 6 +- .../openid_connect/jwt_parser_spec.rb | 52 ++++++++-------- spec/requests/api/v3/authentication_spec.rb | 8 +-- spec/spec_helper.rb | 1 + 7 files changed, 81 insertions(+), 85 deletions(-) diff --git a/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb b/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb index 7c392f5957c9..573cddb809f3 100644 --- a/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb +++ b/lib_static/open_project/authentication/strategies/warden/jwt_oidc.rb @@ -20,21 +20,14 @@ def valid? end def authenticate! - verified_payload, provider = ::OpenIDConnect::JwtParser.new(required_claims: ["sub"]).parse(@access_token) - - user = User.find_by(identity_url: "#{provider.slug}:#{verified_payload['sub']}") - success!(user) if user - rescue JWT::ExpiredSignature - fail_with_header!(error: "invalid_token", error_description: "The access token expired") - rescue JWT::ImmatureSignature - # happens when nbf time is less than current - fail_with_header!(error: "invalid_token", error_description: "The access token is used too early") - rescue JWT::InvalidAudError - fail_with_header!(error: "invalid_token", error_description: "The access token audience claim is wrong") - rescue JSON::JWK::Set::KidNotFound - fail_with_header!(error: "invalid_token", error_description: "The access token signature kid is unknown") - rescue ::OpenIDConnect::JwtParser::Error => e - fail_with_header!(error: "invalid_token", error_description: e.message) + ::OpenIDConnect::JwtParser.new(required_claims: ["sub"]).parse(@access_token).either( + ->(payload_and_provider) do + payload, provider = payload_and_provider + user = User.find_by(identity_url: "#{provider.slug}:#{payload['sub']}") + success!(user) if user + end, + ->(error) { fail_with_header!(error: "invalid_token", error_description: error) } + ) end end end diff --git a/modules/openid_connect/app/services/openid_connect/associate_user_token.rb b/modules/openid_connect/app/services/openid_connect/associate_user_token.rb index 3c5f7da91e64..e1ece957b585 100644 --- a/modules/openid_connect/app/services/openid_connect/associate_user_token.rb +++ b/modules/openid_connect/app/services/openid_connect/associate_user_token.rb @@ -48,18 +48,20 @@ def call(access_token:, refresh_token: nil, known_audiences: [], clear_previous: @user.oidc_user_tokens.destroy_all if clear_previous - token = @user.oidc_user_tokens.build(access_token:, refresh_token:) - token.audiences = merge_audiences(known_audiences, discover_audiences(access_token)) + token = prepare_token(access_token:, refresh_token:, known_audiences:) token.save! if token.audiences.any? end private + def prepare_token(access_token:, refresh_token:, known_audiences:) + @user.oidc_user_tokens.build(access_token:, refresh_token:).tap do |token| + token.audiences = merge_audiences(known_audiences, discover_audiences(access_token).value_or([])) + end + end + def discover_audiences(access_token) - decoded, = @jwt_parser.parse(access_token) - Array(decoded["aud"]) - rescue StandardError - [] + @jwt_parser.parse(access_token).fmap { |decoded, _| Array(decoded["aud"]) } end def merge_audiences(*args) diff --git a/modules/openid_connect/app/services/openid_connect/jwt_parser.rb b/modules/openid_connect/app/services/openid_connect/jwt_parser.rb index f371e6e5f7de..ec789fcaa56d 100644 --- a/modules/openid_connect/app/services/openid_connect/jwt_parser.rb +++ b/modules/openid_connect/app/services/openid_connect/jwt_parser.rb @@ -30,7 +30,7 @@ module OpenIDConnect class JwtParser - class Error < StandardError; end + include Dry::Monads[:result] SUPPORTED_JWT_ALGORITHMS = %w[ RS256 @@ -44,41 +44,41 @@ def initialize(verify_audience: true, required_claims: []) end def parse(token) - issuer, alg, kid = parse_unverified_iss_alg_kid(token) - raise Error, "Token signature algorithm #{alg} is not supported" if SUPPORTED_JWT_ALGORITHMS.exclude?(alg) - - provider = fetch_provider(issuer) - raise Error, "The access token issuer is unknown" if provider.blank? - - jwks_uri = provider.jwks_uri - key = JSON::JWK::Set::Fetcher.fetch(jwks_uri, kid:).to_key - - verified_payload, = JWT.decode( - token, - key, - true, - { - algorithm: alg, - verify_aud: @verify_audience, - aud: provider.client_id, - required_claims: all_required_claims - } - ) - - [verified_payload, provider] + parse_unverified_iss_alg_kid(token).bind do |issuer, alg, kid| + return Failure("Token signature algorithm #{alg} is not supported") if SUPPORTED_JWT_ALGORITHMS.exclude?(alg) + + provider = fetch_provider(issuer) + return Failure("The access token issuer is unknown") if provider.blank? + + verified_payload, = JWT.decode( + token, + fetch_key(provider:, kid:), + true, + { + algorithm: alg, + verify_aud: @verify_audience, + aud: provider.client_id, + required_claims: all_required_claims + } + ) + + Success([verified_payload, provider]) + rescue JWT::DecodeError => e + Failure(e.message) + rescue JSON::JWK::Set::KidNotFound + Failure("The signature key ID is unknown") + end end private def parse_unverified_iss_alg_kid(token) unverified_payload, unverified_header = JWT.decode(token, nil, false) - raise Error, "The token's Key Identifier (kid) is missing" unless unverified_header.key?("kid") + return Failure("The token's Key Identifier (kid) is missing") unless unverified_header.key?("kid") - [ - unverified_payload["iss"], - unverified_header.fetch("alg"), - unverified_header.fetch("kid") - ] + Success([unverified_payload["iss"], unverified_header.fetch("alg"), unverified_header.fetch("kid")]) + rescue JWT::DecodeError => e + Failure(e.message) end def fetch_provider(issuer) @@ -87,6 +87,10 @@ def fetch_provider(issuer) OpenIDConnect::Provider.where(available: true).where("options->>'issuer' = ?", issuer).first end + def fetch_key(provider:, kid:) + JSON::JWK::Set::Fetcher.fetch(provider.jwks_uri, kid:).to_key + end + def all_required_claims claims = ["iss"] + @required_claims claims << "aud" if @verify_audience diff --git a/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb b/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb index aa7db97e443d..d0f8fa8694b3 100644 --- a/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb +++ b/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb @@ -39,7 +39,7 @@ let(:access_token) { "access-token-foo" } let(:refresh_token) { "refresh-token-bar" } - let(:parser) { instance_double(OpenIDConnect::JwtParser, parse: [parsed_jwt, nil]) } + let(:parser) { instance_double(OpenIDConnect::JwtParser, parse: Success([parsed_jwt, nil])) } let(:parsed_jwt) { { "aud" => ["aud1", "aud2"] } } before do @@ -80,9 +80,7 @@ end context "when the access token is not a valid JWT" do - before do - allow(parser).to receive(:parse).and_raise("Oops, not a JWT!") - end + let(:parser) { instance_double(OpenIDConnect::JwtParser, parse: Failure("Oops, not a JWT!")) } it "creates a correct user token", :aggregate_failures do expect { subject }.to change(OpenIDConnect::UserToken, :count).by(1) diff --git a/modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb b/modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb index d22156b0e0a6..21fcb28a65ab 100644 --- a/modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb +++ b/modules/openid_connect/spec/services/openid_connect/jwt_parser_spec.rb @@ -51,13 +51,15 @@ provider.save! end + it { is_expected.to be_success } + it "parses the token" do - parsed, = parse + parsed, = parse.value! expect(parsed).to eq payload end it "returns the provider configuration for the associated provider" do - _, p = parse + _, p = parse.value! expect(p).to eq provider end @@ -70,8 +72,10 @@ context "when the provider signing the token is not known" do let(:known_issuer) { "Lunar Gateway" } - it "raises an error" do - expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /issuer is unknown/) + it { is_expected.to be_failure } + + it "indicates the problem" do + expect(parse.failure).to match(/issuer is unknown/) end end @@ -80,24 +84,26 @@ provider.update!(available: false) end - it "raises an error" do - expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /issuer is unknown/) + it { is_expected.to be_failure } + + it "indicates the problem" do + expect(parse.failure).to match(/issuer is unknown/) end end context "when the token is not a valid JWT" do let(:token) { Base64.encode64("banana").strip } - it "raises an error" do - expect { parse }.to raise_error(JWT::DecodeError) - end + it { is_expected.to be_failure } end context "when the token is signed using an unsupported signature" do let(:token) { JWT.encode(payload, "secret", "HS256", { kid: "key-identifier" }) } - it "raises an error" do - expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /HS256 is not supported/) + it { is_expected.to be_failure } + + it "indicates the problem" do + expect(parse.failure).to match(/HS256 is not supported/) end end @@ -106,44 +112,36 @@ payload["aud"] = "Alice" end - it "raises an error" do - expect { parse }.to raise_error(JWT::InvalidAudError) - end + it { is_expected.to be_failure } context "and the audience shall not be verified" do subject(:parse) { described_class.new(verify_audience: false).parse(token) } - it "parses the token" do - parsed, = parse - expect(parsed).to eq payload - end + it { is_expected.to be_success } end end context "when the token does not indicate a Key Identifier" do let(:token) { JWT.encode(payload, private_key, "RS256") } - it "raises an error" do - expect { parse }.to raise_error(OpenIDConnect::JwtParser::Error, /Key Identifier .+ is missing/) + it { is_expected.to be_failure } + + it "indicates the problem" do + expect(parse.failure).to match(/Key Identifier .+ is missing/) end end context "when requiring a specific claim" do subject(:parse) { described_class.new(required_claims: ["sub"]).parse(token) } - it "parses the token" do - parsed, = parse - expect(parsed).to eq payload - end + it { is_expected.to be_success } context "and when the required claim is missing" do before do payload.delete("sub") end - it "raises an error" do - expect { parse }.to raise_error(JWT::MissingRequiredClaim) - end + it { is_expected.to be_failure } end end end diff --git a/spec/requests/api/v3/authentication_spec.rb b/spec/requests/api/v3/authentication_spec.rb index 4bc41dadf225..5b2a95a5f80d 100644 --- a/spec/requests/api/v3/authentication_spec.rb +++ b/spec/requests/api/v3/authentication_spec.rb @@ -467,13 +467,13 @@ def set_basic_auth_header(user, password) context "when access token has not expired yet" do context "when aud does not contain client_id" do - let(:token_aud) { ["master-realm", "account"] } + let(:token_aud) { ["Lisa", "Bart"] } it do get resource expect(last_response).to have_http_status :unauthorized - error = "The access token audience claim is wrong" + error = 'Invalid audience. Expected https://openproject.local, received ["Lisa", "Bart"]' expect(last_response.header["WWW-Authenticate"]) .to eq(%{Bearer realm="OpenProject API", error="invalid_token", error_description="#{error}"}) expect(JSON.parse(last_response.body)).to eq(error_response_body) @@ -497,7 +497,7 @@ def set_basic_auth_header(user, password) expect(last_response).to have_http_status :unauthorized expect(last_response.header["WWW-Authenticate"]) - .to eq(%{Bearer realm="OpenProject API", error="invalid_token", error_description="The access token expired"}) + .to eq(%{Bearer realm="OpenProject API", error="invalid_token", error_description="Signature has expired"}) expect(JSON.parse(last_response.body)).to eq(error_response_body) end @@ -531,7 +531,7 @@ def set_basic_auth_header(user, password) get resource expect(last_response).to have_http_status :unauthorized expect(JSON.parse(last_response.body)).to eq(error_response_body) - error = "The access token signature kid is unknown" + error = "The signature key ID is unknown" expect(last_response.header["WWW-Authenticate"]) .to eq(%{Bearer realm="OpenProject API", error="invalid_token", error_description="#{error}"}) end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c0fdf04017df..62ae6183075f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -54,4 +54,5 @@ # Have the FactoryBot methods like #create and #build_stubbed without # having to call it on FactoryBot. config.include FactoryBot::Syntax::Methods + config.include Dry::Monads[:result] end From 61fa6a4e702022d0bfeae553bfce910f892b8498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 13 Jan 2025 09:29:24 +0100 Subject: [PATCH 4/9] Make cuprite the default --- spec/support/authentication_helpers.rb | 4 ---- spec/support/capybara.rb | 1 - spec/support/cuprite_setup.rb | 18 +++++++++++------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/spec/support/authentication_helpers.rb b/spec/support/authentication_helpers.rb index 4921b3498199..03336bdf9090 100644 --- a/spec/support/authentication_helpers.rb +++ b/spec/support/authentication_helpers.rb @@ -86,10 +86,6 @@ def js_enabled? RSpec.current_example.metadata[:js] end - def using_cuprite? - RSpec.current_example.metadata[:with_cuprite] - end - def session_value_for(user) { user_id: user.id, updated_at: Time.current } end diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb index 52ffefe902d3..1d3408469ebd 100644 --- a/spec/support/capybara.rb +++ b/spec/support/capybara.rb @@ -33,7 +33,6 @@ RSpec.configure do |config| Capybara.default_max_wait_time = 4 - Capybara.javascript_driver = :chrome_en port = ENV.fetch("CAPYBARA_SERVER_PORT", ParallelHelper.port_for_app).to_i if port > 0 diff --git a/spec/support/cuprite_setup.rb b/spec/support/cuprite_setup.rb index 62bdcf0dae09..54614c5a5c1d 100644 --- a/spec/support/cuprite_setup.rb +++ b/spec/support/cuprite_setup.rb @@ -113,16 +113,20 @@ def register_better_cuprite(language, name: :"better_cuprite_#{language}") ].freeze RSpec.configure do |config| - config.define_derived_metadata(file_path: %r{/(#{MODULES_WITH_CUPRITE_ENABLED.join('|')})/spec/features/}) do |meta| - if meta[:js] && !meta.key?(:with_cuprite) - meta[:with_cuprite] = true - end - end + config.around(:each, :js, type: :feature) do |example| + # Skip if driver is explicitly requested + next if example.metadata[:driver] - config.around(:each, :with_cuprite, type: :feature) do |example| original_driver = Capybara.javascript_driver + begin - Capybara.javascript_driver = :better_cuprite_en + Capybara.javascript_driver = + if example.metadata[:selenium] + :chrome_en + else + :better_cuprite_en + end + example.run ensure Capybara.javascript_driver = original_driver From f791d33b72c3e271f72590700c9f2985eb9b1a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 13 Jan 2025 09:29:27 +0100 Subject: [PATCH 5/9] Replace specs --- .../features/administration/saml_crud_spec.rb | 3 +-- .../spec/features/backlogs/change_status_spec.rb | 2 +- .../spec/features/backlogs/context_menu_spec.rb | 2 +- .../spec/features/backlogs/create_story_spec.rb | 2 +- .../features/backlogs_in_backlog_view_spec.rb | 2 +- .../spec/features/empty_backlogs_spec.rb | 2 +- .../backlogs/spec/features/impediments_spec.rb | 2 +- .../spec/features/stories_in_backlog_spec.rb | 2 +- .../spec/features/tasks_on_taskboard_spec.rb | 2 +- .../features/work_packages/story_points_spec.rb | 2 +- .../spec/features/bcf/api_authorization_spec.rb | 1 - .../spec/features/card_view/bulk_actions_spec.rb | 2 +- .../spec/features/card_view/context_menu_spec.rb | 2 +- .../features/card_view/wp_card_status_spec.rb | 2 +- .../spec/features/board_enterprise_spec.rb | 2 +- modules/boards/spec/features/board_index_spec.rb | 1 - .../spec/features/board_navigation_spec.rb | 1 - .../boards/spec/features/board_overview_spec.rb | 1 - .../spec/features/boards_global_create_spec.rb | 1 - .../features/menu_items/global_menu_item_spec.rb | 2 +- .../features/menu_items/top_menu_item_spec.rb | 2 +- .../spec/features/budgets/update_budget_spec.rb | 2 +- .../spec/features/calendar_dates_spec.rb | 2 +- .../spec/features/calendar_widget_spec.rb | 6 +++--- .../features/calendars_global_create_spec.rb | 3 +-- .../spec/features/calendars_index_spec.rb | 2 +- .../spec/features/work_package_activity_spec.rb | 3 +-- .../work_package_gitlab_issue_activity_spec.rb | 3 +-- ...package_gitlab_merge_request_activity_spec.rb | 3 +-- .../spec/features/meetings_attachments_spec.rb | 2 +- .../meeting/spec/features/meetings_close_spec.rb | 3 +-- .../meeting/spec/features/meetings_copy_spec.rb | 2 +- .../features/meetings_global_menu_item_spec.rb | 3 +-- .../meeting/spec/features/meetings_index_spec.rb | 2 +- .../meeting/spec/features/meetings_new_spec.rb | 16 ++++++++-------- .../recurring_meeting_create_spec.rb | 1 - .../recurring_meeting_crud_spec.rb | 1 - .../features/structured_meetings/history_spec.rb | 3 +-- .../mobile_structure_meeting_spec.rb | 3 +-- .../structured_meeting_crud_spec.rb | 1 - .../structured_meeting_participant_spec.rb | 3 +-- .../structured_meeting_update_flash_spec.rb | 2 +- .../structured_meetings/turbo_links_spec.rb | 3 +-- .../work_package_meetings_tab_spec.rb | 5 ++--- .../administration/oidc_custom_crud_spec.rb | 3 +-- .../reporting/spec/features/calculations_spec.rb | 2 +- modules/reporting/spec/features/filter_spec.rb | 2 +- modules/reporting/spec/features/group_by_spec.rb | 2 +- .../spec/features/main_menu_item_spec.rb | 2 +- ...delete_project_storage_and_file_links_spec.rb | 2 +- .../spec/features/hide_attachments_spec.rb | 2 +- .../spec/features/manage_project_storage_spec.rb | 3 +-- .../storages/admin/project_storages_spec.rb | 3 +-- .../team_planner_onboarding_tour_spec.rb | 2 +- .../spec/features/query_handling_spec.rb | 2 +- .../features/team_planner_global_create_spec.rb | 1 - .../spec/features/team_planner_index_spec.rb | 2 +- .../spec/features/team_planner_menu_spec.rb | 2 +- .../spec/features/team_planner_overview_spec.rb | 1 - .../spec/features/team_planner_upsale_spec.rb | 2 +- .../spec/features/account_activation_spec.rb | 1 - .../backup_codes/login_with_backup_code_spec.rb | 1 - .../features/login/login_enforced_2fa_spec.rb | 1 - .../spec/features/login/login_with_2fa_spec.rb | 1 - .../login/login_with_deleted_2fa_spec.rb | 1 - .../features/login/login_without_2fa_spec.rb | 1 - .../login/switch_available_devices_spec.rb | 1 - .../spec/features/my_two_factor_devices_spec.rb | 1 - .../login_with_remember_cookie_spec.rb | 1 - .../alternative_name_autcompleting_spec.rb | 3 +-- .../activities/activity_page_navigation_spec.rb | 2 +- .../activities/disabled_activity_spec.rb | 2 +- .../project_attributes_activity_spec.rb | 2 +- .../activities/time_entry_activity_spec.rb | 1 - spec/features/activities/wiki_activity_spec.rb | 2 +- .../activities/work_package/activities_spec.rb | 5 +++-- .../work_package/emoji_reactions_spec.rb | 3 +-- .../activities/work_package_activity_spec.rb | 2 +- .../attachments/quarantined_attachments_spec.rb | 2 +- spec/features/admin/attribute_help_texts_spec.rb | 4 ++-- .../custom_fields/link_custom_field_spec.rb | 2 +- .../custom_fields/list_custom_field_spec.rb | 2 +- .../custom_fields/user_custom_field_spec.rb | 2 +- .../features/admin/enterprise/enterprise_spec.rb | 2 +- .../oauth/oauth_applications_management_spec.rb | 2 +- spec/features/admin/progress_tracking_spec.rb | 2 +- .../project_life_cycle_step_definitions_spec.rb | 2 +- spec/features/admin/statuses_spec.rb | 2 +- .../admin/test_mail_notification_spec.rb | 2 +- spec/features/admin/working_days_spec.rb | 2 +- spec/features/auth/logout_spec.rb | 3 +-- spec/features/categories/delete_spec.rb | 2 +- .../custom_fields/activate_in_project_spec.rb | 2 +- spec/features/custom_fields/create_bool_spec.rb | 2 +- spec/features/custom_fields/create_date_spec.rb | 2 +- spec/features/custom_fields/create_float_spec.rb | 2 +- spec/features/custom_fields/create_int_spec.rb | 2 +- .../features/custom_fields/custom_fields_spec.rb | 2 +- .../custom_fields/hierarchy_custom_field_spec.rb | 2 +- .../multi_user_custom_field_spec.rb | 2 +- .../multi_value_custom_field_spec.rb | 2 +- .../non_open_version_custom_field_spec.rb | 2 +- .../global_roles/global_create_project_spec.rb | 3 +-- .../global_roles/global_role_assignment_spec.rb | 2 +- .../global_roles/global_role_crud_spec.rb | 2 +- .../global_roles/global_role_update_spec.rb | 2 +- spec/features/global_roles/member_roles_spec.rb | 2 +- spec/features/global_roles/no_module_spec.rb | 2 +- spec/features/groups/group_memberships_spec.rb | 2 +- spec/features/groups/groups_spec.rb | 2 +- spec/features/groups/membership_spec.rb | 2 +- spec/features/homescreen/index_spec.rb | 2 +- spec/features/ldap_auth_sources/crud_spec.rb | 2 +- spec/features/members/error_messages_spec.rb | 2 +- spec/features/members/invitation_spec.rb | 2 +- spec/features/members/membership_filter_spec.rb | 3 +-- spec/features/members/membership_share_spec.rb | 2 +- spec/features/members/membership_spec.rb | 2 +- spec/features/members/pagination_spec.rb | 2 +- spec/features/members/roles_spec.rb | 2 +- spec/features/menu_items/admin_menu_item_spec.rb | 3 +-- spec/features/menu_items/help_menu_spec.rb | 2 +- .../features/menu_items/menu_permissions_spec.rb | 2 +- spec/features/menu_items/query_menu_item_spec.rb | 2 +- spec/features/menu_items/quick_add_menu_spec.rb | 2 +- spec/features/menu_items/top_menu_item_spec.rb | 2 +- spec/features/menu_items/wiki_menu_item_spec.rb | 5 ++--- .../my/autologin_tokens_management_spec.rb | 2 +- .../news/creation_and_commenting_spec.rb | 2 +- spec/features/news/global_menu_item_spec.rb | 2 +- spec/features/notifications/navigation_spec.rb | 2 +- ...otification_center_date_alert_mention_spec.rb | 1 - .../notification_center_date_alerts_spec.rb | 3 +-- .../notification_center_reminder_spec.rb | 1 - .../notification_center_sidemenu_spec.rb | 1 - .../notification_center_spec.rb | 9 ++++----- .../notification_center/split_screen_spec.rb | 2 +- .../settings/immediate_reminder_spec.rb | 4 ++-- .../settings/my_notifications_settings_spec.rb | 3 +-- .../settings/pause_reminder_settings_spec.rb | 2 +- .../settings/reminder_email_settings_spec.rb | 2 +- .../settings/workdays_settings_spec.rb | 2 +- spec/features/placeholder_users/index_spec.rb | 1 - .../projects/attribute_help_texts_spec.rb | 2 +- spec/features/projects/copy_spec.rb | 2 +- spec/features/projects/create_spec.rb | 3 +-- spec/features/projects/destroy_spec.rb | 2 +- spec/features/projects/edit_settings_spec.rb | 2 +- spec/features/projects/export_spec.rb | 2 +- spec/features/projects/global_menu_item_spec.rb | 2 +- .../life_cycle/active_in_project_spec.rb | 2 +- .../overview_page/dialog/permission_spec.rb | 3 +-- .../overview_page/dialog/update_spec.rb | 3 +-- .../life_cycle/overview_page/sidebar_spec.rb | 2 +- spec/features/projects/lists/columns_spec.rb | 2 +- spec/features/projects/lists/filters_spec.rb | 2 +- spec/features/projects/lists/gantt_spec.rb | 2 +- spec/features/projects/lists/order_spec.rb | 2 +- spec/features/projects/lists/table_spec.rb | 2 +- spec/features/projects/navigation_spec.rb | 2 +- .../projects/persisted_lists_sharing_spec.rb | 3 +-- spec/features/projects/persisted_lists_spec.rb | 3 +-- .../projects/project_autocomplete_spec.rb | 2 +- .../overview_page/sidebar_spec.rb | 2 +- .../settings/mapping_spec.rb | 2 +- .../project_status_administration_spec.rb | 2 +- .../projects/projects_custom_fields_spec.rb | 5 ++--- .../projects/subproject_creation_spec.rb | 2 +- spec/features/projects/template_spec.rb | 3 +-- .../projects/work_package_type_mgmt_spec.rb | 2 +- spec/features/roles/create_spec.rb | 2 +- .../features/security/plain_text_content_type.rb | 2 +- .../components/attribute_help_text_modal.rb | 2 +- spec/features/types/activate_in_project_spec.rb | 2 +- spec/features/types/crud_spec.rb | 2 +- .../types/form_configuration_query_spec.rb | 2 +- spec/features/users/create_spec.rb | 2 +- spec/features/users/delete_spec.rb | 2 +- spec/features/users/edit_users_spec.rb | 2 +- spec/features/users/index_spec.rb | 2 +- spec/features/users/invitation_spec.rb | 2 +- .../invite_user_modal/custom_fields_spec.rb | 2 +- .../invite_user_modal/invite_user_modal_spec.rb | 6 +++--- .../permission_lacking_current_project_spec.rb | 2 +- .../invite_user_modal/subproject_invite_spec.rb | 2 +- spec/features/users/my_spec.rb | 2 +- .../user_notifications_settings_spec.rb | 3 +-- spec/features/users/password_change_spec.rb | 2 +- spec/features/users/self_registration_spec.rb | 2 +- spec/features/users/show_spec.rb | 2 +- spec/features/users/unaccent_user_filter_spec.rb | 2 +- spec/features/users/user_memberships_spec.rb | 2 +- spec/features/versions/delete_spec.rb | 2 +- spec/features/versions/roadmap_filtering_spec.rb | 2 +- .../attachments/attachment_upload_spec.rb | 12 ++++++------ .../work_packages/bulk/copy_work_package_spec.rb | 2 +- .../work_packages/bulk/move_work_package_spec.rb | 6 +++--- .../bulk/update_work_package_spec.rb | 2 +- .../custom_actions_link_value_spec.rb | 2 +- .../custom_actions_me_value_spec.rb | 2 +- .../custom_actions/custom_actions_spec.rb | 5 ++--- .../datepicker_follows_relation_spec.rb | 3 +-- .../datepicker/datepicker_logic_spec.rb | 2 +- .../details/details_refreshing_spec.rb | 2 +- .../relations/hierarchy_milestone_spec.rb | 2 +- .../relations/primerized_relations_spec.rb | 2 +- .../work_packages/edit_work_package_spec.rb | 2 +- spec/features/work_packages/highlighting_spec.rb | 2 +- .../new/new_work_package_datepicker_spec.rb | 2 +- .../work_packages/new/new_work_package_spec.rb | 2 +- .../work_packages/progress_modal_spec.rb | 2 +- .../work_packages/remaining_time_spec.rb | 2 +- spec/features/work_packages/reminders_spec.rb | 3 +-- spec/features/work_packages/share/access_spec.rb | 3 +-- .../work_packages/share/bulk_sharing_spec.rb | 3 +-- .../share/enterprise_restriction_spec.rb | 2 +- spec/features/work_packages/share/filter_spec.rb | 3 +-- .../work_packages/share/multi_invite_spec.rb | 3 +-- .../work_packages/share/notification_spec.rb | 1 - .../share/share_account_activation_spec.rb | 3 +-- spec/features/work_packages/share/share_spec.rb | 3 +-- .../table/baseline/baseline_query_spec.rb | 1 - .../table/baseline/baseline_rendering_spec.rb | 1 - .../table/context_menu/context_menu_spec.rb | 3 +-- .../table/hierarchy/hierarchy_indent_spec.rb | 2 +- .../table/queries/assignee_filter_spec.rb | 2 +- .../table/queries/assignees_role_filter_spec.rb | 2 +- .../table/queries/date_is_empty_filter_spec.rb | 2 +- .../work_packages/table/queries/filter_spec.rb | 2 +- .../table/queries/mobile_date_filter_spec.rb | 2 +- .../queries/shared_with_user_filter_spec.rb | 3 +-- .../tabs/activity_revisions_spec.rb | 2 +- .../work_packages/tabs/activity_tab_spec.rb | 2 +- .../work_packages/tabs/watcher_tab_spec.rb | 2 +- .../work_packages/update_ancestors_spec.rb | 2 +- .../work_packages/work_package_index_spec.rb | 2 +- spec/features/wysiwyg/autosave_spec.rb | 3 +-- spec/features/wysiwyg/bold_behavior_spec.rb | 2 +- .../wysiwyg/macros/embedded_tables_spec.rb | 3 +-- spec/features/wysiwyg/mentions_spec.rb | 3 +-- 240 files changed, 242 insertions(+), 315 deletions(-) diff --git a/modules/auth_saml/spec/features/administration/saml_crud_spec.rb b/modules/auth_saml/spec/features/administration/saml_crud_spec.rb index 476fdff97f0f..f44a4233d0ea 100644 --- a/modules/auth_saml/spec/features/administration/saml_crud_spec.rb +++ b/modules/auth_saml/spec/features/administration/saml_crud_spec.rb @@ -30,8 +30,7 @@ require_module_spec_helper RSpec.describe "SAML administration CRUD", - :js, - :with_cuprite do + :js do shared_let(:user) { create(:admin) } let(:danger_zone) { DangerZone.new(page) } diff --git a/modules/backlogs/spec/features/backlogs/change_status_spec.rb b/modules/backlogs/spec/features/backlogs/change_status_spec.rb index 26ff0c87153c..028e3d04fe17 100644 --- a/modules/backlogs/spec/features/backlogs/change_status_spec.rb +++ b/modules/backlogs/spec/features/backlogs/change_status_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" require_relative "../../support/pages/backlogs" -RSpec.describe "Backlogs context menu", :js, :with_cuprite do +RSpec.describe "Backlogs context menu", :js do shared_let(:story_type) { create(:type_feature) } shared_let(:task_type) { create(:type_task) } shared_let(:project) { create(:project, types: [story_type, task_type]) } diff --git a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb index 3655ef953445..e64d2d59ed87 100644 --- a/modules/backlogs/spec/features/backlogs/context_menu_spec.rb +++ b/modules/backlogs/spec/features/backlogs/context_menu_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" require_relative "../../support/pages/backlogs" -RSpec.describe "Backlogs context menu", :js, :with_cuprite do +RSpec.describe "Backlogs context menu", :js do shared_let(:story_type) { create(:type_feature) } shared_let(:task_type) { create(:type_task) } shared_let(:project) { create(:project, types: [story_type, task_type]) } diff --git a/modules/backlogs/spec/features/backlogs/create_story_spec.rb b/modules/backlogs/spec/features/backlogs/create_story_spec.rb index 92e4b5bf4e80..1cef40803aaf 100644 --- a/modules/backlogs/spec/features/backlogs/create_story_spec.rb +++ b/modules/backlogs/spec/features/backlogs/create_story_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Backlogs", :js, :with_cuprite do +RSpec.describe "Backlogs", :js do let(:story_type) do create(:type_feature) end diff --git a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb index b1492fbfafd4..a421692e8e2b 100644 --- a/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb +++ b/modules/backlogs/spec/features/backlogs_in_backlog_view_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/backlogs" RSpec.describe "Backlogs in backlog view", :js, - with_cuprite: false do + :selenium do let!(:project) do create(:project, types: [story, task], diff --git a/modules/backlogs/spec/features/empty_backlogs_spec.rb b/modules/backlogs/spec/features/empty_backlogs_spec.rb index 30e3611035ac..b4cf24b380f9 100644 --- a/modules/backlogs/spec/features/empty_backlogs_spec.rb +++ b/modules/backlogs/spec/features/empty_backlogs_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" RSpec.describe "Empty backlogs project", - :js, :with_cuprite do + :js do shared_let(:story) { create(:type_feature) } shared_let(:task) { create(:type_task) } shared_let(:project) { create(:project, types: [story, task], enabled_module_names: %w(backlogs)) } diff --git a/modules/backlogs/spec/features/impediments_spec.rb b/modules/backlogs/spec/features/impediments_spec.rb index 645d0239582f..68367ff85a97 100644 --- a/modules/backlogs/spec/features/impediments_spec.rb +++ b/modules/backlogs/spec/features/impediments_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" RSpec.describe "Impediments on taskboard", :js, - with_cuprite: false do + :selenium do let!(:project) do create(:project, types: [story, task], diff --git a/modules/backlogs/spec/features/stories_in_backlog_spec.rb b/modules/backlogs/spec/features/stories_in_backlog_spec.rb index fa72438add47..26ee04562ecf 100644 --- a/modules/backlogs/spec/features/stories_in_backlog_spec.rb +++ b/modules/backlogs/spec/features/stories_in_backlog_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/backlogs" RSpec.describe "Stories in backlog", :js, - with_cuprite: false do + :selenium do let!(:project) do create(:project, types: [story, task, other_story], diff --git a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb index 4b5fe2eff5e2..5ddd99a6d90e 100644 --- a/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb +++ b/modules/backlogs/spec/features/tasks_on_taskboard_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/taskboard" RSpec.describe "Tasks on taskboard", :js, - with_cuprite: false do + :selenium do let!(:project) do create(:project, types: [story, task, other_story], diff --git a/modules/backlogs/spec/features/work_packages/story_points_spec.rb b/modules/backlogs/spec/features/work_packages/story_points_spec.rb index c0698bb7da36..40100f1693b4 100644 --- a/modules/backlogs/spec/features/work_packages/story_points_spec.rb +++ b/modules/backlogs/spec/features/work_packages/story_points_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Work packages having story points", :js, :with_cuprite do +RSpec.describe "Work packages having story points", :js do before do login_as current_user allow(Setting).to receive(:plugin_openproject_backlogs).and_return("points_burn_direction" => "down", diff --git a/modules/bim/spec/features/bcf/api_authorization_spec.rb b/modules/bim/spec/features/bcf/api_authorization_spec.rb index ad10114fed78..3ed09f9e548e 100644 --- a/modules/bim/spec/features/bcf/api_authorization_spec.rb +++ b/modules/bim/spec/features/bcf/api_authorization_spec.rb @@ -30,7 +30,6 @@ RSpec.describe "authorization for BCF api", :js, - :with_cuprite, with_config: { edition: "bim" } do let!(:user) { create(:admin) } let(:client_secret) { app.plaintext_secret } diff --git a/modules/bim/spec/features/card_view/bulk_actions_spec.rb b/modules/bim/spec/features/card_view/bulk_actions_spec.rb index 2de36f7fc316..2c00d4232852 100644 --- a/modules/bim/spec/features/card_view/bulk_actions_spec.rb +++ b/modules/bim/spec/features/card_view/bulk_actions_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require_relative "../../support/pages/ifc_models/show_default" -RSpec.describe "Copy work packages through Rails view", :js, :with_cuprite, with_config: { edition: "bim" } do +RSpec.describe "Copy work packages through Rails view", :js, with_config: { edition: "bim" } do shared_let(:project) { create(:project, name: "Source", enabled_module_names: %i[bim work_package_tracking]) } shared_let(:dev) do diff --git a/modules/bim/spec/features/card_view/context_menu_spec.rb b/modules/bim/spec/features/card_view/context_menu_spec.rb index 8fb3c2af7044..fbe520d44447 100644 --- a/modules/bim/spec/features/card_view/context_menu_spec.rb +++ b/modules/bim/spec/features/card_view/context_menu_spec.rb @@ -2,7 +2,7 @@ require_relative "../../../../../spec/features/work_packages/table/context_menu/context_menu_shared_examples" require_relative "../../support/pages/ifc_models/show_default" -RSpec.describe "Work Package table hierarchy and sorting", :js, :with_cuprite, with_config: { edition: "bim" } do +RSpec.describe "Work Package table hierarchy and sorting", :js, with_config: { edition: "bim" } do shared_let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking costs]) } let(:wp_table) { Pages::IfcModels::ShowDefault.new(project) } diff --git a/modules/bim/spec/features/card_view/wp_card_status_spec.rb b/modules/bim/spec/features/card_view/wp_card_status_spec.rb index a727858b1f95..d33d10a39a9d 100644 --- a/modules/bim/spec/features/card_view/wp_card_status_spec.rb +++ b/modules/bim/spec/features/card_view/wp_card_status_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../../support/pages/ifc_models/show_default" -RSpec.describe "Update status from WP card", :js, :with_cuprite, with_config: { edition: "bim" } do +RSpec.describe "Update status from WP card", :js, with_config: { edition: "bim" } do let(:manager_role) do create(:project_role, permissions: %i[view_work_packages edit_work_packages view_ifc_models view_linked_issues]) end diff --git a/modules/boards/spec/features/board_enterprise_spec.rb b/modules/boards/spec/features/board_enterprise_spec.rb index d03d11967b8a..e1d35b7e889f 100644 --- a/modules/boards/spec/features/board_enterprise_spec.rb +++ b/modules/boards/spec/features/board_enterprise_spec.rb @@ -30,7 +30,7 @@ require_relative "support/board_index_page" require_relative "support/board_page" -RSpec.describe "Boards enterprise spec", :js, :with_cuprite do +RSpec.describe "Boards enterprise spec", :js do shared_let(:admin) { create(:admin) } shared_let(:project) { create(:project, enabled_module_names: %i[work_package_tracking board_view]) } diff --git a/modules/boards/spec/features/board_index_spec.rb b/modules/boards/spec/features/board_index_spec.rb index 06de1b280766..e575c5713e3a 100644 --- a/modules/boards/spec/features/board_index_spec.rb +++ b/modules/boards/spec/features/board_index_spec.rb @@ -30,7 +30,6 @@ require_relative "support/board_index_page" RSpec.describe "Work Package Project Boards Index Page", - :with_cuprite, with_ee: %i[board_view] do # The identifier is important to test https://community.openproject.com/wp/29754 shared_let(:project) { create(:project, identifier: "boards", enabled_module_names: %i[work_package_tracking board_view]) } diff --git a/modules/boards/spec/features/board_navigation_spec.rb b/modules/boards/spec/features/board_navigation_spec.rb index dc39dc6d3aa3..705917952b5d 100644 --- a/modules/boards/spec/features/board_navigation_spec.rb +++ b/modules/boards/spec/features/board_navigation_spec.rb @@ -32,7 +32,6 @@ RSpec.describe "Work Package boards spec", :js, - :with_cuprite, with_ee: %i[board_view] do let(:user) do create(:user, diff --git a/modules/boards/spec/features/board_overview_spec.rb b/modules/boards/spec/features/board_overview_spec.rb index 0186d1f7c2e2..ff8a747e9946 100644 --- a/modules/boards/spec/features/board_overview_spec.rb +++ b/modules/boards/spec/features/board_overview_spec.rb @@ -30,7 +30,6 @@ require_relative "support/board_overview_page" RSpec.describe "Work Package Boards Overview", - :with_cuprite, with_ee: %i[board_view] do # The identifier is important to test https://community.openproject.com/wp/29754 shared_let(:project) do diff --git a/modules/boards/spec/features/boards_global_create_spec.rb b/modules/boards/spec/features/boards_global_create_spec.rb index a4da2bacdf6f..3bdcc098d23b 100644 --- a/modules/boards/spec/features/boards_global_create_spec.rb +++ b/modules/boards/spec/features/boards_global_create_spec.rb @@ -6,7 +6,6 @@ RSpec.describe "Boards", "Creating a view from a Global Context", :js, - :with_cuprite, with_ee: %i[board_view] do shared_let(:project) { create(:project, enabled_module_names: %i[work_package_tracking board_view]) } shared_let(:other_project) { create(:project, enabled_module_names: %i[work_package_tracking board_view]) } diff --git a/modules/boards/spec/features/menu_items/global_menu_item_spec.rb b/modules/boards/spec/features/menu_items/global_menu_item_spec.rb index 9959c8e27fc2..d2ae9b7798cd 100644 --- a/modules/boards/spec/features/menu_items/global_menu_item_spec.rb +++ b/modules/boards/spec/features/menu_items/global_menu_item_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" -RSpec.describe "Global menu item for boards", :js, :with_cuprite do +RSpec.describe "Global menu item for boards", :js do shared_let(:project) { create(:project) } let(:boards_label) { I18n.t("boards.label_boards") } diff --git a/modules/boards/spec/features/menu_items/top_menu_item_spec.rb b/modules/boards/spec/features/menu_items/top_menu_item_spec.rb index abb21b1fb831..e4f4eaed9585 100644 --- a/modules/boards/spec/features/menu_items/top_menu_item_spec.rb +++ b/modules/boards/spec/features/menu_items/top_menu_item_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Top menu item for boards", :js, :with_cuprite do +RSpec.describe "Top menu item for boards", :js do shared_let(:admin) { create(:admin) } shared_let(:user) { create(:user) } shared_let(:project) { create(:project) } diff --git a/modules/budgets/spec/features/budgets/update_budget_spec.rb b/modules/budgets/spec/features/budgets/update_budget_spec.rb index 5da73d7fae42..e7ca77ab5cba 100644 --- a/modules/budgets/spec/features/budgets/update_budget_spec.rb +++ b/modules/budgets/spec/features/budgets/update_budget_spec.rb @@ -39,7 +39,7 @@ current_user { user } - describe "with new cost items", :with_cuprite do + describe "with new cost items" do let(:cost_type) do create(:cost_type, name: "Post-war", unit: "cap", unit_plural: "caps") end diff --git a/modules/calendar/spec/features/calendar_dates_spec.rb b/modules/calendar/spec/features/calendar_dates_spec.rb index 7326721b2caa..2b4dcc004d43 100644 --- a/modules/calendar/spec/features/calendar_dates_spec.rb +++ b/modules/calendar/spec/features/calendar_dates_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Calendar non working days", :js, :with_cuprite do +RSpec.describe "Calendar non working days", :js do include_context "with calendar full access" let!(:other_user) do diff --git a/modules/calendar/spec/features/calendar_widget_spec.rb b/modules/calendar/spec/features/calendar_widget_spec.rb index c8e9c105fcd6..ae527265e45b 100644 --- a/modules/calendar/spec/features/calendar_widget_spec.rb +++ b/modules/calendar/spec/features/calendar_widget_spec.rb @@ -30,7 +30,7 @@ require_relative "../../../overviews/spec/support/pages/overview" require_relative "../support/pages/calendar" -RSpec.describe "Calendar Widget", :js, :with_cuprite, with_settings: { start_of_week: 1 } do +RSpec.describe "Calendar Widget", :js, with_settings: { start_of_week: 1 } do shared_let(:project) do create(:project, enabled_module_names: %w[work_package_tracking calendar_view meetings]) end @@ -61,7 +61,7 @@ login_as(current_user) overview_page.visit! - wait_for_network_idle if RSpec.current_example.metadata[:with_cuprite] + wait_for_network_idle if using_cuprite? # within top-left area, add an additional widget overview_page.add_widget(1, 1, :row, "Calendar") @@ -107,7 +107,7 @@ expect(page).to have_text("Overview") end - it "can resize the same work package twice (Regression #48333)", with_cuprite: false do + it "can resize the same work package twice (Regression #48333)", :selenium do expect(page).to have_css(".fc-event-title", text: work_package.subject) calendar.resize_date(work_package, work_package.due_date - 1.day) diff --git a/modules/calendar/spec/features/calendars_global_create_spec.rb b/modules/calendar/spec/features/calendars_global_create_spec.rb index b87f8b9f7680..e9b89615ed5b 100644 --- a/modules/calendar/spec/features/calendars_global_create_spec.rb +++ b/modules/calendar/spec/features/calendars_global_create_spec.rb @@ -34,8 +34,7 @@ RSpec.describe "Calendar", "Creating a view from a Global Context", - :js, - :with_cuprite do + :js do include_context "with calendar full access" let(:calendars_page) { Pages::Calendar.new nil } diff --git a/modules/calendar/spec/features/calendars_index_spec.rb b/modules/calendar/spec/features/calendars_index_spec.rb index a3b74983f87f..cfc5bf34281f 100644 --- a/modules/calendar/spec/features/calendars_index_spec.rb +++ b/modules/calendar/spec/features/calendars_index_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../support/pages/calendar" -RSpec.describe "Calendars", "index", :with_cuprite do +RSpec.describe "Calendars", "index" do # The order the Projects are created in is important. By naming `project` alphanumerically # after `other_project`, we can ensure that subsequent specs that assert sorting is # correct for the right reasons (sorting by Project name and not id) diff --git a/modules/github_integration/spec/features/work_package_activity_spec.rb b/modules/github_integration/spec/features/work_package_activity_spec.rb index 4110d1a79282..43cb74767314 100644 --- a/modules/github_integration/spec/features/work_package_activity_spec.rb +++ b/modules/github_integration/spec/features/work_package_activity_spec.rb @@ -4,8 +4,7 @@ RSpec.describe "Work Package Activity Tab", "Comments by Github", - :js, - :with_cuprite do + :js do shared_let(:github_system_user) { create(:admin, firstname: "Github", lastname: "System User") } shared_let(:admin) { create(:admin) } diff --git a/modules/gitlab_integration/spec/features/work_package_gitlab_issue_activity_spec.rb b/modules/gitlab_integration/spec/features/work_package_gitlab_issue_activity_spec.rb index 858596c24570..dabb3ba0afc3 100644 --- a/modules/gitlab_integration/spec/features/work_package_gitlab_issue_activity_spec.rb +++ b/modules/gitlab_integration/spec/features/work_package_gitlab_issue_activity_spec.rb @@ -4,8 +4,7 @@ RSpec.describe "Work Package Activity Tab", "Comments by Gitlab", - :js, - :with_cuprite do + :js do shared_let(:gitlab_system_user) { create(:admin, firstname: "Gitlab", lastname: "System User") } shared_let(:admin) { create(:admin) } diff --git a/modules/gitlab_integration/spec/features/work_package_gitlab_merge_request_activity_spec.rb b/modules/gitlab_integration/spec/features/work_package_gitlab_merge_request_activity_spec.rb index 76ec3815e85a..a9c24e0df6ea 100644 --- a/modules/gitlab_integration/spec/features/work_package_gitlab_merge_request_activity_spec.rb +++ b/modules/gitlab_integration/spec/features/work_package_gitlab_merge_request_activity_spec.rb @@ -4,8 +4,7 @@ RSpec.describe "Work Package Activity Tab", "Comments by Gitlab", - :js, - :with_cuprite do + :js do shared_let(:gitlab_system_user) { create(:admin, firstname: "Gitlab", lastname: "System User") } shared_let(:admin) { create(:admin) } diff --git a/modules/meeting/spec/features/meetings_attachments_spec.rb b/modules/meeting/spec/features/meetings_attachments_spec.rb index dda82d448119..2f5ef62be83c 100644 --- a/modules/meeting/spec/features/meetings_attachments_spec.rb +++ b/modules/meeting/spec/features/meetings_attachments_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "Add an attachment to a meeting (agenda)", :js, with_cuprite: false do +RSpec.describe "Add an attachment to a meeting (agenda)", :js, :selenium do let(:role) do create(:project_role, permissions: %i[view_meetings edit_meetings create_meeting_agendas]) end diff --git a/modules/meeting/spec/features/meetings_close_spec.rb b/modules/meeting/spec/features/meetings_close_spec.rb index 46b1351e5e7c..d0222f0792c6 100644 --- a/modules/meeting/spec/features/meetings_close_spec.rb +++ b/modules/meeting/spec/features/meetings_close_spec.rb @@ -47,8 +47,7 @@ end context "with permission to close meetings", - :js, - :with_cuprite do + :js do let(:permissions) { %i[view_meetings close_meeting_agendas] } it "can delete own and other`s meetings" do diff --git a/modules/meeting/spec/features/meetings_copy_spec.rb b/modules/meeting/spec/features/meetings_copy_spec.rb index d91af8c150c5..a9432727d418 100644 --- a/modules/meeting/spec/features/meetings_copy_spec.rb +++ b/modules/meeting/spec/features/meetings_copy_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Meetings copy", :js, :with_cuprite do +RSpec.describe "Meetings copy", :js do shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) } shared_let(:permissions) { %i[view_meetings create_meetings] } shared_let(:user) do diff --git a/modules/meeting/spec/features/meetings_global_menu_item_spec.rb b/modules/meeting/spec/features/meetings_global_menu_item_spec.rb index 85af3945cc1e..91ce440c7ff1 100644 --- a/modules/meeting/spec/features/meetings_global_menu_item_spec.rb +++ b/modules/meeting/spec/features/meetings_global_menu_item_spec.rb @@ -33,8 +33,7 @@ require_relative "../support/pages/meetings/index" RSpec.describe "Meetings global menu item", - :js, - :with_cuprite do + :js do shared_let(:user_without_permissions) { create(:user) } shared_let(:admin) { create(:admin) } shared_let(:project) { create(:project) } diff --git a/modules/meeting/spec/features/meetings_index_spec.rb b/modules/meeting/spec/features/meetings_index_spec.rb index c585368a9d5c..21dbb68b19a8 100644 --- a/modules/meeting/spec/features/meetings_index_spec.rb +++ b/modules/meeting/spec/features/meetings_index_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/meetings/index" -RSpec.describe "Meetings", "Index", :js, :with_cuprite do +RSpec.describe "Meetings", "Index", :js do # The order the Projects are created in is important. By naming `project` alphanumerically # after `other_project`, we can ensure that subsequent specs that assert sorting is # correct for the right reasons (sorting by Project name and not id) diff --git a/modules/meeting/spec/features/meetings_new_spec.rb b/modules/meeting/spec/features/meetings_new_spec.rb index e43c4f02b1e9..a15200032926 100644 --- a/modules/meeting/spec/features/meetings_new_spec.rb +++ b/modules/meeting/spec/features/meetings_new_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/meetings/index" -RSpec.describe "Meetings new", :js, :with_cuprite do +RSpec.describe "Meetings new", :js do shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) } shared_let(:admin) { create(:admin) } let(:time_zone) { "Etc/UTC" } @@ -65,12 +65,12 @@ let(:new_page) { Pages::Meetings::New.new(nil) } context "with permission to create meetings" do - it "does not render menus", :with_cuprite do + it "does not render menus"do new_page.visit! new_page.expect_no_main_menu end - describe "clicking on the create new meeting button", :with_cuprite do + describe "clicking on the create new meeting button"do it "navigates to the global create form" do index_page.visit! index_page.click_create_new @@ -149,7 +149,7 @@ end end - context "without permission to create meetings", :with_cuprite do + context "without permission to create meetings"do let(:permissions) { %i[view_meetings] } it "shows no edit link" do @@ -159,7 +159,7 @@ end end - context "as an admin", :with_cuprite do + context "as an admin"do let(:current_user) { admin } it "allows creating meeting in a project without members" do @@ -226,7 +226,7 @@ other_user end - describe "clicking on the create new meeting button", :with_cuprite do + describe "clicking on the create new meeting button"do it "navigates to the project-specific create form" do index_page.visit! index_page.click_create_new @@ -276,7 +276,7 @@ end end - context "without permission to create meetings", :with_cuprite do + context "without permission to create meetings"do let(:permissions) { %i[view_meetings] } it "shows no edit link" do @@ -286,7 +286,7 @@ end end - context "as an admin", :with_cuprite do + context "as an admin"do let(:current_user) { admin } let(:field) do TextEditorField.new(page, diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb index 72629e50242c..f2daa6ed7a9f 100644 --- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb @@ -35,7 +35,6 @@ RSpec.describe "Recurring meetings creation", :js, - :with_cuprite, with_flag: { recurring_meetings: true } do include Components::Autocompleter::NgSelectAutocompleteHelpers diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb index 2be981d3ef9e..5c2784ac7abd 100644 --- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_crud_spec.rb @@ -35,7 +35,6 @@ RSpec.describe "Recurring meetings CRUD", :js, - :with_cuprite, with_flag: { recurring_meetings: true } do include Components::Autocompleter::NgSelectAutocompleteHelpers diff --git a/modules/meeting/spec/features/structured_meetings/history_spec.rb b/modules/meeting/spec/features/structured_meetings/history_spec.rb index cebda965037d..8eb5f719316f 100644 --- a/modules/meeting/spec/features/structured_meetings/history_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/history_spec.rb @@ -33,8 +33,7 @@ require_relative "../../support/pages/structured_meeting/history" RSpec.describe "history", - :js, - :with_cuprite do + :js do include Components::Autocompleter::NgSelectAutocompleteHelpers include Redmine::I18n diff --git a/modules/meeting/spec/features/structured_meetings/mobile_structure_meeting_spec.rb b/modules/meeting/spec/features/structured_meetings/mobile_structure_meeting_spec.rb index 6f90d085d158..2ab394e5b20c 100644 --- a/modules/meeting/spec/features/structured_meetings/mobile_structure_meeting_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/mobile_structure_meeting_spec.rb @@ -31,8 +31,7 @@ require_relative "../../support/pages/structured_meeting//mobile/show" RSpec.describe "Structured meetings CRUD", - :js, - :with_cuprite do + :js do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:project) { create(:project, enabled_module_names: %w[meetings work_package_tracking]) } diff --git a/modules/meeting/spec/features/structured_meetings/structured_meeting_crud_spec.rb b/modules/meeting/spec/features/structured_meetings/structured_meeting_crud_spec.rb index c762251f9a59..8c6d89c72fc9 100644 --- a/modules/meeting/spec/features/structured_meetings/structured_meeting_crud_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/structured_meeting_crud_spec.rb @@ -34,7 +34,6 @@ RSpec.describe "Structured meetings CRUD", :js, - :with_cuprite, with_flag: { recurring_meetings: true } do include Components::Autocompleter::NgSelectAutocompleteHelpers diff --git a/modules/meeting/spec/features/structured_meetings/structured_meeting_participant_spec.rb b/modules/meeting/spec/features/structured_meetings/structured_meeting_participant_spec.rb index 5eba946db7b5..2d10037a2710 100644 --- a/modules/meeting/spec/features/structured_meetings/structured_meeting_participant_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/structured_meeting_participant_spec.rb @@ -31,8 +31,7 @@ require_relative "../../support/pages/structured_meeting//mobile/show" RSpec.describe "Structured meetings participants", - :js, - :with_cuprite do + :js do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:project) { create(:project, enabled_module_names: %w[meetings work_package_tracking]) } diff --git a/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb b/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb index 6d7e479a5aca..7d7479374d53 100644 --- a/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/structured_meeting_update_flash_spec.rb @@ -33,7 +33,7 @@ RSpec.describe "Structured meetings CRUD", :js, - with_cuprite: false do + :selenium do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:project) { create(:project, enabled_module_names: %w[meetings work_package_tracking]) } diff --git a/modules/meeting/spec/features/structured_meetings/turbo_links_spec.rb b/modules/meeting/spec/features/structured_meetings/turbo_links_spec.rb index 7eb01c1d3c9f..4ac1ca24206d 100644 --- a/modules/meeting/spec/features/structured_meetings/turbo_links_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/turbo_links_spec.rb @@ -32,8 +32,7 @@ require_relative "../../support/pages/structured_meeting/show" RSpec.describe "Structured meetings links caught by turbo", - :js, - :with_cuprite do + :js do include Rails.application.routes.url_helpers shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) } diff --git a/modules/meeting/spec/features/structured_meetings/work_package_meetings_tab_spec.rb b/modules/meeting/spec/features/structured_meetings/work_package_meetings_tab_spec.rb index cef6c8721316..58c295a8d600 100644 --- a/modules/meeting/spec/features/structured_meetings/work_package_meetings_tab_spec.rb +++ b/modules/meeting/spec/features/structured_meetings/work_package_meetings_tab_spec.rb @@ -31,8 +31,7 @@ require_relative "../../support/pages/structured_meeting/show" RSpec.describe "Open the Meetings tab", - :js, - :with_cuprite do + :js do shared_let(:project) { create(:project) } shared_let(:work_package) { create(:work_package, project:, subject: "A test work_package") } @@ -260,7 +259,7 @@ meeting_containers = page .all("[data-test-selector^='op-meeting-container-']") - .map { |container| container["data-test-selector"] } # rubocop:disable Rails/Pluck + .map { |container| container["data-test-selector"] } expect(meeting_containers).to contain_exactly("op-meeting-container-#{first_meeting.id}", "op-meeting-container-#{second_meeting.id}") end diff --git a/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb b/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb index ab1f0cd42cac..33fca964ac5c 100644 --- a/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb +++ b/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb @@ -30,8 +30,7 @@ require_module_spec_helper RSpec.describe "OIDC administration CRUD", - :js, - :with_cuprite do + :js do shared_let(:user) { create(:admin) } let(:danger_zone) { DangerZone.new(page) } diff --git a/modules/reporting/spec/features/calculations_spec.rb b/modules/reporting/spec/features/calculations_spec.rb index dd4d1f94a6a1..54f8d7ef232c 100644 --- a/modules/reporting/spec/features/calculations_spec.rb +++ b/modules/reporting/spec/features/calculations_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Cost Report", "calculations", :js, :with_cuprite do +RSpec.describe "Cost Report", "calculations", :js do let(:project) { create(:project) } let(:user) { create(:admin) } let(:work_package) { create(:work_package, project:) } diff --git a/modules/reporting/spec/features/filter_spec.rb b/modules/reporting/spec/features/filter_spec.rb index f3466494374d..21b52eb34224 100644 --- a/modules/reporting/spec/features/filter_spec.rb +++ b/modules/reporting/spec/features/filter_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Cost report calculations", :js, :with_cuprite do +RSpec.describe "Cost report calculations", :js do let(:project) { create(:project) } let(:user) { create(:admin) } diff --git a/modules/reporting/spec/features/group_by_spec.rb b/modules/reporting/spec/features/group_by_spec.rb index 5d41ed4b7364..a71f6bfb7a22 100644 --- a/modules/reporting/spec/features/group_by_spec.rb +++ b/modules/reporting/spec/features/group_by_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require_relative "support/pages/cost_report_page" -RSpec.describe "Cost report calculations", "grouping", :js, :with_cuprite do +RSpec.describe "Cost report calculations", "grouping", :js do let(:project) { create(:project) } let(:user) { create(:admin) } let(:work_package) { create(:work_package, project:) } diff --git a/modules/reporting/spec/features/main_menu_item_spec.rb b/modules/reporting/spec/features/main_menu_item_spec.rb index 8a8aed930998..ddf722f7a258 100644 --- a/modules/reporting/spec/features/main_menu_item_spec.rb +++ b/modules/reporting/spec/features/main_menu_item_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" -RSpec.describe "Cost and Reports Main Menu Item", :js, :with_cuprite do +RSpec.describe "Cost and Reports Main Menu Item", :js do shared_let(:admin) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:user_with_permissions) { create(:user, member_with_permissions: { project => %i[view_time_entries] }) } diff --git a/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb b/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb index 449864b85625..ee455bcb96bf 100644 --- a/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb +++ b/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb @@ -33,7 +33,7 @@ # Test if the deletion of a ProjectStorage actually deletes related FileLink # objects. -RSpec.describe "Delete ProjectStorage with FileLinks", :js, :webmock, :with_cuprite do +RSpec.describe "Delete ProjectStorage with FileLinks", :js, :webmock do let(:user) { create(:user) } let(:role) { create(:project_role, permissions: [:manage_files_in_project]) } let(:project) do diff --git a/modules/storages/spec/features/hide_attachments_spec.rb b/modules/storages/spec/features/hide_attachments_spec.rb index 42eb4f3bfdae..33b28bf7e2bb 100644 --- a/modules/storages/spec/features/hide_attachments_spec.rb +++ b/modules/storages/spec/features/hide_attachments_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" require_module_spec_helper -RSpec.describe "Hide attachments", :js, :with_cuprite do +RSpec.describe "Hide attachments", :js do let(:permissions) do %i(add_work_packages manage_files_in_project diff --git a/modules/storages/spec/features/manage_project_storage_spec.rb b/modules/storages/spec/features/manage_project_storage_spec.rb index 0c8207c6440a..174881483e1b 100644 --- a/modules/storages/spec/features/manage_project_storage_spec.rb +++ b/modules/storages/spec/features/manage_project_storage_spec.rb @@ -38,8 +38,7 @@ # We decrease the notification polling interval because some portions of the JS code rely on something triggering # the Angular change detection. This is usually done by the notification polling, but we don't want to wait RSpec.describe("Activation of storages in projects", - :js, :oauth_connection_helpers, :storage_server_helpers, :webmock, :with_cuprite, - with_settings: { notifications_polling_interval: 1_000 }) do + :js, :oauth_connection_helpers, :storage_server_helpers, :webmock, with_settings: { notifications_polling_interval: 1_000 }) do let(:user) { create(:user) } # The first page is the Project -> Settings -> General page, so we need # to provide the user with the edit_project permission in the role. diff --git a/modules/storages/spec/features/storages/admin/project_storages_spec.rb b/modules/storages/spec/features/storages/admin/project_storages_spec.rb index b7d727f4eeb3..9b00d78a9d84 100644 --- a/modules/storages/spec/features/storages/admin/project_storages_spec.rb +++ b/modules/storages/spec/features/storages/admin/project_storages_spec.rb @@ -34,8 +34,7 @@ # We decrease the notification polling interval because some portions of the JS code rely on something triggering # the Angular change detection. This is usually done by the notification polling, but we don't want to wait RSpec.describe "Admin lists project mappings for a storage", - :js, :storage_server_helpers, :webmock, :with_cuprite, - with_settings: { notifications_polling_interval: 1_000 } do + :js, :storage_server_helpers, :webmock, with_settings: { notifications_polling_interval: 1_000 } do shared_let(:admin) { create(:admin, preferences: { time_zone: "Etc/UTC" }) } shared_let(:non_admin) { create(:user) } diff --git a/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb b/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb index 3ce40c33f4c3..711b96a5744f 100644 --- a/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb +++ b/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb @@ -31,7 +31,7 @@ RSpec.describe "team planner onboarding tour", :js, - with_cuprite: false, + :selenium, with_ee: %i[team_planner_view], # We decrease the notification polling interval because some portions # of the JS code rely on something triggering the Angular change detection. diff --git a/modules/team_planner/spec/features/query_handling_spec.rb b/modules/team_planner/spec/features/query_handling_spec.rb index 3a9b71757b7c..348cc84ecd79 100644 --- a/modules/team_planner/spec/features/query_handling_spec.rb +++ b/modules/team_planner/spec/features/query_handling_spec.rb @@ -32,7 +32,7 @@ require_relative "../support/pages/team_planner" require_relative "../../../../spec/features/views/shared_examples" -RSpec.describe "Team planner query handling", :js, :with_cuprite, with_ee: %i[team_planner_view] do +RSpec.describe "Team planner query handling", :js, with_ee: %i[team_planner_view] do shared_let(:standard) { create(:standard_global_role) } shared_let(:type_task) { create(:type_task) } shared_let(:type_bug) { create(:type_bug) } diff --git a/modules/team_planner/spec/features/team_planner_global_create_spec.rb b/modules/team_planner/spec/features/team_planner_global_create_spec.rb index 91ac826a7c21..ed237bbe4034 100644 --- a/modules/team_planner/spec/features/team_planner_global_create_spec.rb +++ b/modules/team_planner/spec/features/team_planner_global_create_spec.rb @@ -34,7 +34,6 @@ RSpec.describe "Team Planner", "Creating a view from a Global Context", :js, - :with_cuprite, with_ee: %i[team_planner_view] do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_index_spec.rb b/modules/team_planner/spec/features/team_planner_index_spec.rb index 6e4994fe72ea..b9d8aed59ce8 100644 --- a/modules/team_planner/spec/features/team_planner_index_spec.rb +++ b/modules/team_planner/spec/features/team_planner_index_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner index", :js, :with_cuprite, with_ee: %i[team_planner_view] do +RSpec.describe "Team planner index", :js, with_ee: %i[team_planner_view] do shared_let(:project) do create(:project) end diff --git a/modules/team_planner/spec/features/team_planner_menu_spec.rb b/modules/team_planner/spec/features/team_planner_menu_spec.rb index 543a7721928e..c8f157af449c 100644 --- a/modules/team_planner/spec/features/team_planner_menu_spec.rb +++ b/modules/team_planner/spec/features/team_planner_menu_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Team planner Menu Item", :js, :with_cuprite do +RSpec.describe "Team planner Menu Item", :js do shared_let(:project) do create(:project, enabled_module_names: %w[work_package_tracking team_planner_view]) end diff --git a/modules/team_planner/spec/features/team_planner_overview_spec.rb b/modules/team_planner/spec/features/team_planner_overview_spec.rb index 7301813570db..6848f6360b36 100644 --- a/modules/team_planner/spec/features/team_planner_overview_spec.rb +++ b/modules/team_planner/spec/features/team_planner_overview_spec.rb @@ -33,7 +33,6 @@ require_relative "shared_context" RSpec.describe "Team planner overview", - :with_cuprite, with_ee: %i[team_planner_view] do # The order the Projects are created in is important. By naming `project` alphanumerically # after `other_project`, we can ensure that subsequent specs that assert sorting is diff --git a/modules/team_planner/spec/features/team_planner_upsale_spec.rb b/modules/team_planner/spec/features/team_planner_upsale_spec.rb index 81bf688aa86e..ec848007220f 100644 --- a/modules/team_planner/spec/features/team_planner_upsale_spec.rb +++ b/modules/team_planner/spec/features/team_planner_upsale_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner index", :js, :with_cuprite do +RSpec.describe "Team planner index", :js do include_context "with team planner full access" let(:current_user) { user } diff --git a/modules/two_factor_authentication/spec/features/account_activation_spec.rb b/modules/two_factor_authentication/spec/features/account_activation_spec.rb index a9a2a406c0c8..5f48bd397108 100644 --- a/modules/two_factor_authentication/spec/features/account_activation_spec.rb +++ b/modules/two_factor_authentication/spec/features/account_activation_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "activating an invited account", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => [:developer] } } do diff --git a/modules/two_factor_authentication/spec/features/backup_codes/login_with_backup_code_spec.rb b/modules/two_factor_authentication/spec/features/backup_codes/login_with_backup_code_spec.rb index f858e7f7aae1..49f20c26e90b 100644 --- a/modules/two_factor_authentication/spec/features/backup_codes/login_with_backup_code_spec.rb +++ b/modules/two_factor_authentication/spec/features/backup_codes/login_with_backup_code_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Login with 2FA backup code", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => [:developer] } } do diff --git a/modules/two_factor_authentication/spec/features/login/login_enforced_2fa_spec.rb b/modules/two_factor_authentication/spec/features/login/login_enforced_2fa_spec.rb index 1e2dc96b06c7..01cb543d5250 100644 --- a/modules/two_factor_authentication/spec/features/login/login_enforced_2fa_spec.rb +++ b/modules/two_factor_authentication/spec/features/login/login_enforced_2fa_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Login with enforced 2FA", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => [:developer], diff --git a/modules/two_factor_authentication/spec/features/login/login_with_2fa_spec.rb b/modules/two_factor_authentication/spec/features/login/login_with_2fa_spec.rb index 3b38562cad37..0e0b099067f4 100644 --- a/modules/two_factor_authentication/spec/features/login/login_with_2fa_spec.rb +++ b/modules/two_factor_authentication/spec/features/login/login_with_2fa_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Login with 2FA device", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => [:developer] diff --git a/modules/two_factor_authentication/spec/features/login/login_with_deleted_2fa_spec.rb b/modules/two_factor_authentication/spec/features/login/login_with_deleted_2fa_spec.rb index 6eed2c36addc..56a3b7487396 100644 --- a/modules/two_factor_authentication/spec/features/login/login_with_deleted_2fa_spec.rb +++ b/modules/two_factor_authentication/spec/features/login/login_with_deleted_2fa_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Login after 2FA deleted 2FA was deleted (REGRESSION)", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => %i[developer totp] diff --git a/modules/two_factor_authentication/spec/features/login/login_without_2fa_spec.rb b/modules/two_factor_authentication/spec/features/login/login_without_2fa_spec.rb index f68745efbd87..6ae5091bce34 100644 --- a/modules/two_factor_authentication/spec/features/login/login_without_2fa_spec.rb +++ b/modules/two_factor_authentication/spec/features/login/login_without_2fa_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Login with no required OTP", :js, - :with_cuprite, with_config: { "2fa": { active_strategies: [:developer] } } do include SharedTwoFactorExamples let(:user_password) { "bob!" * 4 } diff --git a/modules/two_factor_authentication/spec/features/login/switch_available_devices_spec.rb b/modules/two_factor_authentication/spec/features/login/switch_available_devices_spec.rb index a5ff551ac6ce..070f751864e9 100644 --- a/modules/two_factor_authentication/spec/features/login/switch_available_devices_spec.rb +++ b/modules/two_factor_authentication/spec/features/login/switch_available_devices_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Login by switching 2FA device", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => %i[developer totp] } } do diff --git a/modules/two_factor_authentication/spec/features/my_two_factor_devices_spec.rb b/modules/two_factor_authentication/spec/features/my_two_factor_devices_spec.rb index ae343baaa2a2..e14e3c8e7b4b 100644 --- a/modules/two_factor_authentication/spec/features/my_two_factor_devices_spec.rb +++ b/modules/two_factor_authentication/spec/features/my_two_factor_devices_spec.rb @@ -2,7 +2,6 @@ RSpec.describe "My Account 2FA configuration", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => %i[developer totp] } } do diff --git a/modules/two_factor_authentication/spec/features/remember_cookie/login_with_remember_cookie_spec.rb b/modules/two_factor_authentication/spec/features/remember_cookie/login_with_remember_cookie_spec.rb index c936c8d58c9c..60a0a7c928ef 100644 --- a/modules/two_factor_authentication/spec/features/remember_cookie/login_with_remember_cookie_spec.rb +++ b/modules/two_factor_authentication/spec/features/remember_cookie/login_with_remember_cookie_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Login with 2FA remember cookie", :js, - :with_cuprite, with_settings: { plugin_openproject_two_factor_authentication: { active_strategies: [:developer], diff --git a/spec/features/a11y/work_packages/alternative_name_autcompleting_spec.rb b/spec/features/a11y/work_packages/alternative_name_autcompleting_spec.rb index 04c654ab0568..85b88b0fcd87 100644 --- a/spec/features/a11y/work_packages/alternative_name_autcompleting_spec.rb +++ b/spec/features/a11y/work_packages/alternative_name_autcompleting_spec.rb @@ -31,8 +31,7 @@ require "spec_helper" RSpec.describe "Alternative name autocompleting", - :js, - :with_cuprite do + :js do let!(:project) { create(:project_with_types) } let!(:work_package) { create(:work_package, project:) } let!(:user) { create(:admin) } diff --git a/spec/features/activities/activity_page_navigation_spec.rb b/spec/features/activities/activity_page_navigation_spec.rb index 7f7f91cdfd15..dd984f48f7da 100644 --- a/spec/features/activities/activity_page_navigation_spec.rb +++ b/spec/features/activities/activity_page_navigation_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Activity page navigation", :js, :with_cuprite do +RSpec.describe "Activity page navigation", :js do shared_let(:project) { create(:project, enabled_module_names: Setting.default_projects_modules + ["activity"]) } shared_let(:subproject) do create(:project, parent: project, enabled_module_names: Setting.default_projects_modules + ["activity"]) diff --git a/spec/features/activities/disabled_activity_spec.rb b/spec/features/activities/disabled_activity_spec.rb index 85fd3e53bc2f..261d4a4289b1 100644 --- a/spec/features/activities/disabled_activity_spec.rb +++ b/spec/features/activities/disabled_activity_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Disabled activity", :js, :with_cuprite do +RSpec.describe "Disabled activity", :js do shared_let(:admin) { create(:admin) } let(:project1) do diff --git a/spec/features/activities/project_attributes_activity_spec.rb b/spec/features/activities/project_attributes_activity_spec.rb index 4617713e1abe..57605a2c64dd 100644 --- a/spec/features/activities/project_attributes_activity_spec.rb +++ b/spec/features/activities/project_attributes_activity_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Project attributes activity", :js, :with_cuprite do +RSpec.describe "Project attributes activity", :js do let(:user) do create(:user, member_with_permissions: { project => %i[view_work_packages edit_work_packages], diff --git a/spec/features/activities/time_entry_activity_spec.rb b/spec/features/activities/time_entry_activity_spec.rb index e81de0f9b347..c4eb1229b5a1 100644 --- a/spec/features/activities/time_entry_activity_spec.rb +++ b/spec/features/activities/time_entry_activity_spec.rb @@ -30,7 +30,6 @@ RSpec.describe "TimeEntry activity", :js, - :with_cuprite, with_settings: { journal_aggregation_time_minutes: 0 } do let(:user) do create(:user, diff --git a/spec/features/activities/wiki_activity_spec.rb b/spec/features/activities/wiki_activity_spec.rb index a25c5eb82269..42106890b3cf 100644 --- a/spec/features/activities/wiki_activity_spec.rb +++ b/spec/features/activities/wiki_activity_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Wiki Activity", :js, :with_cuprite do +RSpec.describe "Wiki Activity", :js do let(:user) do create(:user, member_with_permissions: { project => %i[view_wiki_pages diff --git a/spec/features/activities/work_package/activities_spec.rb b/spec/features/activities/work_package/activities_spec.rb index 0b00261c4d60..83e1b3a5f856 100644 --- a/spec/features/activities/work_package/activities_spec.rb +++ b/spec/features/activities/work_package/activities_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "support/flash/expectations" -RSpec.describe "Work package activity", :js, :with_cuprite, with_flag: { primerized_work_package_activities: true } do +RSpec.describe "Work package activity", :js, with_flag: { primerized_work_package_activities: true } do include Flash::Expectations let(:project) { create(:project) } @@ -959,7 +959,8 @@ end describe "images in the comment", - with_cuprite: false, + :js, + :selenium, with_settings: { journal_aggregation_time_minutes: 0, show_work_package_attachments: false } do let(:work_package) { create(:work_package, project:, author: admin) } let(:image_fixture) { UploadedFile.load_from("spec/fixtures/files/image.png") } diff --git a/spec/features/activities/work_package/emoji_reactions_spec.rb b/spec/features/activities/work_package/emoji_reactions_spec.rb index ac64940a4291..4131d567f3e2 100644 --- a/spec/features/activities/work_package/emoji_reactions_spec.rb +++ b/spec/features/activities/work_package/emoji_reactions_spec.rb @@ -28,8 +28,7 @@ require "spec_helper" -RSpec.describe "Emoji reactions on work package activity", :js, :with_cuprite, - with_flag: { primerized_work_package_activities: true } do +RSpec.describe "Emoji reactions on work package activity", :js, with_flag: { primerized_work_package_activities: true } do let(:project) { create(:project) } let(:admin) { create(:admin) } let(:member) { create_user_as_project_member } diff --git a/spec/features/activities/work_package_activity_spec.rb b/spec/features/activities/work_package_activity_spec.rb index 2d4731487e2a..aa001271dfd0 100644 --- a/spec/features/activities/work_package_activity_spec.rb +++ b/spec/features/activities/work_package_activity_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Work package activity", :js, :with_cuprite do +RSpec.describe "Work package activity", :js do shared_let(:admin) { create(:admin) } shared_let(:project) { create(:project) } diff --git a/spec/features/admin/attachments/quarantined_attachments_spec.rb b/spec/features/admin/attachments/quarantined_attachments_spec.rb index 92a7f2cec795..cd325bb25b0b 100644 --- a/spec/features/admin/attachments/quarantined_attachments_spec.rb +++ b/spec/features/admin/attachments/quarantined_attachments_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Quarantined attachments", :js, :with_cuprite do +RSpec.describe "Quarantined attachments", :js do shared_let(:other_author) { create(:user) } shared_let(:admin) { create(:admin) } diff --git a/spec/features/admin/attribute_help_texts_spec.rb b/spec/features/admin/attribute_help_texts_spec.rb index 76384e96855b..a53cb7b63774 100644 --- a/spec/features/admin/attribute_help_texts_spec.rb +++ b/spec/features/admin/attribute_help_texts_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Attribute help texts", :js, :with_cuprite do +RSpec.describe "Attribute help texts", :js do shared_let(:user_with_permission) { create(:user, global_permissions: [:edit_attribute_help_texts]) } let(:instance) { AttributeHelpText.last } @@ -44,7 +44,7 @@ end # TODO: Migrate to cuprite when the `better_cuprite_billy` driver is added - context "with direct uploads (Regression #34285)", :with_direct_uploads, with_cuprite: false do + context "with direct uploads (Regression #34285)", :with_direct_uploads, :selenium do before do allow_any_instance_of(Attachment).to receive(:diskfile).and_return image_fixture end diff --git a/spec/features/admin/custom_fields/link_custom_field_spec.rb b/spec/features/admin/custom_fields/link_custom_field_spec.rb index a98b3ce64dae..d9dd57a8cbcd 100644 --- a/spec/features/admin/custom_fields/link_custom_field_spec.rb +++ b/spec/features/admin/custom_fields/link_custom_field_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Link custom fields edit", :js, :with_cuprite do +RSpec.describe "Link custom fields edit", :js do shared_let(:admin) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } diff --git a/spec/features/admin/custom_fields/list_custom_field_spec.rb b/spec/features/admin/custom_fields/list_custom_field_spec.rb index 0944df4e67b2..6907049259d8 100644 --- a/spec/features/admin/custom_fields/list_custom_field_spec.rb +++ b/spec/features/admin/custom_fields/list_custom_field_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "List custom fields edit", :js, :with_cuprite do +RSpec.describe "List custom fields edit", :js do shared_let(:admin) { create(:admin) } before do diff --git a/spec/features/admin/custom_fields/user_custom_field_spec.rb b/spec/features/admin/custom_fields/user_custom_field_spec.rb index 146c5def776f..8b133196c8d7 100644 --- a/spec/features/admin/custom_fields/user_custom_field_spec.rb +++ b/spec/features/admin/custom_fields/user_custom_field_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "User custom fields edit", :js, :with_cuprite do +RSpec.describe "User custom fields edit", :js do shared_let(:admin) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } let(:new_cf_page) { Pages::CustomFields::NewPage.new } diff --git a/spec/features/admin/enterprise/enterprise_spec.rb b/spec/features/admin/enterprise/enterprise_spec.rb index 056713f1f5b6..7d51cd4297e9 100644 --- a/spec/features/admin/enterprise/enterprise_spec.rb +++ b/spec/features/admin/enterprise/enterprise_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Enterprise token", :js, :with_cuprite do +RSpec.describe "Enterprise token", :js do include Redmine::I18n shared_let(:admin) { create(:admin) } diff --git a/spec/features/admin/oauth/oauth_applications_management_spec.rb b/spec/features/admin/oauth/oauth_applications_management_spec.rb index a6e1ad3a4adb..ba2077795f2c 100644 --- a/spec/features/admin/oauth/oauth_applications_management_spec.rb +++ b/spec/features/admin/oauth/oauth_applications_management_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "OAuth applications management", :js, :with_cuprite do +RSpec.describe "OAuth applications management", :js do shared_let(:admin) { create(:admin) } before do diff --git a/spec/features/admin/progress_tracking_spec.rb b/spec/features/admin/progress_tracking_spec.rb index b32ea6c739eb..f343f49d9259 100644 --- a/spec/features/admin/progress_tracking_spec.rb +++ b/spec/features/admin/progress_tracking_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Progress tracking admin page", :js, :with_cuprite do +RSpec.describe "Progress tracking admin page", :js do include ActionView::Helpers::SanitizeHelper include Toasts::Expectations diff --git a/spec/features/admin/project_life_cycle_step_definitions_spec.rb b/spec/features/admin/project_life_cycle_step_definitions_spec.rb index 7b84bd61676f..6f8fefb7c93e 100644 --- a/spec/features/admin/project_life_cycle_step_definitions_spec.rb +++ b/spec/features/admin/project_life_cycle_step_definitions_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Projects life cycle settings", :js, :with_cuprite, with_flag: { stages_and_gates: true } do +RSpec.describe "Projects life cycle settings", :js, with_flag: { stages_and_gates: true } do shared_let(:initiating_stage) { create(:project_stage_definition, name: "Initiating") } shared_let(:ready_to_execute_gate) { create(:project_gate_definition, name: "Ready to Execute") } shared_let(:executing_stage) { create(:project_stage_definition, name: "Executing") } diff --git a/spec/features/admin/statuses_spec.rb b/spec/features/admin/statuses_spec.rb index 2c09f32d07ac..2903505f304e 100644 --- a/spec/features/admin/statuses_spec.rb +++ b/spec/features/admin/statuses_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Statuses admin page", :js, :with_cuprite do +RSpec.describe "Statuses admin page", :js do shared_let(:admin) { create(:admin) } shared_let(:status_new) { create(:status, name: "New", default_done_ratio: 0, is_default: true) } shared_let(:status_in_progress) { create(:status, name: "In Progress", default_done_ratio: 40) } diff --git a/spec/features/admin/test_mail_notification_spec.rb b/spec/features/admin/test_mail_notification_spec.rb index 3acced02cf55..6ed18ea7abb1 100644 --- a/spec/features/admin/test_mail_notification_spec.rb +++ b/spec/features/admin/test_mail_notification_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Test mail notification", :js, :with_cuprite do +RSpec.describe "Test mail notification", :js do shared_let(:admin) { create(:admin) } before do diff --git a/spec/features/admin/working_days_spec.rb b/spec/features/admin/working_days_spec.rb index d1e3627ce518..425d29008939 100644 --- a/spec/features/admin/working_days_spec.rb +++ b/spec/features/admin/working_days_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Working Days", :js, :with_cuprite do +RSpec.describe "Working Days", :js do create_shared_association_defaults_for_work_package_factory shared_let(:week_days) { week_with_saturday_and_sunday_as_weekend } diff --git a/spec/features/auth/logout_spec.rb b/spec/features/auth/logout_spec.rb index 6b32e8f50518..7443d3916359 100644 --- a/spec/features/auth/logout_spec.rb +++ b/spec/features/auth/logout_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Logout", - :js, - :with_cuprite do + :js do let(:user_password) { "b0B" * 4 } let(:user) do create(:user, diff --git a/spec/features/categories/delete_spec.rb b/spec/features/categories/delete_spec.rb index 604020818f53..9e5c0c865ee0 100644 --- a/spec/features/categories/delete_spec.rb +++ b/spec/features/categories/delete_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/categories/categories_page" -RSpec.describe "Deletion", :js, :with_cuprite do +RSpec.describe "Deletion", :js do let(:current_user) do create(:user, member_with_permissions: { category.project => %i[manage_categories] }) diff --git a/spec/features/custom_fields/activate_in_project_spec.rb b/spec/features/custom_fields/activate_in_project_spec.rb index ea6fc23de27a..42814cd8c480 100644 --- a/spec/features/custom_fields/activate_in_project_spec.rb +++ b/spec/features/custom_fields/activate_in_project_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "support/pages/custom_fields/index_page" -RSpec.describe "custom fields", :js, :with_cuprite do +RSpec.describe "custom fields", :js do let(:user) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } let(:for_all_cf) { create(:list_wp_custom_field, is_for_all: true) } diff --git a/spec/features/custom_fields/create_bool_spec.rb b/spec/features/custom_fields/create_bool_spec.rb index 26a97def43fd..39a16d008468 100644 --- a/spec/features/custom_fields/create_bool_spec.rb +++ b/spec/features/custom_fields/create_bool_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/custom_fields/index_page" -RSpec.describe "custom fields", :js, :with_cuprite do +RSpec.describe "custom fields", :js do let(:user) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } diff --git a/spec/features/custom_fields/create_date_spec.rb b/spec/features/custom_fields/create_date_spec.rb index 957d5626ff89..442686e2e265 100644 --- a/spec/features/custom_fields/create_date_spec.rb +++ b/spec/features/custom_fields/create_date_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/custom_fields/index_page" -RSpec.describe "custom fields", :js, :with_cuprite do +RSpec.describe "custom fields", :js do let(:user) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } diff --git a/spec/features/custom_fields/create_float_spec.rb b/spec/features/custom_fields/create_float_spec.rb index 74a97b6e5a77..6c75ca454967 100644 --- a/spec/features/custom_fields/create_float_spec.rb +++ b/spec/features/custom_fields/create_float_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/custom_fields/index_page" -RSpec.describe "custom fields", :js, :with_cuprite do +RSpec.describe "custom fields", :js do let(:user) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } diff --git a/spec/features/custom_fields/create_int_spec.rb b/spec/features/custom_fields/create_int_spec.rb index 951d5138a3b5..9a0dbbeba1a1 100644 --- a/spec/features/custom_fields/create_int_spec.rb +++ b/spec/features/custom_fields/create_int_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/custom_fields/index_page" -RSpec.describe "custom fields", :js, :with_cuprite do +RSpec.describe "custom fields", :js do let(:user) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } diff --git a/spec/features/custom_fields/custom_fields_spec.rb b/spec/features/custom_fields/custom_fields_spec.rb index 8493345e9cc4..381a233a4574 100644 --- a/spec/features/custom_fields/custom_fields_spec.rb +++ b/spec/features/custom_fields/custom_fields_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/custom_fields/index_page" -RSpec.describe "custom fields", :js, :with_cuprite do +RSpec.describe "custom fields", :js do let(:user) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } diff --git a/spec/features/custom_fields/hierarchy_custom_field_spec.rb b/spec/features/custom_fields/hierarchy_custom_field_spec.rb index 37344c95716f..0dadc0a30732 100644 --- a/spec/features/custom_fields/hierarchy_custom_field_spec.rb +++ b/spec/features/custom_fields/hierarchy_custom_field_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "custom fields of type hierarchy", :js, :with_cuprite do +RSpec.describe "custom fields of type hierarchy", :js do let(:admin) { create(:admin) } let(:custom_field_index_page) { Pages::CustomFields::IndexPage.new } let(:new_custom_field_page) { Pages::CustomFields::NewPage.new } diff --git a/spec/features/custom_fields/multi_user_custom_field_spec.rb b/spec/features/custom_fields/multi_user_custom_field_spec.rb index be907db6dd06..6fd9fce87056 100644 --- a/spec/features/custom_fields/multi_user_custom_field_spec.rb +++ b/spec/features/custom_fields/multi_user_custom_field_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/work_packages/abstract_work_package" -RSpec.describe "multi select custom values", :js, :with_cuprite do +RSpec.describe "multi select custom values", :js do shared_let(:admin) { create(:admin) } let(:current_user) { admin } let(:wp_page) { Pages::FullWorkPackage.new work_package } diff --git a/spec/features/custom_fields/multi_value_custom_field_spec.rb b/spec/features/custom_fields/multi_value_custom_field_spec.rb index 7c76b3d59a3b..df5712890348 100644 --- a/spec/features/custom_fields/multi_value_custom_field_spec.rb +++ b/spec/features/custom_fields/multi_value_custom_field_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/work_packages/abstract_work_package" -RSpec.describe "multi select custom values", :js, :with_cuprite do +RSpec.describe "multi select custom values", :js do let(:type) { create(:type) } let(:wp_page) { Pages::FullWorkPackage.new work_package } let(:wp_table) { Pages::WorkPackagesTable.new project } diff --git a/spec/features/custom_fields/non_open_version_custom_field_spec.rb b/spec/features/custom_fields/non_open_version_custom_field_spec.rb index 1ed7bb864c96..1bd49ef4b20f 100644 --- a/spec/features/custom_fields/non_open_version_custom_field_spec.rb +++ b/spec/features/custom_fields/non_open_version_custom_field_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "support/pages/work_packages/abstract_work_package" -RSpec.describe "support for non-open version values in version custom field", :js, :with_cuprite do +RSpec.describe "support for non-open version values in version custom field", :js do shared_let(:admin) { create(:admin) } let(:current_user) { admin } let(:wp_page) { Pages::FullWorkPackage.new work_package } diff --git a/spec/features/global_roles/global_create_project_spec.rb b/spec/features/global_roles/global_create_project_spec.rb index ef9b32d605fa..b37c1878e499 100644 --- a/spec/features/global_roles/global_create_project_spec.rb +++ b/spec/features/global_roles/global_create_project_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Global role: Global Create project", - :js, - :with_cuprite do + :js do shared_let(:admin) { create(:admin) } shared_let(:user) { create(:user) } shared_let(:project) { create(:project) } diff --git a/spec/features/global_roles/global_role_assignment_spec.rb b/spec/features/global_roles/global_role_assignment_spec.rb index 5a98f14ee932..93727a166722 100644 --- a/spec/features/global_roles/global_role_assignment_spec.rb +++ b/spec/features/global_roles/global_role_assignment_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "mock_global_permissions" -RSpec.describe "Global role: Global role assignment", :js, :with_cuprite do +RSpec.describe "Global role: Global role assignment", :js do before do login_as current_user end diff --git a/spec/features/global_roles/global_role_crud_spec.rb b/spec/features/global_roles/global_role_crud_spec.rb index 0731870ec1d1..3b08e59c5abe 100644 --- a/spec/features/global_roles/global_role_crud_spec.rb +++ b/spec/features/global_roles/global_role_crud_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "mock_global_permissions" -RSpec.describe "Global role: Global role CRUD", :js, :with_cuprite do +RSpec.describe "Global role: Global role CRUD", :js do # Scenario: Global Role creation # Given there is the global permission "glob_test" of the module "global_group" include_context "with mocked global permissions", [["glob_test", { project_module: "global_group" }]] diff --git a/spec/features/global_roles/global_role_update_spec.rb b/spec/features/global_roles/global_role_update_spec.rb index 9e5f0be632b1..f30f8f1b95bb 100644 --- a/spec/features/global_roles/global_role_update_spec.rb +++ b/spec/features/global_roles/global_role_update_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Role updating", :js, :with_cuprite do +RSpec.describe "Role updating", :js do let!(:admin) { create(:admin) } before do diff --git a/spec/features/global_roles/member_roles_spec.rb b/spec/features/global_roles/member_roles_spec.rb index b853e6fa11b7..d56312795dd6 100644 --- a/spec/features/global_roles/member_roles_spec.rb +++ b/spec/features/global_roles/member_roles_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Global role: Unchanged Member Roles", :js, :with_cuprite do +RSpec.describe "Global role: Unchanged Member Roles", :js do let(:admin) { create(:admin) } let(:project) { create(:project) } let!(:role) { create(:project_role, name: "MemberRole1") } diff --git a/spec/features/global_roles/no_module_spec.rb b/spec/features/global_roles/no_module_spec.rb index 30461b4e156b..5ef74956d7f6 100644 --- a/spec/features/global_roles/no_module_spec.rb +++ b/spec/features/global_roles/no_module_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "mock_global_permissions" -RSpec.describe "Global role: No module", :js, :with_cuprite do +RSpec.describe "Global role: No module", :js do let(:admin) { create(:admin) } let(:project) { create(:project) } let!(:role) { create(:project_role) } diff --git a/spec/features/groups/group_memberships_spec.rb b/spec/features/groups/group_memberships_spec.rb index 5f5a02909257..937bae7b266d 100644 --- a/spec/features/groups/group_memberships_spec.rb +++ b/spec/features/groups/group_memberships_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "group memberships through groups page", :js, :with_cuprite do +RSpec.describe "group memberships through groups page", :js do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:admin) { create(:admin) } diff --git a/spec/features/groups/groups_spec.rb b/spec/features/groups/groups_spec.rb index 7ecae788f247..e092eeeac670 100644 --- a/spec/features/groups/groups_spec.rb +++ b/spec/features/groups/groups_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "group memberships through groups page", :js, :with_cuprite do +RSpec.describe "group memberships through groups page", :js do shared_let(:admin) { create(:admin) } let!(:group) { create(:group, lastname: "Bob's Team") } diff --git a/spec/features/groups/membership_spec.rb b/spec/features/groups/membership_spec.rb index 5b3c2f71ab6f..0b72a70def68 100644 --- a/spec/features/groups/membership_spec.rb +++ b/spec/features/groups/membership_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "group memberships through project members page", :js, :with_cuprite do +RSpec.describe "group memberships through project members page", :js do shared_let(:admin) { create(:admin) } let(:project) { create(:project, name: "Project 1", identifier: "project1", members: project_member) } diff --git a/spec/features/homescreen/index_spec.rb b/spec/features/homescreen/index_spec.rb index b4d7a6397d67..66a739b24a6a 100644 --- a/spec/features/homescreen/index_spec.rb +++ b/spec/features/homescreen/index_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Homescreen", "index", :with_cuprite do +RSpec.describe "Homescreen", "index" do let(:admin) { create(:admin) } let(:user) { build_stubbed(:user) } let!(:project) { create(:public_project, identifier: "public-project") } diff --git a/spec/features/ldap_auth_sources/crud_spec.rb b/spec/features/ldap_auth_sources/crud_spec.rb index 8cd3985fbfac..4ea374e4d2ee 100644 --- a/spec/features/ldap_auth_sources/crud_spec.rb +++ b/spec/features/ldap_auth_sources/crud_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "CRUD LDAP connections", :js, :with_cuprite do +RSpec.describe "CRUD LDAP connections", :js do shared_let(:admin) { create(:admin) } let(:ldap_page) { Pages::Admin::LdapAuthSources::Index.new } diff --git a/spec/features/members/error_messages_spec.rb b/spec/features/members/error_messages_spec.rb index 21ef0fc04172..170ebea4f28d 100644 --- a/spec/features/members/error_messages_spec.rb +++ b/spec/features/members/error_messages_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Group memberships through groups page", :js, :with_cuprite do +RSpec.describe "Group memberships through groups page", :js do shared_let(:admin) { create(:admin) } let!(:project) { create(:project, name: "Project 1", identifier: "project1") } diff --git a/spec/features/members/invitation_spec.rb b/spec/features/members/invitation_spec.rb index c5c0cf59946b..0e67ac2a3e09 100644 --- a/spec/features/members/invitation_spec.rb +++ b/spec/features/members/invitation_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "invite user via email", :js, :with_cuprite do +RSpec.describe "invite user via email", :js do let!(:project) { create(:project, name: "Project 1", identifier: "project1", members: project_members) } let!(:developer) { create(:project_role, name: "Developer") } let(:project_members) { {} } diff --git a/spec/features/members/membership_filter_spec.rb b/spec/features/members/membership_filter_spec.rb index 6b9c6c3ecbc0..b6b860b1a7a9 100644 --- a/spec/features/members/membership_filter_spec.rb +++ b/spec/features/members/membership_filter_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "group memberships through groups page", - :js, - :with_cuprite do + :js do shared_let(:admin) { create(:admin) } let!(:project) { create(:project, name: "Project 1", identifier: "project1") } diff --git a/spec/features/members/membership_share_spec.rb b/spec/features/members/membership_share_spec.rb index 765eb18a5c09..d9b8635080e2 100644 --- a/spec/features/members/membership_share_spec.rb +++ b/spec/features/members/membership_share_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Shared users in the members table", :js, :with_cuprite do +RSpec.describe "Shared users in the members table", :js do shared_let(:admin) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:role) { create(:project_role, name: "Developer") } diff --git a/spec/features/members/membership_spec.rb b/spec/features/members/membership_spec.rb index 850125f8e771..16a35e4c4a51 100644 --- a/spec/features/members/membership_spec.rb +++ b/spec/features/members/membership_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Administrating memberships via the project settings", :js, :with_cuprite do +RSpec.describe "Administrating memberships via the project settings", :js do shared_let(:admin) { create(:admin) } shared_let(:project) { create(:project) } diff --git a/spec/features/members/pagination_spec.rb b/spec/features/members/pagination_spec.rb index 2a76f71bb12b..9ec496498ba2 100644 --- a/spec/features/members/pagination_spec.rb +++ b/spec/features/members/pagination_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "members pagination", :js, :with_cuprite do +RSpec.describe "members pagination", :js do shared_let(:admin) { create(:admin) } let(:project) do create(:project, diff --git a/spec/features/members/roles_spec.rb b/spec/features/members/roles_spec.rb index 5f08e7b4b51c..d39c2e973ba0 100644 --- a/spec/features/members/roles_spec.rb +++ b/spec/features/members/roles_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Members Role CRUD", :js, :with_cuprite do +RSpec.describe "Members Role CRUD", :js do shared_let(:admin) { create(:admin) } let(:project) do create(:project, diff --git a/spec/features/menu_items/admin_menu_item_spec.rb b/spec/features/menu_items/admin_menu_item_spec.rb index aa12a9916095..2f73efd158c6 100644 --- a/spec/features/menu_items/admin_menu_item_spec.rb +++ b/spec/features/menu_items/admin_menu_item_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Admin menu items", - :js, - :with_cuprite do + :js do shared_let(:user) { create(:admin) } before do diff --git a/spec/features/menu_items/help_menu_spec.rb b/spec/features/menu_items/help_menu_spec.rb index 5bc3537e8b68..d4d27b0bde49 100644 --- a/spec/features/menu_items/help_menu_spec.rb +++ b/spec/features/menu_items/help_menu_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Help menu items", :js, :with_cuprite do +RSpec.describe "Help menu items", :js do let(:user) { create(:admin) } let(:help_item) { find(".op-app-help .op-app-menu--item-action") } let(:help_menu_dropdown_selector) { ".op-app-menu--dropdown.op-menu" } diff --git a/spec/features/menu_items/menu_permissions_spec.rb b/spec/features/menu_items/menu_permissions_spec.rb index b1bceb96f865..f579746c11ec 100644 --- a/spec/features/menu_items/menu_permissions_spec.rb +++ b/spec/features/menu_items/menu_permissions_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "menu permissions", :js, :with_cuprite do +RSpec.describe "menu permissions", :js do let(:user) do create(:user, member_with_permissions: { project => %i[manage_versions view_work_packages] }) diff --git a/spec/features/menu_items/query_menu_item_spec.rb b/spec/features/menu_items/query_menu_item_spec.rb index 98292f74a28f..02bd4c71b4d2 100644 --- a/spec/features/menu_items/query_menu_item_spec.rb +++ b/spec/features/menu_items/query_menu_item_spec.rb @@ -31,7 +31,7 @@ require "features/work_packages/shared_contexts" require "features/work_packages/work_packages_page" -RSpec.describe "Query menu items", :js, :with_cuprite do +RSpec.describe "Query menu items", :js do let(:user) { create(:admin) } let(:project) { create(:project) } let(:work_packages_page) { WorkPackagesPage.new(project) } diff --git a/spec/features/menu_items/quick_add_menu_spec.rb b/spec/features/menu_items/quick_add_menu_spec.rb index 503ca56da99b..357a34d3ee8b 100644 --- a/spec/features/menu_items/quick_add_menu_spec.rb +++ b/spec/features/menu_items/quick_add_menu_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Quick-add menu", :js, :with_cuprite do +RSpec.describe "Quick-add menu", :js do let(:quick_add) { Components::QuickAddMenu.new } context "as a logged in user with add_project permission" do diff --git a/spec/features/menu_items/top_menu_item_spec.rb b/spec/features/menu_items/top_menu_item_spec.rb index 16612c19ad4f..981957cb1ba0 100644 --- a/spec/features/menu_items/top_menu_item_spec.rb +++ b/spec/features/menu_items/top_menu_item_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Top menu items", :js, :with_cuprite do +RSpec.describe "Top menu items", :js do shared_let(:project) { create(:project, public: true) } let(:user) { create(:user) } let(:open_menu) { true } diff --git a/spec/features/menu_items/wiki_menu_item_spec.rb b/spec/features/menu_items/wiki_menu_item_spec.rb index cae148ce995f..94bd3327c4b6 100644 --- a/spec/features/menu_items/wiki_menu_item_spec.rb +++ b/spec/features/menu_items/wiki_menu_item_spec.rb @@ -32,8 +32,7 @@ require "features/work_packages/work_packages_page" RSpec.describe "Wiki menu items", - :js, - :with_cuprite do + :js do let(:user) do create(:user, member_with_permissions: { project => %i[view_wiki_pages @@ -86,7 +85,7 @@ end end - it "allows managing the menu item of a wiki page", :js, :with_cuprite do + it "allows managing the menu item of a wiki page", :js do other_wiki_page another_wiki_page diff --git a/spec/features/my/autologin_tokens_management_spec.rb b/spec/features/my/autologin_tokens_management_spec.rb index afd462c4463e..0d99104bf029 100644 --- a/spec/features/my/autologin_tokens_management_spec.rb +++ b/spec/features/my/autologin_tokens_management_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "My account autologin tokens management", :js, :with_cuprite do +RSpec.describe "My account autologin tokens management", :js do include Redmine::I18n shared_let(:user) { create(:user) } shared_let(:old_token) { create(:autologin_token, user:, created_at: 1.year.ago, expires_on: 1.year.ago + 1.day) } diff --git a/spec/features/news/creation_and_commenting_spec.rb b/spec/features/news/creation_and_commenting_spec.rb index 9b8959736cc8..461edbbd7fce 100644 --- a/spec/features/news/creation_and_commenting_spec.rb +++ b/spec/features/news/creation_and_commenting_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "News creation and commenting", :js, :with_cuprite do +RSpec.describe "News creation and commenting", :js do let(:project) { create(:project) } let!(:other_user) do create(:user, diff --git a/spec/features/news/global_menu_item_spec.rb b/spec/features/news/global_menu_item_spec.rb index 9ac4725eb700..02d9139e58a2 100644 --- a/spec/features/news/global_menu_item_spec.rb +++ b/spec/features/news/global_menu_item_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" -RSpec.describe "News global menu item spec", :js, :with_cuprite do +RSpec.describe "News global menu item spec", :js do shared_let(:admin) { create(:admin) } shared_let(:user_without_permissions) { create(:user) } shared_let(:project) { create(:project) } diff --git a/spec/features/notifications/navigation_spec.rb b/spec/features/notifications/navigation_spec.rb index ba5ce13f3f7f..4257fd57cd11 100644 --- a/spec/features/notifications/navigation_spec.rb +++ b/spec/features/notifications/navigation_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Notification center navigation", :js, :with_cuprite do +RSpec.describe "Notification center navigation", :js do shared_association_default(:project) { create(:project) } shared_let(:work_package) { create(:work_package, project:) } diff --git a/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb b/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb index 9c8d6881150c..0e5899293e4b 100644 --- a/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_date_alert_mention_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Notification center date alert and mention", :js, - :with_cuprite, with_settings: { journal_aggregation_time_minutes: 0 } do shared_let(:project) { create(:project) } shared_let(:actor) { create(:user, firstname: "Actor", lastname: "User") } diff --git a/spec/features/notifications/notification_center/notification_center_date_alerts_spec.rb b/spec/features/notifications/notification_center/notification_center_date_alerts_spec.rb index 92a8a53f3e1a..8c215cfd8dd7 100644 --- a/spec/features/notifications/notification_center/notification_center_date_alerts_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_date_alerts_spec.rb @@ -2,8 +2,7 @@ require "features/page_objects/notification" # rubocop:disable RSpec/ScatteredLet -RSpec.describe "Notification center date alerts", :js, :with_cuprite, - with_settings: { journal_aggregation_time_minutes: 0 } do +RSpec.describe "Notification center date alerts", :js, with_settings: { journal_aggregation_time_minutes: 0 } do # Find an assignable time zone with the same UTC offset as the local time zone def find_compatible_local_time_zone local_offset = Time.now.gmt_offset # rubocop:disable Rails/TimeZone diff --git a/spec/features/notifications/notification_center/notification_center_reminder_spec.rb b/spec/features/notifications/notification_center/notification_center_reminder_spec.rb index 015aa20a36f1..f6d3d846892f 100644 --- a/spec/features/notifications/notification_center/notification_center_reminder_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_reminder_spec.rb @@ -3,7 +3,6 @@ RSpec.describe "Notification center reminder, mention and date alert", :js, - :with_cuprite, with_ee: %i[date_alerts], with_settings: { journal_aggregation_time_minutes: 0 } do shared_let(:project) { create(:project) } diff --git a/spec/features/notifications/notification_center/notification_center_sidemenu_spec.rb b/spec/features/notifications/notification_center/notification_center_sidemenu_spec.rb index c2cd4a832484..b6b09d2e0ea1 100644 --- a/spec/features/notifications/notification_center/notification_center_sidemenu_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_sidemenu_spec.rb @@ -2,7 +2,6 @@ RSpec.describe "Notification center sidemenu", :js, - :with_cuprite, with_ee: %i[date_alerts work_package_sharing] do shared_let(:project) { create(:project) } shared_let(:project2) { create(:project) } diff --git a/spec/features/notifications/notification_center/notification_center_spec.rb b/spec/features/notifications/notification_center/notification_center_spec.rb index af11cbb58019..75d72b1ff9ba 100644 --- a/spec/features/notifications/notification_center/notification_center_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_spec.rb @@ -1,10 +1,9 @@ require "spec_helper" -RSpec.describe "Notification center", :js, :with_cuprite, - with_ee: %i[date_alerts], - # We decrease the notification polling interval because some portions of the JS code rely on something triggering - # the Angular change detection. This is usually done by the notification polling, but we don't want to wait - with_settings: { journal_aggregation_time_minutes: 0, notifications_polling_interval: 1_000 } do +RSpec.describe "Notification center", :js, with_ee: %i[date_alerts], + # We decrease the notification polling interval because some portions of the JS code rely on something triggering + # the Angular change detection. This is usually done by the notification polling, but we don't want to wait + with_settings: { journal_aggregation_time_minutes: 0, notifications_polling_interval: 1_000 } do # Notice that the setup in this file here is not following the normal rules as # it also tests notification creation. let!(:project1) { create(:project) } diff --git a/spec/features/notifications/notification_center/split_screen_spec.rb b/spec/features/notifications/notification_center/split_screen_spec.rb index 36d846d0ca4a..dc216f68abcd 100644 --- a/spec/features/notifications/notification_center/split_screen_spec.rb +++ b/spec/features/notifications/notification_center/split_screen_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Split screen in the notification center", :js, :with_cuprite do +RSpec.describe "Split screen in the notification center", :js do let(:global_html_title) { Components::HtmlTitle.new } let(:center) { Pages::Notifications::Center.new } let(:split_screen) { Pages::PrimerizedSplitWorkPackage.new work_package } diff --git a/spec/features/notifications/settings/immediate_reminder_spec.rb b/spec/features/notifications/settings/immediate_reminder_spec.rb index 3b2ba4aaffab..9dafba0bf765 100644 --- a/spec/features/notifications/settings/immediate_reminder_spec.rb +++ b/spec/features/notifications/settings/immediate_reminder_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Immediate reminder settings", :js, :with_cuprite do +RSpec.describe "Immediate reminder settings", :js do shared_examples "immediate reminder settings" do it "allows to configure the reminder settings" do # Save prefs so we can reload them later @@ -58,7 +58,7 @@ it_behaves_like "immediate reminder settings" end - describe "email sending", js: false, with_cuprite: false do + describe "email sending" do let(:project) { create(:project) } let(:work_package) { create(:work_package, project:) } let(:receiver) do diff --git a/spec/features/notifications/settings/my_notifications_settings_spec.rb b/spec/features/notifications/settings/my_notifications_settings_spec.rb index 7b7a4960463d..a6fab83d5f3b 100644 --- a/spec/features/notifications/settings/my_notifications_settings_spec.rb +++ b/spec/features/notifications/settings/my_notifications_settings_spec.rb @@ -3,8 +3,7 @@ require "support/pages/my/notifications" RSpec.describe "My notifications settings", - :js, - :with_cuprite do + :js do shared_let(:user) { create(:user) } let(:settings_page) { Pages::My::Notifications.new(user) } diff --git a/spec/features/notifications/settings/pause_reminder_settings_spec.rb b/spec/features/notifications/settings/pause_reminder_settings_spec.rb index b64c3281f07c..df16ca80f344 100644 --- a/spec/features/notifications/settings/pause_reminder_settings_spec.rb +++ b/spec/features/notifications/settings/pause_reminder_settings_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Pause reminder settings", :js, :with_cuprite do +RSpec.describe "Pause reminder settings", :js do shared_examples "pause reminder settings" do let(:first) { Time.zone.today.beginning_of_month } let(:last) { (Time.zone.today.beginning_of_month + 10.days) } diff --git a/spec/features/notifications/settings/reminder_email_settings_spec.rb b/spec/features/notifications/settings/reminder_email_settings_spec.rb index 99da2364600c..d7295edde536 100644 --- a/spec/features/notifications/settings/reminder_email_settings_spec.rb +++ b/spec/features/notifications/settings/reminder_email_settings_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require_relative "../../users/notifications/shared_examples" -RSpec.describe "Reminder email", :js, :with_cuprite do +RSpec.describe "Reminder email", :js do shared_examples "reminder settings" do it "allows to configure the reminder settings" do # Configure the digest diff --git a/spec/features/notifications/settings/workdays_settings_spec.rb b/spec/features/notifications/settings/workdays_settings_spec.rb index 428aefaa7e82..513fe02a4c5b 100644 --- a/spec/features/notifications/settings/workdays_settings_spec.rb +++ b/spec/features/notifications/settings/workdays_settings_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Workday notification settings", :js, :with_cuprite do +RSpec.describe "Workday notification settings", :js do shared_examples "workday settings" do before do current_user.language = locale diff --git a/spec/features/placeholder_users/index_spec.rb b/spec/features/placeholder_users/index_spec.rb index 43dad63f068c..0c390bd8771f 100644 --- a/spec/features/placeholder_users/index_spec.rb +++ b/spec/features/placeholder_users/index_spec.rb @@ -30,7 +30,6 @@ RSpec.describe "index placeholder users", :js, - :with_cuprite, with_ee: %i[placeholder_users] do let!(:current_user) { create(:admin) } let!(:anonymous) { create(:anonymous) } diff --git a/spec/features/projects/attribute_help_texts_spec.rb b/spec/features/projects/attribute_help_texts_spec.rb index fec6a9381a3b..c4c64d624258 100644 --- a/spec/features/projects/attribute_help_texts_spec.rb +++ b/spec/features/projects/attribute_help_texts_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Project attribute help texts", :js, :with_cuprite do +RSpec.describe "Project attribute help texts", :js do let(:project) { create(:project) } let(:instance) do diff --git a/spec/features/projects/copy_spec.rb b/spec/features/projects/copy_spec.rb index 1c2ae9555aeb..d9091f1fdf28 100644 --- a/spec/features/projects/copy_spec.rb +++ b/spec/features/projects/copy_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects copy", :js, :with_cuprite, +RSpec.describe "Projects copy", :js, with_good_job_batches: [CopyProjectJob, Storages::CopyProjectFoldersJob, SendCopyProjectStatusEmailJob] do describe "with a full copy example" do let!(:project) do diff --git a/spec/features/projects/create_spec.rb b/spec/features/projects/create_spec.rb index c58f3f88f846..838021342960 100644 --- a/spec/features/projects/create_spec.rb +++ b/spec/features/projects/create_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Projects", "creation", - :js, - :with_cuprite do + :js do shared_let(:name_field) { FormFields::InputFormField.new :name } shared_let(:project_custom_field_section) { create(:project_custom_field_section, name: "Section A") } diff --git a/spec/features/projects/destroy_spec.rb b/spec/features/projects/destroy_spec.rb index cc06c5b0a730..a84449f5e103 100644 --- a/spec/features/projects/destroy_spec.rb +++ b/spec/features/projects/destroy_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects#destroy", :js, :with_cuprite do +RSpec.describe "Projects#destroy", :js do let!(:project) { create(:project, name: "foo", identifier: "foo") } let(:project_page) { Pages::Projects::Destroy.new(project) } let(:danger_zone) { DangerZone.new(page) } diff --git a/spec/features/projects/edit_settings_spec.rb b/spec/features/projects/edit_settings_spec.rb index 48139b8c67e1..ad4f3c972397 100644 --- a/spec/features/projects/edit_settings_spec.rb +++ b/spec/features/projects/edit_settings_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects", "editing settings", :js, :with_cuprite do +RSpec.describe "Projects", "editing settings", :js do let(:name_field) { FormFields::InputFormField.new :name } let(:parent_field) { FormFields::SelectFormField.new :parent } let(:permissions) { %i(edit_project view_project_attributes edit_project_attributes) } diff --git a/spec/features/projects/export_spec.rb b/spec/features/projects/export_spec.rb index 5a6e0fc3aaef..f17b8b695bd4 100644 --- a/spec/features/projects/export_spec.rb +++ b/spec/features/projects/export_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "project export", :js, :with_cuprite do +RSpec.describe "project export", :js do shared_let(:important_project) { create(:project, name: "Important schedule plan", description: "Important description") } shared_let(:party_project) { create(:project, name: "Christmas party", description: "Christmas description") } shared_let(:user) do diff --git a/spec/features/projects/global_menu_item_spec.rb b/spec/features/projects/global_menu_item_spec.rb index f6988bbaaeff..499805da2feb 100644 --- a/spec/features/projects/global_menu_item_spec.rb +++ b/spec/features/projects/global_menu_item_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" -RSpec.describe "Projects global menu item", :js, :with_cuprite do +RSpec.describe "Projects global menu item", :js do shared_let(:user) { create(:user) } shared_let(:admin) { create(:admin) } diff --git a/spec/features/projects/life_cycle/active_in_project_spec.rb b/spec/features/projects/life_cycle/active_in_project_spec.rb index c545b59004a4..71e2678fd865 100644 --- a/spec/features/projects/life_cycle/active_in_project_spec.rb +++ b/spec/features/projects/life_cycle/active_in_project_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects life cycle settings", :js, :with_cuprite, with_flag: { stages_and_gates: true } do +RSpec.describe "Projects life cycle settings", :js, with_flag: { stages_and_gates: true } do shared_let(:project) { create(:project) } shared_let(:user_with_permission) do diff --git a/spec/features/projects/life_cycle/overview_page/dialog/permission_spec.rb b/spec/features/projects/life_cycle/overview_page/dialog/permission_spec.rb index debb041b9fbb..7ac4f318dd40 100644 --- a/spec/features/projects/life_cycle/overview_page/dialog/permission_spec.rb +++ b/spec/features/projects/life_cycle/overview_page/dialog/permission_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" require_relative "../shared_context" -RSpec.describe "Edit project stages and gates on project overview page", :js, :with_cuprite, - with_flag: { stages_and_gates: true } do +RSpec.describe "Edit project stages and gates on project overview page", :js, with_flag: { stages_and_gates: true } do include_context "with seeded projects and stages and gates" shared_let(:user) { create(:user) } let(:overview_page) { Pages::Projects::Show.new(project) } diff --git a/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb b/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb index 59431c3ac7fa..cbbccb896b25 100644 --- a/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb +++ b/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" require_relative "../shared_context" -RSpec.describe "Edit project stages and gates on project overview page", :js, :with_cuprite, - with_flag: { stages_and_gates: true } do +RSpec.describe "Edit project stages and gates on project overview page", :js, with_flag: { stages_and_gates: true } do include_context "with seeded projects and stages and gates" shared_let(:overview) { create :overview, project: } diff --git a/spec/features/projects/life_cycle/overview_page/sidebar_spec.rb b/spec/features/projects/life_cycle/overview_page/sidebar_spec.rb index 66298f4b1c4a..65f0335494cd 100644 --- a/spec/features/projects/life_cycle/overview_page/sidebar_spec.rb +++ b/spec/features/projects/life_cycle/overview_page/sidebar_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Show project life cycles on project overview page", :js, :with_cuprite, with_flag: { stages_and_gates: true } do +RSpec.describe "Show project life cycles on project overview page", :js, with_flag: { stages_and_gates: true } do include_context "with seeded projects and stages and gates" let(:overview_page) { Pages::Projects::Show.new(project) } diff --git a/spec/features/projects/lists/columns_spec.rb b/spec/features/projects/lists/columns_spec.rb index 2ec010d36b1d..506ae56d03dc 100644 --- a/spec/features/projects/lists/columns_spec.rb +++ b/spec/features/projects/lists/columns_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects lists columns", :js, :with_cuprite, with_settings: { login_required?: false } do +RSpec.describe "Projects lists columns", :js, with_settings: { login_required?: false } do shared_let(:admin) { create(:admin) } shared_let(:manager) { create(:project_role, name: "Manager") } diff --git a/spec/features/projects/lists/filters_spec.rb b/spec/features/projects/lists/filters_spec.rb index 669b6735bace..f2dd973ce55d 100644 --- a/spec/features/projects/lists/filters_spec.rb +++ b/spec/features/projects/lists/filters_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects list filters", :js, :with_cuprite, with_settings: { login_required?: false } do +RSpec.describe "Projects list filters", :js, with_settings: { login_required?: false } do shared_let(:admin) { create(:admin) } shared_let(:manager) { create(:project_role, name: "Manager") } diff --git a/spec/features/projects/lists/gantt_spec.rb b/spec/features/projects/lists/gantt_spec.rb index f3216e52d2a0..57224ea5277b 100644 --- a/spec/features/projects/lists/gantt_spec.rb +++ b/spec/features/projects/lists/gantt_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects lists page with Gantt menu", :js, :with_cuprite, with_settings: { login_required?: false } do +RSpec.describe "Projects lists page with Gantt menu", :js, with_settings: { login_required?: false } do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:admin) { create(:admin) } diff --git a/spec/features/projects/lists/order_spec.rb b/spec/features/projects/lists/order_spec.rb index e892b6915753..595e84df8f33 100644 --- a/spec/features/projects/lists/order_spec.rb +++ b/spec/features/projects/lists/order_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Projects lists ordering", :js, :with_cuprite, with_settings: { login_required?: false } do +RSpec.describe "Projects lists ordering", :js, with_settings: { login_required?: false } do shared_let(:admin) { create(:admin) } shared_let(:custom_field) { create(:text_project_custom_field) } diff --git a/spec/features/projects/lists/table_spec.rb b/spec/features/projects/lists/table_spec.rb index 3207b75464f8..7b7ab5f3d606 100644 --- a/spec/features/projects/lists/table_spec.rb +++ b/spec/features/projects/lists/table_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects lists table display and actions", :js, :with_cuprite, with_settings: { login_required?: false } do +RSpec.describe "Projects lists table display and actions", :js, with_settings: { login_required?: false } do shared_let(:admin) { create(:admin) } shared_let(:manager) { create(:project_role, name: "Manager") } diff --git a/spec/features/projects/navigation_spec.rb b/spec/features/projects/navigation_spec.rb index cf3fc6c37842..3ae2ce28faae 100644 --- a/spec/features/projects/navigation_spec.rb +++ b/spec/features/projects/navigation_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects navigation", :js, :with_cuprite do +RSpec.describe "Projects navigation", :js do shared_let(:project) { create(:project) } shared_let(:user) do create(:user, member_with_permissions: { diff --git a/spec/features/projects/persisted_lists_sharing_spec.rb b/spec/features/projects/persisted_lists_sharing_spec.rb index 3c209d5f71f8..468c558ddc74 100644 --- a/spec/features/projects/persisted_lists_sharing_spec.rb +++ b/spec/features/projects/persisted_lists_sharing_spec.rb @@ -28,8 +28,7 @@ require "spec_helper" RSpec.describe "Project list sharing", - :js, - :with_cuprite do + :js do shared_let(:view_project_query_role) { create(:view_project_query_role) } shared_let(:edit_project_query_role) { create(:edit_project_query_role) } diff --git a/spec/features/projects/persisted_lists_spec.rb b/spec/features/projects/persisted_lists_spec.rb index 233304fe7f9c..f6b740e44f35 100644 --- a/spec/features/projects/persisted_lists_spec.rb +++ b/spec/features/projects/persisted_lists_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Persisted lists on projects index page", - :js, - :with_cuprite do + :js do shared_let(:non_member) { create(:non_member, permissions: %i(view_project_attributes)) } shared_let(:admin) { create(:admin) } shared_let(:user) { create(:user) } diff --git a/spec/features/projects/project_autocomplete_spec.rb b/spec/features/projects/project_autocomplete_spec.rb index b43ddf283869..b4ac98623373 100644 --- a/spec/features/projects/project_autocomplete_spec.rb +++ b/spec/features/projects/project_autocomplete_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects autocomplete page", :js, :with_cuprite do +RSpec.describe "Projects autocomplete page", :js do let!(:user) { create(:user) } let(:top_menu) { Components::Projects::TopMenu.new } diff --git a/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb b/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb index 1f96df0b8a06..ef66ab5653aa 100644 --- a/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Show project custom fields on project overview page", :js, :with_cuprite do +RSpec.describe "Show project custom fields on project overview page", :js do include_context "with seeded projects, members and project custom fields" let(:overview_page) { Pages::Projects::Show.new(project) } diff --git a/spec/features/projects/project_custom_fields/settings/mapping_spec.rb b/spec/features/projects/project_custom_fields/settings/mapping_spec.rb index 3cc245f6fb6d..28ce84384511 100644 --- a/spec/features/projects/project_custom_fields/settings/mapping_spec.rb +++ b/spec/features/projects/project_custom_fields/settings/mapping_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects custom fields mapping via project settings", :js, :with_cuprite do +RSpec.describe "Projects custom fields mapping via project settings", :js do let(:project) { create(:project, name: "Foo project", identifier: "foo-project") } let(:other_project) { create(:project, name: "Bar project", identifier: "bar-project") } diff --git a/spec/features/projects/project_status_administration_spec.rb b/spec/features/projects/project_status_administration_spec.rb index 35627feaf99b..f3f5c920be07 100644 --- a/spec/features/projects/project_status_administration_spec.rb +++ b/spec/features/projects/project_status_administration_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects status administration", :js, :with_cuprite do +RSpec.describe "Projects status administration", :js do include_context "ng-select-autocomplete helpers" let(:current_user) do diff --git a/spec/features/projects/projects_custom_fields_spec.rb b/spec/features/projects/projects_custom_fields_spec.rb index 31c7c6207cac..b03413216323 100644 --- a/spec/features/projects/projects_custom_fields_spec.rb +++ b/spec/features/projects/projects_custom_fields_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects custom fields", :js, :with_cuprite do +RSpec.describe "Projects custom fields", :js do shared_let(:current_user) { create(:admin) } shared_let(:project) { create(:project, name: "Foo project", identifier: "foo-project") } let(:name_field) { FormFields::InputFormField.new :name } @@ -169,8 +169,7 @@ end context "with german locale", - driver: :firefox_de, - with_cuprite: false do + driver: :firefox_de do let(:current_user) { create(:admin, language: "de") } it "displays the float with german locale" do diff --git a/spec/features/projects/subproject_creation_spec.rb b/spec/features/projects/subproject_creation_spec.rb index eaeb386b0f6b..f59592044741 100644 --- a/spec/features/projects/subproject_creation_spec.rb +++ b/spec/features/projects/subproject_creation_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Subproject creation", :js, :with_cuprite do +RSpec.describe "Subproject creation", :js do let(:name_field) { FormFields::InputFormField.new :name } let(:parent_field) { FormFields::SelectFormField.new :parent } let(:add_subproject_role) { create(:project_role, permissions: %i[edit_project add_subprojects]) } diff --git a/spec/features/projects/template_spec.rb b/spec/features/projects/template_spec.rb index 3eb87740cf53..a0301a0fdc94 100644 --- a/spec/features/projects/template_spec.rb +++ b/spec/features/projects/template_spec.rb @@ -28,8 +28,7 @@ require "spec_helper" -RSpec.describe "Project templates", :js, :with_cuprite, - with_good_job_batches: [CopyProjectJob, SendCopyProjectStatusEmailJob] do +RSpec.describe "Project templates", :js, with_good_job_batches: [CopyProjectJob, SendCopyProjectStatusEmailJob] do describe "making project a template" do let(:project) { create(:project) } diff --git a/spec/features/projects/work_package_type_mgmt_spec.rb b/spec/features/projects/work_package_type_mgmt_spec.rb index f82333c83eae..248d75ff9b75 100644 --- a/spec/features/projects/work_package_type_mgmt_spec.rb +++ b/spec/features/projects/work_package_type_mgmt_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Projects", "work package type mgmt", :js, :with_cuprite do # rubocop:disable RSpec/SortMetadata +RSpec.describe "Projects", "work package type mgmt", :js do # rubocop:disable RSpec/SortMetadata current_user { create(:user, member_with_permissions: { project => %i[edit_project manage_types] }) } let(:phase_type) { create(:type, name: "Phase", is_default: true) } diff --git a/spec/features/roles/create_spec.rb b/spec/features/roles/create_spec.rb index 23bfe0afebf2..f3aa3b9940e2 100644 --- a/spec/features/roles/create_spec.rb +++ b/spec/features/roles/create_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Role creation", :js, :with_cuprite do +RSpec.describe "Role creation", :js do let!(:admin) { create(:admin) } let!(:existing_role) { create(:project_role) } let!(:existing_workflow) { create(:workflow_with_default_status, role: existing_role, type:) } diff --git a/spec/features/security/plain_text_content_type.rb b/spec/features/security/plain_text_content_type.rb index 3cad05b74bfe..1e3165581b77 100644 --- a/spec/features/security/plain_text_content_type.rb +++ b/spec/features/security/plain_text_content_type.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Plain text content type XSS prevention", :js, :with_cuprite do +RSpec.describe "Plain text content type XSS prevention", :js do shared_let(:admin) { create(:admin) } shared_let(:work_package) { create(:work_package) } diff --git a/spec/features/support/components/attribute_help_text_modal.rb b/spec/features/support/components/attribute_help_text_modal.rb index 17434a2d9663..762f685b17c9 100644 --- a/spec/features/support/components/attribute_help_text_modal.rb +++ b/spec/features/support/components/attribute_help_text_modal.rb @@ -60,7 +60,7 @@ def open! def close! # make backdrop click an the pixel x:10,y:10 page.find(".spot-modal-overlay").tap do |element| - if RSpec.current_example.metadata[:with_cuprite] + if using_cuprite? width = element.style("width")["width"].to_i height = element.style("height")["height"].to_i else diff --git a/spec/features/types/activate_in_project_spec.rb b/spec/features/types/activate_in_project_spec.rb index 68a484b591ce..0b69f370da5f 100644 --- a/spec/features/types/activate_in_project_spec.rb +++ b/spec/features/types/activate_in_project_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "support/pages/custom_fields/index_page" -RSpec.describe "types", :js, :with_cuprite do +RSpec.describe "types", :js do let(:user) do create(:user, member_with_permissions: { project => %i(edit_project manage_types add_work_packages view_work_packages) }) diff --git a/spec/features/types/crud_spec.rb b/spec/features/types/crud_spec.rb index ba957d2be9ec..ede513857a89 100644 --- a/spec/features/types/crud_spec.rb +++ b/spec/features/types/crud_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Types", :js, :with_cuprite do +RSpec.describe "Types", :js do shared_let(:admin) { create(:admin) } shared_let(:existing_role) { create(:project_role) } diff --git a/spec/features/types/form_configuration_query_spec.rb b/spec/features/types/form_configuration_query_spec.rb index 3ccc66207d8e..5d1f2b2f585b 100644 --- a/spec/features/types/form_configuration_query_spec.rb +++ b/spec/features/types/form_configuration_query_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "form query configuration", :js, :with_cuprite do +RSpec.describe "form query configuration", :js do shared_let(:admin) { create(:admin) } let(:type_bug) { create(:type_bug) } let(:type_task) { create(:type_task) } diff --git a/spec/features/users/create_spec.rb b/spec/features/users/create_spec.rb index a73cf2bc11f4..6e206c8f35d5 100644 --- a/spec/features/users/create_spec.rb +++ b/spec/features/users/create_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "create users", :with_cuprite do +RSpec.describe "create users" do shared_let(:admin) { create(:admin) } let(:current_user) { admin } let!(:auth_source) { create(:ldap_auth_source) } diff --git a/spec/features/users/delete_spec.rb b/spec/features/users/delete_spec.rb index 35d793fb29d7..1bb164327902 100644 --- a/spec/features/users/delete_spec.rb +++ b/spec/features/users/delete_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "user deletion:", :js, :with_cuprite do +RSpec.describe "user deletion:", :js do let(:dialog) { Components::PasswordConfirmationDialog.new } include Flash::Expectations diff --git a/spec/features/users/edit_users_spec.rb b/spec/features/users/edit_users_spec.rb index 55f21d170dee..7dbda05187ca 100644 --- a/spec/features/users/edit_users_spec.rb +++ b/spec/features/users/edit_users_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "edit users", :js, :with_cuprite do +RSpec.describe "edit users", :js do shared_let(:admin) { create(:admin) } let(:current_user) { admin } let(:user) { create(:user, mail: "foo@example.com") } diff --git a/spec/features/users/index_spec.rb b/spec/features/users/index_spec.rb index af5a380d435c..f5deb88dae6a 100644 --- a/spec/features/users/index_spec.rb +++ b/spec/features/users/index_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "index users", :js, :with_cuprite do +RSpec.describe "index users", :js do shared_let(:current_user) { create(:admin, firstname: "admin", lastname: "admin", created_at: 1.hour.ago) } let(:index_page) { Pages::Admin::Users::Index.new } diff --git a/spec/features/users/invitation_spec.rb b/spec/features/users/invitation_spec.rb index 23edc30b36e2..9345b34a4d3d 100644 --- a/spec/features/users/invitation_spec.rb +++ b/spec/features/users/invitation_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "invitations", :js, :with_cuprite do +RSpec.describe "invitations", :js do let(:user) { create(:invited_user, mail: "holly@openproject.com") } shared_examples "resending invitations" do |redirect_to_edit_page: true| diff --git a/spec/features/users/invite_user_modal/custom_fields_spec.rb b/spec/features/users/invite_user_modal/custom_fields_spec.rb index 3e7ffbf45667..665af2bba91f 100644 --- a/spec/features/users/invite_user_modal/custom_fields_spec.rb +++ b/spec/features/users/invite_user_modal/custom_fields_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Invite user modal custom fields", :js, :with_cuprite do +RSpec.describe "Invite user modal custom fields", :js do shared_let(:project) { create(:project) } let(:permissions) { %i[view_project manage_members] } diff --git a/spec/features/users/invite_user_modal/invite_user_modal_spec.rb b/spec/features/users/invite_user_modal/invite_user_modal_spec.rb index 388e33e89480..87d69b2c5533 100644 --- a/spec/features/users/invite_user_modal/invite_user_modal_spec.rb +++ b/spec/features/users/invite_user_modal/invite_user_modal_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Invite user modal", :js, :with_cuprite do +RSpec.describe "Invite user modal", :js do let!(:standard) { create(:standard_global_role) } let!(:project) { create(:project) } let!(:work_package) { create(:work_package, project:) } @@ -270,7 +270,7 @@ roles: [role_no_permissions]) end - it "disables projects for which you do not have rights", with_cuprite: false do + it "disables projects for which you do not have rights", :js do ngselect = modal.open_select_in_step ".ng-select-container" expect(ngselect).to have_text "#{project_no_permissions.name}\nYou are not allowed to invite members to this project" end @@ -281,7 +281,7 @@ # Use admin to ensure all projects are visible let(:current_user) { create(:admin) } - it "disables projects for which you do not have rights", with_cuprite: false do + it "disables projects for which you do not have rights", :js do ngselect = modal.open_select_in_step ".ng-select-container" expect(ngselect).to have_no_text archived_project end diff --git a/spec/features/users/invite_user_modal/permission_lacking_current_project_spec.rb b/spec/features/users/invite_user_modal/permission_lacking_current_project_spec.rb index 978d2adb3aec..fd6af408ed3c 100644 --- a/spec/features/users/invite_user_modal/permission_lacking_current_project_spec.rb +++ b/spec/features/users/invite_user_modal/permission_lacking_current_project_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Inviting user in project the current user is lacking permission in", :js, :with_cuprite do +RSpec.describe "Inviting user in project the current user is lacking permission in", :js do shared_let(:standard) { create(:standard_global_role) } let(:modal) do Components::Users::InviteUserModal.new project: invite_project, diff --git a/spec/features/users/invite_user_modal/subproject_invite_spec.rb b/spec/features/users/invite_user_modal/subproject_invite_spec.rb index 8cc18f7c07bb..5624e7e20830 100644 --- a/spec/features/users/invite_user_modal/subproject_invite_spec.rb +++ b/spec/features/users/invite_user_modal/subproject_invite_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Invite user modal subprojects", :js, :with_cuprite do +RSpec.describe "Invite user modal subprojects", :js do shared_let(:standard) { create(:standard_global_role) } shared_let(:project) { create(:project, name: "Parent project") } shared_let(:subproject) { create(:project, name: "Subproject", parent: project) } diff --git a/spec/features/users/my_spec.rb b/spec/features/users/my_spec.rb index bd0bc5d23fef..6d988ea6d051 100644 --- a/spec/features/users/my_spec.rb +++ b/spec/features/users/my_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "my", :js, :with_cuprite do +RSpec.describe "my", :js do let(:user_password) { "bob" * 4 } let!(:string_cf) { create(:user_custom_field, :string, name: "Hobbies", is_required: false) } let(:user) do diff --git a/spec/features/users/notifications/user_notifications_settings_spec.rb b/spec/features/users/notifications/user_notifications_settings_spec.rb index 0d20e6d13b52..08f385f2aadb 100644 --- a/spec/features/users/notifications/user_notifications_settings_spec.rb +++ b/spec/features/users/notifications/user_notifications_settings_spec.rb @@ -2,8 +2,7 @@ require_relative "shared_examples" RSpec.describe "user notifications settings", - :js, - :with_cuprite do + :js do shared_let(:user) { create(:user) } let(:settings_page) { Pages::Notifications::Settings.new(user) } diff --git a/spec/features/users/password_change_spec.rb b/spec/features/users/password_change_spec.rb index 5207175054ce..652edbb4c32f 100644 --- a/spec/features/users/password_change_spec.rb +++ b/spec/features/users/password_change_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "random password generation", :js, :with_cuprite do +RSpec.describe "random password generation", :js do shared_let(:admin) { create(:admin) } let(:old_password) { "old_Password!123" } diff --git a/spec/features/users/self_registration_spec.rb b/spec/features/users/self_registration_spec.rb index cbe4a6cbd3f1..adf6c8d11858 100644 --- a/spec/features/users/self_registration_spec.rb +++ b/spec/features/users/self_registration_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "user self registration", :js, :with_cuprite do +RSpec.describe "user self registration", :js do let(:admin_password) { "Test123Test123" } let(:admin) { create(:admin, password: admin_password, password_confirmation: admin_password) } let(:home_page) { Pages::Home.new } diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb index c22381761999..4a13fa847390 100644 --- a/spec/features/users/show_spec.rb +++ b/spec/features/users/show_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "index users", :js, :with_cuprite do +RSpec.describe "index users", :js do shared_let(:user) { create(:admin) } shared_let(:other_user) { create(:user) } diff --git a/spec/features/users/unaccent_user_filter_spec.rb b/spec/features/users/unaccent_user_filter_spec.rb index fbcc0df610e1..5da2ed01021e 100644 --- a/spec/features/users/unaccent_user_filter_spec.rb +++ b/spec/features/users/unaccent_user_filter_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../principals/shared_memberships_examples" -RSpec.describe "Finding users with accents", :js, :with_cuprite do +RSpec.describe "Finding users with accents", :js do shared_let(:project) { create(:project) } shared_let(:principal) { create(:user, firstname: "Cécile", lastname: "Foobar") } shared_let(:admin) { create(:admin) } diff --git a/spec/features/users/user_memberships_spec.rb b/spec/features/users/user_memberships_spec.rb index 8d14f5811842..55d002101bf6 100644 --- a/spec/features/users/user_memberships_spec.rb +++ b/spec/features/users/user_memberships_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../principals/shared_memberships_examples" -RSpec.describe "user memberships through user page", :js, :with_cuprite do +RSpec.describe "user memberships through user page", :js do include_context "principal membership management context" shared_let(:principal) { create(:user, firstname: "Foobar", lastname: "Blabla") } diff --git a/spec/features/versions/delete_spec.rb b/spec/features/versions/delete_spec.rb index 1085227bac4e..256a632d5001 100644 --- a/spec/features/versions/delete_spec.rb +++ b/spec/features/versions/delete_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "version delete", :js, :with_cuprite do +RSpec.describe "version delete", :js do let!(:project) { create(:project, name: "Parent") } let!(:archived_child) { create(:project, name: "Archived child", parent: project, active: false) } diff --git a/spec/features/versions/roadmap_filtering_spec.rb b/spec/features/versions/roadmap_filtering_spec.rb index 04db59d6cbf2..befc07ecb2c2 100644 --- a/spec/features/versions/roadmap_filtering_spec.rb +++ b/spec/features/versions/roadmap_filtering_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Roadmap Filtering", :js, :with_cuprite do +RSpec.describe "Roadmap Filtering", :js do shared_let(:project) { create(:project) } shared_let(:sub_project) { create(:project, parent: project) } diff --git a/spec/features/work_packages/attachments/attachment_upload_spec.rb b/spec/features/work_packages/attachments/attachment_upload_spec.rb index ef7b3362f084..34b00f91e750 100644 --- a/spec/features/work_packages/attachments/attachment_upload_spec.rb +++ b/spec/features/work_packages/attachments/attachment_upload_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "Upload attachment to work package", :js, :with_cuprite do +RSpec.describe "Upload attachment to work package", :js do let(:role) do create(:project_role, permissions: %i[view_work_packages add_work_packages edit_work_packages add_work_package_notes]) @@ -143,7 +143,7 @@ target = find(".ck-content") attachments.drag_and_drop_file(target, image_fixture.path) - sleep 2 unless example.metadata[:with_cuprite] + sleep 2 unless using_cuprite? editor.wait_until_upload_progress_toaster_cleared editor.in_editor do |_container, editable| @@ -151,7 +151,7 @@ expect(editable).to have_no_css(".ck-upload-placeholder-loader") end - sleep 2 unless example.metadata[:with_cuprite] + sleep 2 unless using_cuprite? scroll_to_and_click find_by_id("work-packages--edit-actions-save") @@ -211,7 +211,7 @@ target = find(".ck-content") attachments.drag_and_drop_file(target, image_fixture.path) - sleep 2 unless example.metadata[:with_cuprite] + sleep 2 unless using_cuprite? editor.wait_until_upload_progress_toaster_cleared editor.in_editor do |_container, editable| @@ -219,7 +219,7 @@ expect(editable).to have_no_css(".ck-upload-placeholder-loader") end - sleep 2 unless example.metadata[:with_cuprite] + sleep 2 unless using_cuprite? scroll_to_and_click find_by_id("work-packages--edit-actions-save") @@ -247,7 +247,7 @@ # everywhere so if this works it should work everywhere else too. # TODO: Add better_cuprite_billy. I'm not sure what needs to be set up so the request to AWS passes. # Need help - context "with direct uploads", :with_direct_uploads, with_cuprite: false do + context "with direct uploads", :with_direct_uploads, :js do before do allow_any_instance_of(Attachment).to receive(:diskfile).and_return Struct.new(:path).new(image_fixture.path.to_s) end diff --git a/spec/features/work_packages/bulk/copy_work_package_spec.rb b/spec/features/work_packages/bulk/copy_work_package_spec.rb index d5987c097462..ea03df184bb3 100644 --- a/spec/features/work_packages/bulk/copy_work_package_spec.rb +++ b/spec/features/work_packages/bulk/copy_work_package_spec.rb @@ -2,7 +2,7 @@ require "features/page_objects/notification" require "support/components/autocompleter/ng_select_autocomplete_helpers" -RSpec.describe "Copy work packages through Rails view", :js, :with_cuprite do +RSpec.describe "Copy work packages through Rails view", :js do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:type) { create(:type, name: "Bug") } diff --git a/spec/features/work_packages/bulk/move_work_package_spec.rb b/spec/features/work_packages/bulk/move_work_package_spec.rb index 271b9f1a0db7..c51827cc26cf 100644 --- a/spec/features/work_packages/bulk/move_work_package_spec.rb +++ b/spec/features/work_packages/bulk/move_work_package_spec.rb @@ -95,7 +95,7 @@ context "when the limit to move in the frontend is 1", with_settings: { work_packages_bulk_request_limit: 1 } do - it "copies them in the background and shows a status page", :with_cuprite do + it "copies them in the background and shows a status page" do click_on "Move and follow" wait_for_reload @@ -122,7 +122,7 @@ end end - it "moves parent and child wp to a new project", :with_cuprite do + it "moves parent and child wp to a new project" do click_on "Move and follow" wait_for_reload page.find(".inline-edit--container.subject", text: work_package.subject) @@ -136,7 +136,7 @@ context "when the target project does not have the type" do let!(:project2) { create(:project, name: "Target", types: [type2]) } - it "does not move the work package", :with_cuprite do + it "does not move the work package" do click_on "Move and follow" wait_for_reload diff --git a/spec/features/work_packages/bulk/update_work_package_spec.rb b/spec/features/work_packages/bulk/update_work_package_spec.rb index 3f329baab07e..b4ba335cd1c2 100644 --- a/spec/features/work_packages/bulk/update_work_package_spec.rb +++ b/spec/features/work_packages/bulk/update_work_package_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "Bulk update work packages through Rails view", :js, :with_cuprite do +RSpec.describe "Bulk update work packages through Rails view", :js do shared_let(:type) { create(:type, name: "Bug") } shared_let(:project) { create(:project, name: "Source", types: [type]) } shared_let(:status) { create(:status) } diff --git a/spec/features/work_packages/custom_actions/custom_actions_link_value_spec.rb b/spec/features/work_packages/custom_actions/custom_actions_link_value_spec.rb index fc05f5390369..52f3b2b20231 100644 --- a/spec/features/work_packages/custom_actions/custom_actions_link_value_spec.rb +++ b/spec/features/work_packages/custom_actions/custom_actions_link_value_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Custom actions link cf value", :js, :with_cuprite, with_ee: %i[custom_actions] do +RSpec.describe "Custom actions link cf value", :js, with_ee: %i[custom_actions] do shared_let(:admin) { create(:admin) } let(:permissions) { %i(view_work_packages edit_work_packages) } diff --git a/spec/features/work_packages/custom_actions/custom_actions_me_value_spec.rb b/spec/features/work_packages/custom_actions/custom_actions_me_value_spec.rb index 2bba30eecabe..db6334ae61fc 100644 --- a/spec/features/work_packages/custom_actions/custom_actions_me_value_spec.rb +++ b/spec/features/work_packages/custom_actions/custom_actions_me_value_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Custom actions me value", :js, :with_cuprite, with_ee: %i[custom_actions] do +RSpec.describe "Custom actions me value", :js, with_ee: %i[custom_actions] do shared_let(:admin) { create(:admin) } let(:permissions) { %i(view_work_packages edit_work_packages) } diff --git a/spec/features/work_packages/custom_actions/custom_actions_spec.rb b/spec/features/work_packages/custom_actions/custom_actions_spec.rb index afca1b64aeaa..000d3e0a89c1 100644 --- a/spec/features/work_packages/custom_actions/custom_actions_spec.rb +++ b/spec/features/work_packages/custom_actions/custom_actions_spec.rb @@ -28,8 +28,7 @@ require "spec_helper" -RSpec.describe "Custom actions", :js, :with_cuprite, - with_ee: %i[custom_actions] do +RSpec.describe "Custom actions", :js, with_ee: %i[custom_actions] do shared_let(:admin) { create(:admin) } shared_let(:permissions) { %i(view_work_packages edit_work_packages move_work_packages work_package_assigned) } @@ -463,7 +462,7 @@ expect(date_action.actions.length).to eq(1) expect(date_action.conditions.length).to eq(0) - edit_page = index_ca_page.edit("Current date") + index_ca_page.edit("Current date") expect(page).to have_select("custom_action_actions_date", selected: "Current date") end diff --git a/spec/features/work_packages/datepicker/datepicker_follows_relation_spec.rb b/spec/features/work_packages/datepicker/datepicker_follows_relation_spec.rb index 6b5a59174be0..75bb0ebe55be 100644 --- a/spec/features/work_packages/datepicker/datepicker_follows_relation_spec.rb +++ b/spec/features/work_packages/datepicker/datepicker_follows_relation_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" require "support/edit_fields/edit_field" -RSpec.describe "Datepicker logic on follow relationships", :js, :with_cuprite, - with_settings: { date_format: "%Y-%m-%d" } do +RSpec.describe "Datepicker logic on follow relationships", :js, with_settings: { date_format: "%Y-%m-%d" } do shared_let(:user) { create(:admin) } shared_let(:type) { create(:type_bug) } diff --git a/spec/features/work_packages/datepicker/datepicker_logic_spec.rb b/spec/features/work_packages/datepicker/datepicker_logic_spec.rb index 4a4e62156be0..f35f44a3c2fd 100644 --- a/spec/features/work_packages/datepicker/datepicker_logic_spec.rb +++ b/spec/features/work_packages/datepicker/datepicker_logic_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "support/edit_fields/edit_field" -RSpec.describe "Datepicker modal logic test cases (WP #43539)", :js, :with_cuprite, with_settings: { date_format: "%Y-%m-%d" } do +RSpec.describe "Datepicker modal logic test cases (WP #43539)", :js, with_settings: { date_format: "%Y-%m-%d" } do shared_let(:user) { create(:admin) } shared_let(:type_bug) { create(:type_bug) } diff --git a/spec/features/work_packages/details/details_refreshing_spec.rb b/spec/features/work_packages/details/details_refreshing_spec.rb index 030f27d6f48f..35f5d720f92f 100644 --- a/spec/features/work_packages/details/details_refreshing_spec.rb +++ b/spec/features/work_packages/details/details_refreshing_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/work_packages/work_packages_page" -RSpec.describe "Work package table refreshing due to split view", :js, :with_cuprite do +RSpec.describe "Work package table refreshing due to split view", :js do let(:project) { create(:project_with_types) } let!(:work_package) { create(:work_package, project:) } let(:wp_split) { Pages::SplitWorkPackage.new work_package } diff --git a/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb b/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb index cc4fc3ba8377..5b51a86be251 100644 --- a/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb +++ b/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "work package hierarchies for milestones", :js, :with_cuprite do +RSpec.describe "work package hierarchies for milestones", :js do let(:user) { create(:admin) } let(:task_type) { create(:type_task) } let(:milestone_type) { create(:type_milestone) } diff --git a/spec/features/work_packages/details/relations/primerized_relations_spec.rb b/spec/features/work_packages/details/relations/primerized_relations_spec.rb index b66b17161991..cea8f2674ae6 100644 --- a/spec/features/work_packages/details/relations/primerized_relations_spec.rb +++ b/spec/features/work_packages/details/relations/primerized_relations_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" RSpec.describe "Primerized work package relations tab", - :js, :with_cuprite do + :js do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:project) { create(:project) } diff --git a/spec/features/work_packages/edit_work_package_spec.rb b/spec/features/work_packages/edit_work_package_spec.rb index d71c5775d885..81b0fc2c9005 100644 --- a/spec/features/work_packages/edit_work_package_spec.rb +++ b/spec/features/work_packages/edit_work_package_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "edit work package", :js, :with_cuprite do +RSpec.describe "edit work package", :js do include Components::Autocompleter::NgSelectAutocompleteHelpers let!(:standard_global_role) { create(:empty_global_role) } diff --git a/spec/features/work_packages/highlighting_spec.rb b/spec/features/work_packages/highlighting_spec.rb index 67c9af0644df..41213f0625ac 100644 --- a/spec/features/work_packages/highlighting_spec.rb +++ b/spec/features/work_packages/highlighting_spec.rb @@ -194,7 +194,7 @@ expect(page).to have_css(".__hl_inline_priority_#{priority1.id}") end - it "correctly parses custom selected inline attributes", :with_cuprite do + it "correctly parses custom selected inline attributes" do # Highlight only one attribute highlighting.switch_inline_attribute_highlight "Priority" diff --git a/spec/features/work_packages/new/new_work_package_datepicker_spec.rb b/spec/features/work_packages/new/new_work_package_datepicker_spec.rb index 8fc6f7213d89..9c97a0e7bf15 100644 --- a/spec/features/work_packages/new/new_work_package_datepicker_spec.rb +++ b/spec/features/work_packages/new/new_work_package_datepicker_spec.rb @@ -34,7 +34,7 @@ require "features/work_packages/work_packages_page" RSpec.describe "New work package datepicker", - :js, :with_cuprite, with_settings: { date_format: "%Y-%m-%d" } do + :js, with_settings: { date_format: "%Y-%m-%d" } do let(:project) { create(:project_with_types, public: true) } let(:user) { create(:admin) } diff --git a/spec/features/work_packages/new/new_work_package_spec.rb b/spec/features/work_packages/new/new_work_package_spec.rb index 00103ff2e120..660a9f66affb 100644 --- a/spec/features/work_packages/new/new_work_package_spec.rb +++ b/spec/features/work_packages/new/new_work_package_spec.rb @@ -3,7 +3,7 @@ require "features/work_packages/work_packages_page" require "features/page_objects/notification" -RSpec.describe "new work package", :js, :with_cuprite do +RSpec.describe "new work package", :js do shared_let(:status) { create(:status, is_default: true) } shared_let(:priority) { create(:priority, is_default: true) } shared_let(:type_task) { create(:type_task) } diff --git a/spec/features/work_packages/progress_modal_spec.rb b/spec/features/work_packages/progress_modal_spec.rb index 49780f3dfaa4..ed2700786b89 100644 --- a/spec/features/work_packages/progress_modal_spec.rb +++ b/spec/features/work_packages/progress_modal_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Progress modal", :js, :with_cuprite do +RSpec.describe "Progress modal", :js do shared_let(:user) { create(:admin) } shared_let(:role) { create(:project_role) } diff --git a/spec/features/work_packages/remaining_time_spec.rb b/spec/features/work_packages/remaining_time_spec.rb index c2700b9a3604..2e4aecdc74e3 100644 --- a/spec/features/work_packages/remaining_time_spec.rb +++ b/spec/features/work_packages/remaining_time_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Work packages remaining time", :js, :with_cuprite do +RSpec.describe "Work packages remaining time", :js do shared_current_user { create(:admin) } shared_let(:project) do create(:project, diff --git a/spec/features/work_packages/reminders_spec.rb b/spec/features/work_packages/reminders_spec.rb index 07a704165f44..6310e6eda7b8 100644 --- a/spec/features/work_packages/reminders_spec.rb +++ b/spec/features/work_packages/reminders_spec.rb @@ -31,8 +31,7 @@ require "spec_helper" RSpec.describe "Work package reminder modal", - :js, - :with_cuprite do + :js do let!(:project) { create(:project) } let!(:work_package) { create(:work_package, project:) } let!(:role_that_allows_managing_own_reminders) do diff --git a/spec/features/work_packages/share/access_spec.rb b/spec/features/work_packages/share/access_spec.rb index 8698b242db9e..bb8782a91a66 100644 --- a/spec/features/work_packages/share/access_spec.rb +++ b/spec/features/work_packages/share/access_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Shared Work Package Access", - :js, :with_cuprite, - with_ee: %i[work_package_sharing] do + :js, with_ee: %i[work_package_sharing] do shared_let(:project) { create(:project_with_types) } # This custom field is not explicitly displayed, but it's purpose is to ensure there are no errors # on the overview page while displaying project attributes. diff --git a/spec/features/work_packages/share/bulk_sharing_spec.rb b/spec/features/work_packages/share/bulk_sharing_spec.rb index c5cb37d53761..7dcef684ce89 100644 --- a/spec/features/work_packages/share/bulk_sharing_spec.rb +++ b/spec/features/work_packages/share/bulk_sharing_spec.rb @@ -31,8 +31,7 @@ require "spec_helper" RSpec.describe "Work Packages", "Bulk Sharing", - :js, :with_cuprite, - with_ee: %i[work_package_sharing] do + :js, with_ee: %i[work_package_sharing] do shared_let(:view_work_package_role) { create(:view_work_package_role) } shared_let(:comment_work_package_role) { create(:comment_work_package_role) } shared_let(:edit_work_package_role) { create(:edit_work_package_role) } diff --git a/spec/features/work_packages/share/enterprise_restriction_spec.rb b/spec/features/work_packages/share/enterprise_restriction_spec.rb index 059f59aca1ef..f4518abe582c 100644 --- a/spec/features/work_packages/share/enterprise_restriction_spec.rb +++ b/spec/features/work_packages/share/enterprise_restriction_spec.rb @@ -30,7 +30,7 @@ require "rails_helper" -RSpec.describe "Work Package Sharing Enterprise Restriction", :js, :with_cuprite do +RSpec.describe "Work Package Sharing Enterprise Restriction", :js do shared_let(:view_work_package_role) { create(:view_work_package_role) } shared_let(:comment_work_package_role) { create(:comment_work_package_role) } shared_let(:edit_work_package_role) { create(:edit_work_package_role) } diff --git a/spec/features/work_packages/share/filter_spec.rb b/spec/features/work_packages/share/filter_spec.rb index eaefdcbf6f75..93a61267a621 100644 --- a/spec/features/work_packages/share/filter_spec.rb +++ b/spec/features/work_packages/share/filter_spec.rb @@ -31,8 +31,7 @@ require "spec_helper" RSpec.describe "Work package sharing", - :js, :with_cuprite, - with_ee: %i[work_package_sharing] do + :js, with_ee: %i[work_package_sharing] do shared_let(:view_work_package_role) { create(:view_work_package_role) } shared_let(:comment_work_package_role) { create(:comment_work_package_role) } shared_let(:edit_work_package_role) { create(:edit_work_package_role) } diff --git a/spec/features/work_packages/share/multi_invite_spec.rb b/spec/features/work_packages/share/multi_invite_spec.rb index b7f24326c332..5952c5d2f2fc 100644 --- a/spec/features/work_packages/share/multi_invite_spec.rb +++ b/spec/features/work_packages/share/multi_invite_spec.rb @@ -31,8 +31,7 @@ require "spec_helper" RSpec.describe "Work package sharing", - :js, :with_cuprite, - with_ee: %i[work_package_sharing] do + :js, with_ee: %i[work_package_sharing] do shared_let(:view_work_package_role) { create(:view_work_package_role) } shared_let(:comment_work_package_role) { create(:comment_work_package_role) } shared_let(:edit_work_package_role) { create(:edit_work_package_role) } diff --git a/spec/features/work_packages/share/notification_spec.rb b/spec/features/work_packages/share/notification_spec.rb index 03fa30e349e2..ce28932522d2 100644 --- a/spec/features/work_packages/share/notification_spec.rb +++ b/spec/features/work_packages/share/notification_spec.rb @@ -30,7 +30,6 @@ RSpec.describe "Notifications sent on shared work packages", :js, - :with_cuprite, with_ee: %i[work_package_sharing] do # Notice that the setup in this file here is not following the normal rules as # it also tests notification creation. diff --git a/spec/features/work_packages/share/share_account_activation_spec.rb b/spec/features/work_packages/share/share_account_activation_spec.rb index 37c7cd28d2db..33fc571e1bf2 100644 --- a/spec/features/work_packages/share/share_account_activation_spec.rb +++ b/spec/features/work_packages/share/share_account_activation_spec.rb @@ -31,8 +31,7 @@ require "spec_helper" RSpec.describe "Work package sharing invited users", - :js, :with_cuprite, - with_ee: %i[work_package_sharing] do + :js, with_ee: %i[work_package_sharing] do shared_let(:edit_work_package_role) { create(:edit_work_package_role) } shared_let(:comment_work_package_role) { create(:comment_work_package_role) } shared_let(:view_work_package_role) { create(:view_work_package_role) } diff --git a/spec/features/work_packages/share/share_spec.rb b/spec/features/work_packages/share/share_spec.rb index 321c5edef564..ed13df5dbcbf 100644 --- a/spec/features/work_packages/share/share_spec.rb +++ b/spec/features/work_packages/share/share_spec.rb @@ -31,8 +31,7 @@ require "spec_helper" RSpec.describe "Work package sharing", - :js, :with_cuprite, - with_ee: %i[work_package_sharing] do + :js, with_ee: %i[work_package_sharing] do shared_let(:view_work_package_role) { create(:view_work_package_role) } shared_let(:comment_work_package_role) { create(:comment_work_package_role) } shared_let(:edit_work_package_role) { create(:edit_work_package_role) } diff --git a/spec/features/work_packages/table/baseline/baseline_query_spec.rb b/spec/features/work_packages/table/baseline/baseline_query_spec.rb index 78e1c6484447..eb278554a95e 100644 --- a/spec/features/work_packages/table/baseline/baseline_query_spec.rb +++ b/spec/features/work_packages/table/baseline/baseline_query_spec.rb @@ -30,7 +30,6 @@ RSpec.describe "baseline query saving", :js, - :with_cuprite, with_ee: %i[baseline_comparison], with_settings: { date_format: "%Y-%m-%d" } do shared_let(:project) { create(:project) } diff --git a/spec/features/work_packages/table/baseline/baseline_rendering_spec.rb b/spec/features/work_packages/table/baseline/baseline_rendering_spec.rb index 2f879c0c064d..5aca12695e10 100644 --- a/spec/features/work_packages/table/baseline/baseline_rendering_spec.rb +++ b/spec/features/work_packages/table/baseline/baseline_rendering_spec.rb @@ -30,7 +30,6 @@ RSpec.describe "baseline rendering", :js, - :with_cuprite, with_settings: { date_format: "%Y-%m-%d" } do shared_let(:list_wp_custom_field) { create(:list_wp_custom_field) } shared_let(:multi_list_wp_custom_field) { create(:list_wp_custom_field, multi_value: true) } diff --git a/spec/features/work_packages/table/context_menu/context_menu_spec.rb b/spec/features/work_packages/table/context_menu/context_menu_spec.rb index 33bc4e857d4b..28e4b2610b0d 100644 --- a/spec/features/work_packages/table/context_menu/context_menu_spec.rb +++ b/spec/features/work_packages/table/context_menu/context_menu_spec.rb @@ -2,8 +2,7 @@ require_relative "context_menu_shared_examples" RSpec.describe "Work package table context menu", - :js, - :with_cuprite do + :js do shared_let(:user) { create(:admin) } shared_let(:project) { create(:project, enabled_module_names: %i[work_package_tracking gantt costs]) } shared_let(:work_package) { create(:work_package, project:) } diff --git a/spec/features/work_packages/table/hierarchy/hierarchy_indent_spec.rb b/spec/features/work_packages/table/hierarchy/hierarchy_indent_spec.rb index aef59c3dd233..70509359a7f9 100644 --- a/spec/features/work_packages/table/hierarchy/hierarchy_indent_spec.rb +++ b/spec/features/work_packages/table/hierarchy/hierarchy_indent_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Work Package table hierarchy and sorting", :js, :with_cuprite do +RSpec.describe "Work Package table hierarchy and sorting", :js do shared_let(:project) { create(:project) } let(:wp_table) { Pages::WorkPackagesTable.new(project) } diff --git a/spec/features/work_packages/table/queries/assignee_filter_spec.rb b/spec/features/work_packages/table/queries/assignee_filter_spec.rb index c32766347cf6..3cb20c185714 100644 --- a/spec/features/work_packages/table/queries/assignee_filter_spec.rb +++ b/spec/features/work_packages/table/queries/assignee_filter_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Work package filtering by assignee", :js, :with_cuprite do +RSpec.describe "Work package filtering by assignee", :js do include Components::Autocompleter::NgSelectAutocompleteHelpers let(:project) { create(:project) } diff --git a/spec/features/work_packages/table/queries/assignees_role_filter_spec.rb b/spec/features/work_packages/table/queries/assignees_role_filter_spec.rb index 84be29fdb002..78439be05f89 100644 --- a/spec/features/work_packages/table/queries/assignees_role_filter_spec.rb +++ b/spec/features/work_packages/table/queries/assignees_role_filter_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Work package filtering by assignee's role", :js, :with_cuprite do +RSpec.describe "Work package filtering by assignee's role", :js do shared_let(:project) { create(:project) } shared_let(:manager_role) { create(:project_role, permissions: %i[view_members view_work_packages save_queries]) } diff --git a/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb b/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb index dd6bbddced62..272d54179058 100644 --- a/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb +++ b/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe 'Filter by date with "is empty"', :js, :with_cuprite do +RSpec.describe 'Filter by date with "is empty"', :js do let(:user) { create(:admin) } let(:project) { create(:project) } diff --git a/spec/features/work_packages/table/queries/filter_spec.rb b/spec/features/work_packages/table/queries/filter_spec.rb index 9c5276367032..58b1fcdc2929 100644 --- a/spec/features/work_packages/table/queries/filter_spec.rb +++ b/spec/features/work_packages/table/queries/filter_spec.rb @@ -550,7 +550,7 @@ wp_table.ensure_work_package_not_listed! wp_updated_3d_ago, wp_updated_5d_ago end - it "filters between date by updated_at", :with_cuprite do + it "filters between date by updated_at" do wp_table.visit! loading_indicator_saveguard wp_table.expect_work_package_listed wp_updated_today, wp_updated_3d_ago, wp_updated_5d_ago diff --git a/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb b/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb index 0d9ad2774c83..b5def69faaad 100644 --- a/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb +++ b/spec/features/work_packages/table/queries/mobile_date_filter_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "mobile date filter work packages", :js, :with_cuprite do +RSpec.describe "mobile date filter work packages", :js do shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:wp_table) { Pages::WorkPackagesTable.new(project) } diff --git a/spec/features/work_packages/table/queries/shared_with_user_filter_spec.rb b/spec/features/work_packages/table/queries/shared_with_user_filter_spec.rb index 6ca1bd6d5473..6127a47abc5f 100644 --- a/spec/features/work_packages/table/queries/shared_with_user_filter_spec.rb +++ b/spec/features/work_packages/table/queries/shared_with_user_filter_spec.rb @@ -32,8 +32,7 @@ RSpec.describe "Work package filtering", "by shared with user", - :js, - :with_cuprite do + :js do shared_let(:visible_project) do create(:project_with_types) end diff --git a/spec/features/work_packages/tabs/activity_revisions_spec.rb b/spec/features/work_packages/tabs/activity_revisions_spec.rb index 62a5da663f8e..2ca392e9f6f8 100644 --- a/spec/features/work_packages/tabs/activity_revisions_spec.rb +++ b/spec/features/work_packages/tabs/activity_revisions_spec.rb @@ -3,7 +3,7 @@ require "features/work_packages/work_packages_page" require "support/edit_fields/edit_field" -RSpec.describe "Activity tab", :js, :with_cuprite do +RSpec.describe "Activity tab", :js do let(:project) { create(:project_with_types, public: true) } let(:creation_time) { 5.days.ago } diff --git a/spec/features/work_packages/tabs/activity_tab_spec.rb b/spec/features/work_packages/tabs/activity_tab_spec.rb index 11b30cc1e1c7..850095013d0e 100644 --- a/spec/features/work_packages/tabs/activity_tab_spec.rb +++ b/spec/features/work_packages/tabs/activity_tab_spec.rb @@ -31,7 +31,7 @@ require "features/work_packages/work_packages_page" require "support/edit_fields/edit_field" -RSpec.describe "Activity tab", :js, :with_cuprite do +RSpec.describe "Activity tab", :js do let(:project) do create(:project_with_types, types: [type_with_cf], diff --git a/spec/features/work_packages/tabs/watcher_tab_spec.rb b/spec/features/work_packages/tabs/watcher_tab_spec.rb index debd55015aec..2de8e50f6458 100644 --- a/spec/features/work_packages/tabs/watcher_tab_spec.rb +++ b/spec/features/work_packages/tabs/watcher_tab_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Watcher tab", :js, :selenium, :with_cuprite do +RSpec.describe "Watcher tab", :js, :selenium do include Components::Autocompleter::NgSelectAutocompleteHelpers let!(:standard_global_role) { create(:empty_global_role) } diff --git a/spec/features/work_packages/update_ancestors_spec.rb b/spec/features/work_packages/update_ancestors_spec.rb index 2f980fdad2b2..f7f5c85df1ce 100644 --- a/spec/features/work_packages/update_ancestors_spec.rb +++ b/spec/features/work_packages/update_ancestors_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Update ancestors", :js, :with_cuprite do +RSpec.describe "Update ancestors", :js do shared_let(:user) { create(:admin) } shared_let(:priority) { create(:default_priority) } shared_let(:new_status) { create(:default_status, name: "New") } diff --git a/spec/features/work_packages/work_package_index_spec.rb b/spec/features/work_packages/work_package_index_spec.rb index 6cf4804271ca..995bb51e4cd1 100644 --- a/spec/features/work_packages/work_package_index_spec.rb +++ b/spec/features/work_packages/work_package_index_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Work Packages", "index view", :js, :with_cuprite do +RSpec.describe "Work Packages", "index view", :js do shared_let(:user) { create(:admin) } shared_let(:project) { create(:project, enabled_module_names: %w[work_package_tracking]) } diff --git a/spec/features/wysiwyg/autosave_spec.rb b/spec/features/wysiwyg/autosave_spec.rb index 5d1edb792401..82b517934fa1 100644 --- a/spec/features/wysiwyg/autosave_spec.rb +++ b/spec/features/wysiwyg/autosave_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Wysiwyg autosave spec", - :js, - :with_cuprite do + :js do shared_let(:user) { create(:admin) } shared_let(:project) { create(:project, enabled_module_names: %w[wiki work_package_tracking]) } shared_let(:work_package) { create(:work_package, subject: "Foobar", project:) } diff --git a/spec/features/wysiwyg/bold_behavior_spec.rb b/spec/features/wysiwyg/bold_behavior_spec.rb index 37374ff5416c..1d71f958f270 100644 --- a/spec/features/wysiwyg/bold_behavior_spec.rb +++ b/spec/features/wysiwyg/bold_behavior_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Wysiwyg bold behavior", :js, :with_cuprite do +RSpec.describe "Wysiwyg bold behavior", :js do current_user { create(:admin) } let(:project) { create(:project, enabled_module_names: %w[wiki]) } diff --git a/spec/features/wysiwyg/macros/embedded_tables_spec.rb b/spec/features/wysiwyg/macros/embedded_tables_spec.rb index fd632db5f541..1ba9130de226 100644 --- a/spec/features/wysiwyg/macros/embedded_tables_spec.rb +++ b/spec/features/wysiwyg/macros/embedded_tables_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Wysiwyg embedded work package tables", - :js, - :with_cuprite do + :js do shared_let(:admin) { create(:admin) } shared_let(:type_task) { create(:type_task) } shared_let(:type_bug) { create(:type_bug) } diff --git a/spec/features/wysiwyg/mentions_spec.rb b/spec/features/wysiwyg/mentions_spec.rb index 1396cf53b5ea..e6c46c5980a1 100644 --- a/spec/features/wysiwyg/mentions_spec.rb +++ b/spec/features/wysiwyg/mentions_spec.rb @@ -29,8 +29,7 @@ require "spec_helper" RSpec.describe "Wysiwyg work package mentions", - :js, - :with_cuprite do + :js do let!(:user) do create(:admin, firstname: "MeMyself", lastname: "AndI", member_with_permissions: { project => %i[view_work_packages edit_work_packages] }) From b214c61315a0aae47fc84e1b30fcadc87d2c0e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 13 Jan 2025 15:19:28 +0100 Subject: [PATCH 6/9] Reset some specs --- lib/tasks/parallel_testing.rake | 2 +- .../spec/features/bcf_view_management_spec.rb | 2 +- modules/bim/spec/features/bim_filter_spec.rb | 2 +- .../spec/features/card_view/select_card_spec.rb | 5 ++++- .../switch_display_representations_spec.rb | 4 +++- .../ifc_models/direct_ifc_upload_spec.rb | 5 ++++- .../bim/spec/features/model_management_spec.rb | 2 +- modules/bim/spec/features/model_viewer_spec.rb | 5 ++++- .../features/viewer/create_viewpoint_spec.rb | 5 ++++- .../features/viewer/delete_viewpoint_spec.rb | 2 +- .../action_boards/assignee_board_spec.rb | 4 +++- .../action_boards/custom_field_filters_spec.rb | 5 ++++- .../features/action_boards/status_board_spec.rb | 5 ++++- .../status_type_moving_board_spec.rb | 1 + .../action_boards/subproject_board_spec.rb | 5 ++++- .../action_boards/subtasks_board_spec.rb | 2 +- .../features/action_boards/version_board_spec.rb | 5 ++++- .../spec/features/board_highlighting_spec.rb | 2 +- .../spec/features/board_management_spec.rb | 2 +- .../spec/features/board_navigation_spec.rb | 1 + .../boards/spec/features/board_overview_spec.rb | 1 + .../board_reference_work_package_spec.rb | 5 ++++- .../boards/spec/features/board_update_spec.rb | 5 ++++- .../spec/features/boards_global_create_spec.rb | 1 + .../boards/spec/features/boards_sorting_spec.rb | 5 ++++- .../features/budgets/attachment_upload_spec.rb | 2 +- .../spec/features/budgets/update_budget_spec.rb | 2 +- .../spec/features/costs_edit_fields_spec.rb | 4 +++- .../calendar_create_work_package_spec.rb | 2 +- .../features/calendar_project_include_spec.rb | 2 +- .../features/calendar_user_interaction_spec.rb | 4 +++- .../spec/features/project_status_spec.rb | 2 +- .../features/work_package_graph_overview_spec.rb | 2 +- .../spec/features/work_package_graph_spec.rb | 5 ++++- .../spec/features/work_package_table_spec.rb | 2 +- .../spec/features/attachment_upload_spec.rb | 4 +++- .../meeting/spec/features/meetings_new_spec.rb | 14 +++++++------- .../my_page/spec/features/my/accountable_spec.rb | 4 +++- .../spec/features/my/assigned_to_me_spec.rb | 2 +- .../my_page/spec/features/my/custom_text_spec.rb | 4 +++- .../my_page/spec/features/my/documents_spec.rb | 4 +++- modules/my_page/spec/features/my/my_page_spec.rb | 4 +++- modules/my_page/spec/features/my/news_spec.rb | 4 +++- .../my/time_entries_current_user_spec.rb | 2 +- .../spec/features/my/work_package_table_spec.rb | 4 +++- .../spec/features/managing_overview_page_spec.rb | 2 +- .../spec/features/export_timesheet_spec.rb | 2 +- .../spec/features/update_cost_report_spec.rb | 2 +- .../spec/features/update_entries_spec.rb | 2 +- .../spec/features/manage_project_storage_spec.rb | 6 +++++- .../storages/admin/create_storage_spec.rb | 1 + .../features/storages/admin/edit_storage_spec.rb | 1 + .../storages/admin/index_storages_spec.rb | 1 + .../project_settings/oauth_access_grant_spec.rb | 1 + ...am_planner_add_existing_work_packages_spec.rb | 4 +++- .../features/team_planner_context_menu_spec.rb | 1 + .../spec/features/team_planner_create_spec.rb | 5 ++++- .../spec/features/team_planner_dates_spec.rb | 4 +++- .../features/team_planner_error_handling_spec.rb | 4 +++- .../features/team_planner_global_create_spec.rb | 1 + .../spec/features/team_planner_index_spec.rb | 5 ++++- .../spec/features/team_planner_menu_spec.rb | 4 +++- .../spec/features/team_planner_overview_spec.rb | 2 ++ .../team_planner_project_include_spec.rb | 5 ++++- .../features/team_planner_remove_event_spec.rb | 1 + .../spec/features/team_planner_spec.rb | 1 + .../features/team_planner_split_view_spec.rb | 5 ++++- .../team_planner_subproject_constraints_spec.rb | 1 + .../spec/features/team_planner_upsale_spec.rb | 4 +++- .../team_planner_user_interaction_spec.rb | 1 + .../features/team_planner_view_modes_spec.rb | 5 ++++- .../admin_edit_two_factor_devices_spec.rb | 2 +- .../spec/features/manage_webhooks_spec.rb | 2 +- spec/features/a11y/home_spec.rb | 2 +- spec/features/admin/attribute_help_texts_spec.rb | 4 +++- spec/features/admin/backup_spec.rb | 2 +- .../multi_value_custom_fields_spec.rb | 2 +- spec/features/api_docs/index_spec.rb | 2 +- spec/features/auth/consent_auth_stage_spec.rb | 1 + .../custom_fields/reorder_options_spec.rb | 2 +- spec/features/forums/attachment_upload_spec.rb | 2 +- spec/features/forums/message_spec.rb | 2 +- spec/features/my/sessions_management_spec.rb | 2 +- .../notification_center_spec.rb | 14 ++++++++------ .../oauth/authorization_code_flow_spec.rb | 2 +- spec/features/onboarding/onboarding_tour_spec.rb | 2 +- spec/features/projects/favorite_spec.rb | 2 +- .../overview_page/dialog/validation_spec.rb | 2 +- .../search/recently_viewed_work_packages_spec.rb | 1 + spec/features/search/search_spec.rb | 2 +- spec/features/types/form_configuration_spec.rb | 2 +- .../types/reset_form_configuration_spec.rb | 4 +++- .../invite_user_modal/invite_user_modal_spec.rb | 2 +- spec/features/users/user_memberships_spec.rb | 2 +- spec/features/versions/graph_spec.rb | 2 +- .../features/wiki/adding_editing_history_spec.rb | 2 +- spec/features/wiki/attachment_upload_spec.rb | 2 +- spec/features/wiki/child_pages_spec.rb | 2 +- .../wiki/wiki_page_external_link_spec.rb | 2 +- .../attachments/attachment_upload_spec.rb | 16 ++++++++-------- .../work_packages/cancel_editing_spec.rb | 2 +- .../work_packages/details/context_menu_spec.rb | 2 +- .../details/markdown/activity_comments_spec.rb | 2 +- .../details/markdown/todolist_spec.rb | 2 +- ...tch_display_representations_on_mobile_spec.rb | 2 +- spec/features/work_packages/export_spec.rb | 2 +- spec/features/work_packages/highlighting_spec.rb | 4 +++- .../new/work_package_default_description_spec.rb | 2 +- .../work_packages/sorting/manual_sorting_spec.rb | 2 +- .../table/group_by/group_by_progress_spec.rb | 2 +- .../table/hierarchy/parent_column_spec.rb | 2 +- .../inline_create/create_work_packages_spec.rb | 2 +- .../table/queries/date_is_empty_filter_spec.rb | 2 +- .../table/queries/id_filter_spec.rb | 2 +- .../table/queries/query_history_spec.rb | 2 +- .../table/queries/query_name_inline_edit_spec.rb | 2 +- .../work_packages_table_project_include_spec.rb | 2 +- .../wysiwyg/macros/code_block_macro_spec.rb | 2 +- .../wysiwyg/work_package_linking_spec.rb | 2 +- 119 files changed, 233 insertions(+), 120 deletions(-) diff --git a/lib/tasks/parallel_testing.rake b/lib/tasks/parallel_testing.rake index 56c49d81bab4..f78856e70772 100644 --- a/lib/tasks/parallel_testing.rake +++ b/lib/tasks/parallel_testing.rake @@ -67,7 +67,7 @@ namespace :parallel do end def group_option_string(parsed_options) - group_options = parsed_options ? "-n #{parsed_options[:num_cpus]}" : "" + group_options = parsed_options[:num_cpus] ? "-n #{parsed_options[:num_cpus]}" : "" group_options += " --only-group #{parsed_options[:group]}" if parsed_options[:group] group_options diff --git a/modules/bim/spec/features/bcf_view_management_spec.rb b/modules/bim/spec/features/bcf_view_management_spec.rb index 452e8e1e04ac..e602e255f938 100644 --- a/modules/bim/spec/features/bcf_view_management_spec.rb +++ b/modules/bim/spec/features/bcf_view_management_spec.rb @@ -31,7 +31,7 @@ require_relative "../support/pages/ifc_models/show_default" require_relative "../../../../spec/features/views/shared_examples" -RSpec.describe "bcf view management", :js, with_config: { edition: "bim" } do +RSpec.describe "bcf view management", :js, :selenium, with_config: { edition: "bim" } do let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking]) } let(:bcf_page) { Pages::IfcModels::ShowDefault.new(project) } let(:role) do diff --git a/modules/bim/spec/features/bim_filter_spec.rb b/modules/bim/spec/features/bim_filter_spec.rb index 162a120fe39d..6ae63d70839f 100644 --- a/modules/bim/spec/features/bim_filter_spec.rb +++ b/modules/bim/spec/features/bim_filter_spec.rb @@ -31,7 +31,7 @@ require_relative "../support/pages/ifc_models/show" require_relative "../support/pages/ifc_models/show_default" -RSpec.describe "BIM filter spec", :js, with_config: { edition: "bim" } do +RSpec.describe "BIM filter spec", :js, :selenium, with_config: { edition: "bim" } do let(:project) { create(:project, enabled_module_names: %w(bim work_package_tracking)) } let(:open_status) { create(:status, is_closed: false) } let(:closed_status) { create(:status, is_closed: true) } diff --git a/modules/bim/spec/features/card_view/select_card_spec.rb b/modules/bim/spec/features/card_view/select_card_spec.rb index 31553fc8f704..db5b8273858f 100644 --- a/modules/bim/spec/features/card_view/select_card_spec.rb +++ b/modules/bim/spec/features/card_view/select_card_spec.rb @@ -29,7 +29,10 @@ require "spec_helper" require_relative "../../support/pages/ifc_models/show_default" -RSpec.describe "Selecting cards in the card view (regression #31962)", :js, with_config: { edition: "bim" } do +RSpec.describe "Selecting cards in the card view (regression #31962)", + :js, + :selenium, + with_config: { edition: "bim" } do let(:user) { create(:admin) } let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking]) } let(:wp_table) { Pages::IfcModels::ShowDefault.new(project) } diff --git a/modules/bim/spec/features/display_representations/switch_display_representations_spec.rb b/modules/bim/spec/features/display_representations/switch_display_representations_spec.rb index 749a546fc125..5dbbb6262b52 100644 --- a/modules/bim/spec/features/display_representations/switch_display_representations_spec.rb +++ b/modules/bim/spec/features/display_representations/switch_display_representations_spec.rb @@ -30,7 +30,9 @@ require_relative "../../support/pages/ifc_models/show_default" RSpec.describe "Switching work package view", - :js, with_config: { edition: "bim" }, with_ee: %i[conditional_highlighting] do + :js, + :selenium, + with_config: { edition: "bim" }, with_ee: %i[conditional_highlighting] do let(:user) { create(:admin) } let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking]) } let(:wp_page) { Pages::IfcModels::ShowDefault.new(project) } diff --git a/modules/bim/spec/features/ifc_models/direct_ifc_upload_spec.rb b/modules/bim/spec/features/ifc_models/direct_ifc_upload_spec.rb index 52e2187d7c46..9f8760a1b508 100644 --- a/modules/bim/spec/features/ifc_models/direct_ifc_upload_spec.rb +++ b/modules/bim/spec/features/ifc_models/direct_ifc_upload_spec.rb @@ -29,7 +29,10 @@ require "spec_helper" require_relative "ifc_upload_shared_examples" -RSpec.describe "direct IFC upload", :js, with_config: { edition: "bim" }, with_direct_uploads: :redirect do +RSpec.describe "direct IFC upload", + :js, + :selenium, + with_config: { edition: "bim" }, with_direct_uploads: :redirect do it_behaves_like "can upload an IFC file" do # with direct upload, we don't get the model name let(:model_name) { "model.ifc" } diff --git a/modules/bim/spec/features/model_management_spec.rb b/modules/bim/spec/features/model_management_spec.rb index e484c9e9bd7a..42a6425b3297 100644 --- a/modules/bim/spec/features/model_management_spec.rb +++ b/modules/bim/spec/features/model_management_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/ifc_models/index" -RSpec.describe "model management", :js, with_config: { edition: "bim" } do +RSpec.describe "model management", :js, :selenium, with_config: { edition: "bim" } do let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking]) } let(:index_page) { Pages::IfcModels::Index.new(project) } let(:role) { create(:project_role, permissions: %i[view_ifc_models manage_bcf manage_ifc_models view_work_packages]) } diff --git a/modules/bim/spec/features/model_viewer_spec.rb b/modules/bim/spec/features/model_viewer_spec.rb index 7fb1247de589..9750418d23fa 100644 --- a/modules/bim/spec/features/model_viewer_spec.rb +++ b/modules/bim/spec/features/model_viewer_spec.rb @@ -28,7 +28,10 @@ require_relative "../spec_helper" -RSpec.describe "model viewer", :js, with_config: { edition: "bim" } do +RSpec.describe "model viewer", + :js, + :selenium, + with_config: { edition: "bim" } do let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking]) } # TODO: Add empty viewpoint and stub method to load viewpoints once defined let(:work_package) { create(:work_package, project:) } diff --git a/modules/bim/spec/features/viewer/create_viewpoint_spec.rb b/modules/bim/spec/features/viewer/create_viewpoint_spec.rb index 877be36ddea8..c683ea078b0c 100644 --- a/modules/bim/spec/features/viewer/create_viewpoint_spec.rb +++ b/modules/bim/spec/features/viewer/create_viewpoint_spec.rb @@ -28,7 +28,10 @@ require_relative "../../spec_helper" -RSpec.describe "Create viewpoint from BCF details page", :js, with_config: { edition: "bim" } do +RSpec.describe "Create viewpoint from BCF details page", + :js, + :selenium, + with_config: { edition: "bim" } do let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking]) } let(:user) { create(:admin) } diff --git a/modules/bim/spec/features/viewer/delete_viewpoint_spec.rb b/modules/bim/spec/features/viewer/delete_viewpoint_spec.rb index a519ae481e62..4433dde58d14 100644 --- a/modules/bim/spec/features/viewer/delete_viewpoint_spec.rb +++ b/modules/bim/spec/features/viewer/delete_viewpoint_spec.rb @@ -28,7 +28,7 @@ require_relative "../../spec_helper" -RSpec.describe "Delete viewpoint in model viewer", :js, with_config: { edition: "bim" } do +RSpec.describe "Delete viewpoint in model viewer", :js, :selenium, with_config: { edition: "bim" } do let(:project) { create(:project, enabled_module_names: %i[bim work_package_tracking]) } let(:user) { create(:admin) } diff --git a/modules/boards/spec/features/action_boards/assignee_board_spec.rb b/modules/boards/spec/features/action_boards/assignee_board_spec.rb index 5705ebb95f41..9ad0b218e4bb 100644 --- a/modules/boards/spec/features/action_boards/assignee_board_spec.rb +++ b/modules/boards/spec/features/action_boards/assignee_board_spec.rb @@ -30,7 +30,9 @@ require_relative "../support/board_index_page" require_relative "../support/board_page" -RSpec.describe "Assignee action board", :js, +RSpec.describe "Assignee action board", + :js, + :selenium, with_ee: %i[board_view] do let(:bobself_user) do create(:user, diff --git a/modules/boards/spec/features/action_boards/custom_field_filters_spec.rb b/modules/boards/spec/features/action_boards/custom_field_filters_spec.rb index 4ada7ca25fcc..a604b51b13d0 100644 --- a/modules/boards/spec/features/action_boards/custom_field_filters_spec.rb +++ b/modules/boards/spec/features/action_boards/custom_field_filters_spec.rb @@ -30,7 +30,10 @@ require_relative "../support//board_index_page" require_relative "../support/board_page" -RSpec.describe "Custom field filter in boards", :js, with_ee: %i[board_view] do +RSpec.describe "Custom field filter in boards", + :js, + :selenium, + with_ee: %i[board_view] do let(:user) do create(:user, member_with_roles: { project => role }) diff --git a/modules/boards/spec/features/action_boards/status_board_spec.rb b/modules/boards/spec/features/action_boards/status_board_spec.rb index 90166cd9878f..04d72c58df25 100644 --- a/modules/boards/spec/features/action_boards/status_board_spec.rb +++ b/modules/boards/spec/features/action_boards/status_board_spec.rb @@ -30,7 +30,10 @@ require_relative "../support//board_index_page" require_relative "../support/board_page" -RSpec.describe "Status action board", :js, with_ee: %i[board_view] do +RSpec.describe "Status action board", + :js, + :selenium, + with_ee: %i[board_view] do let(:user) do create(:user, member_with_roles: { project => role }) diff --git a/modules/boards/spec/features/action_boards/status_type_moving_board_spec.rb b/modules/boards/spec/features/action_boards/status_type_moving_board_spec.rb index 3435fec0d3ce..e4271110be17 100644 --- a/modules/boards/spec/features/action_boards/status_type_moving_board_spec.rb +++ b/modules/boards/spec/features/action_boards/status_type_moving_board_spec.rb @@ -32,6 +32,7 @@ RSpec.describe "Status action board", :js, + :selenium, with_ee: %i[board_view] do let(:user) do create(:user, diff --git a/modules/boards/spec/features/action_boards/subproject_board_spec.rb b/modules/boards/spec/features/action_boards/subproject_board_spec.rb index 96d9fa5782ea..fc66521fe71a 100644 --- a/modules/boards/spec/features/action_boards/subproject_board_spec.rb +++ b/modules/boards/spec/features/action_boards/subproject_board_spec.rb @@ -30,7 +30,10 @@ require_relative "../support//board_index_page" require_relative "../support/board_page" -RSpec.describe "Subproject action board", :js, with_ee: %i[board_view] do +RSpec.describe "Subproject action board", + :js, + :selenium, + with_ee: %i[board_view] do let(:user) do create(:user, member_with_roles: { project => role }) diff --git a/modules/boards/spec/features/action_boards/subtasks_board_spec.rb b/modules/boards/spec/features/action_boards/subtasks_board_spec.rb index 55e3e5987953..2e583b1aeb32 100644 --- a/modules/boards/spec/features/action_boards/subtasks_board_spec.rb +++ b/modules/boards/spec/features/action_boards/subtasks_board_spec.rb @@ -30,7 +30,7 @@ require_relative "../support//board_index_page" require_relative "../support/board_page" -RSpec.describe "Subtasks action board", :js, with_ee: %i[board_view] do +RSpec.describe "Subtasks action board", :js, :selenium, with_ee: %i[board_view] do let(:type) { create(:type_standard) } let(:project) { create(:project, types: [type], enabled_module_names: %i[work_package_tracking board_view]) } let(:role) { create(:project_role, permissions:) } diff --git a/modules/boards/spec/features/action_boards/version_board_spec.rb b/modules/boards/spec/features/action_boards/version_board_spec.rb index cb5b25ef4fac..cfa92f214e49 100644 --- a/modules/boards/spec/features/action_boards/version_board_spec.rb +++ b/modules/boards/spec/features/action_boards/version_board_spec.rb @@ -30,7 +30,10 @@ require_relative "../support//board_index_page" require_relative "../support/board_page" -RSpec.describe "Version action board", :js, with_ee: %i[board_view] do +RSpec.describe "Version action board", + :js, + :selenium, + with_ee: %i[board_view] do let(:user) do create(:user, member_with_roles: { project => role, second_project => role }) end diff --git a/modules/boards/spec/features/board_highlighting_spec.rb b/modules/boards/spec/features/board_highlighting_spec.rb index 2915d80eaa88..838b5af39112 100644 --- a/modules/boards/spec/features/board_highlighting_spec.rb +++ b/modules/boards/spec/features/board_highlighting_spec.rb @@ -30,7 +30,7 @@ require_relative "support/board_index_page" require_relative "support/board_page" -RSpec.describe "Work Package boards spec", :js, with_ee: %i[board_view] do +RSpec.describe "Work Package boards spec", :js, :selenium, with_ee: %i[board_view] do let(:user) do create(:user, member_with_roles: { project => role }) diff --git a/modules/boards/spec/features/board_management_spec.rb b/modules/boards/spec/features/board_management_spec.rb index b9b2acf501c2..ae58d4e78b41 100644 --- a/modules/boards/spec/features/board_management_spec.rb +++ b/modules/boards/spec/features/board_management_spec.rb @@ -30,7 +30,7 @@ require_relative "support/board_index_page" require_relative "support/board_page" -RSpec.describe "Board management spec", :js, with_ee: %i[board_view] do +RSpec.describe "Board management spec", :js, :selenium, with_ee: %i[board_view] do let(:user) do create(:user, member_with_roles: { project => role }) diff --git a/modules/boards/spec/features/board_navigation_spec.rb b/modules/boards/spec/features/board_navigation_spec.rb index 705917952b5d..3e63c1e06a1c 100644 --- a/modules/boards/spec/features/board_navigation_spec.rb +++ b/modules/boards/spec/features/board_navigation_spec.rb @@ -32,6 +32,7 @@ RSpec.describe "Work Package boards spec", :js, + :selenium, with_ee: %i[board_view] do let(:user) do create(:user, diff --git a/modules/boards/spec/features/board_overview_spec.rb b/modules/boards/spec/features/board_overview_spec.rb index ff8a747e9946..4ed9e28cac93 100644 --- a/modules/boards/spec/features/board_overview_spec.rb +++ b/modules/boards/spec/features/board_overview_spec.rb @@ -30,6 +30,7 @@ require_relative "support/board_overview_page" RSpec.describe "Work Package Boards Overview", + :js, with_ee: %i[board_view] do # The identifier is important to test https://community.openproject.com/wp/29754 shared_let(:project) do diff --git a/modules/boards/spec/features/board_reference_work_package_spec.rb b/modules/boards/spec/features/board_reference_work_package_spec.rb index 696d23bf218f..8463bea4a4ce 100644 --- a/modules/boards/spec/features/board_reference_work_package_spec.rb +++ b/modules/boards/spec/features/board_reference_work_package_spec.rb @@ -30,7 +30,10 @@ require_relative "support/board_index_page" require_relative "support/board_page" -RSpec.describe "Board reference work package spec", :js, with_ee: %i[board_view] do +RSpec.describe "Board reference work package spec", + :js, + :selenium, + with_ee: %i[board_view] do let(:user) do create(:user, member_with_roles: { project => role }) diff --git a/modules/boards/spec/features/board_update_spec.rb b/modules/boards/spec/features/board_update_spec.rb index ec69bfa85a1a..9fee82a1b54a 100644 --- a/modules/boards/spec/features/board_update_spec.rb +++ b/modules/boards/spec/features/board_update_spec.rb @@ -30,7 +30,10 @@ require_relative "support/board_index_page" require_relative "support/board_page" -RSpec.describe "Work Package boards updating spec", :js, with_ee: %i[board_view] do +RSpec.describe "Work Package boards updating spec", + :js, + :selenium, + with_ee: %i[board_view] do let(:admin) { create(:admin) } let(:project) { create(:project, enabled_module_names: %i[work_package_tracking board_view]) } diff --git a/modules/boards/spec/features/boards_global_create_spec.rb b/modules/boards/spec/features/boards_global_create_spec.rb index 3bdcc098d23b..8b51a1df3e89 100644 --- a/modules/boards/spec/features/boards_global_create_spec.rb +++ b/modules/boards/spec/features/boards_global_create_spec.rb @@ -6,6 +6,7 @@ RSpec.describe "Boards", "Creating a view from a Global Context", :js, + :selenium, with_ee: %i[board_view] do shared_let(:project) { create(:project, enabled_module_names: %i[work_package_tracking board_view]) } shared_let(:other_project) { create(:project, enabled_module_names: %i[work_package_tracking board_view]) } diff --git a/modules/boards/spec/features/boards_sorting_spec.rb b/modules/boards/spec/features/boards_sorting_spec.rb index 51a3b8257bef..0f61f3350e1f 100644 --- a/modules/boards/spec/features/boards_sorting_spec.rb +++ b/modules/boards/spec/features/boards_sorting_spec.rb @@ -30,7 +30,10 @@ require_relative "support/board_index_page" require_relative "support/board_page" -RSpec.describe "Work Package boards sorting spec", :js, with_ee: %i[board_view] do +RSpec.describe "Work Package boards sorting spec", + :js, + :selenium, + with_ee: %i[board_view] do let(:admin) { create(:admin) } let(:project) { create(:project, enabled_module_names: %i[work_package_tracking board_view]) } let(:board_index) { Pages::BoardIndex.new(project) } diff --git a/modules/budgets/spec/features/budgets/attachment_upload_spec.rb b/modules/budgets/spec/features/budgets/attachment_upload_spec.rb index 38d379e14171..0d5c9f5dd522 100644 --- a/modules/budgets/spec/features/budgets/attachment_upload_spec.rb +++ b/modules/budgets/spec/features/budgets/attachment_upload_spec.rb @@ -77,7 +77,7 @@ attachments_list.expect_attached("image.png", count: 2) end - it "can upload an image to new and existing budgets via drag & drop on attachment list" do + it "can upload an image to new and existing budgets via drag & drop on attachment list", :selenium do visit projects_budgets_path(project) page.find_test_selector("budget-create-button").click diff --git a/modules/budgets/spec/features/budgets/update_budget_spec.rb b/modules/budgets/spec/features/budgets/update_budget_spec.rb index e7ca77ab5cba..2e29d07e1832 100644 --- a/modules/budgets/spec/features/budgets/update_budget_spec.rb +++ b/modules/budgets/spec/features/budgets/update_budget_spec.rb @@ -28,7 +28,7 @@ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper.rb") -RSpec.describe "updating a budget", :js do +RSpec.describe "updating a budget", :js, :selenium do let(:project) do create(:project_with_types, enabled_module_names: %i[budgets costs work_package_tracking], diff --git a/modules/budgets/spec/features/costs_edit_fields_spec.rb b/modules/budgets/spec/features/costs_edit_fields_spec.rb index e8c2ecc860c6..ff219e26c99c 100644 --- a/modules/budgets/spec/features/costs_edit_fields_spec.rb +++ b/modules/budgets/spec/features/costs_edit_fields_spec.rb @@ -28,7 +28,9 @@ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper.rb") -RSpec.describe "Work Package budget fields", :js do +RSpec.describe "Work Package budget fields", + :js, + :selenium do let(:type_task) { create(:type_task) } let!(:status) { create(:status, is_default: true) } let!(:priority) { create(:priority, is_default: true) } diff --git a/modules/calendar/spec/features/calendar_create_work_package_spec.rb b/modules/calendar/spec/features/calendar_create_work_package_spec.rb index 3e3fec9dcf3f..140c8cfea11f 100644 --- a/modules/calendar/spec/features/calendar_create_work_package_spec.rb +++ b/modules/calendar/spec/features/calendar_create_work_package_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Calendar create new work package", :js do +RSpec.describe "Calendar create new work package", :js, :selenium do include_context "with calendar full access" let(:type_task) { create(:type_task) } diff --git a/modules/calendar/spec/features/calendar_project_include_spec.rb b/modules/calendar/spec/features/calendar_project_include_spec.rb index 45495a2667ae..26736c6e013e 100644 --- a/modules/calendar/spec/features/calendar_project_include_spec.rb +++ b/modules/calendar/spec/features/calendar_project_include_spec.rb @@ -30,7 +30,7 @@ require "features/work_packages/project_include/project_include_shared_examples" require_relative "../support/pages/calendar" -RSpec.describe "Calendar project include", :js do +RSpec.describe "Calendar project include", :js, :selenium do shared_let(:enabled_modules) { %w[work_package_tracking calendar_view] } shared_let(:permissions) do %i[view_work_packages view_calendar edit_work_packages add_work_packages save_queries manage_public_queries] diff --git a/modules/calendar/spec/features/calendar_user_interaction_spec.rb b/modules/calendar/spec/features/calendar_user_interaction_spec.rb index 232d58e46de9..479b49ea715e 100644 --- a/modules/calendar/spec/features/calendar_user_interaction_spec.rb +++ b/modules/calendar/spec/features/calendar_user_interaction_spec.rb @@ -29,7 +29,9 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Calendar drag&dop and resizing", :js do +RSpec.describe "Calendar drag&dop and resizing", + :js, + :selenium do include_context "with calendar full access" let!(:other_user) do diff --git a/modules/dashboards/spec/features/project_status_spec.rb b/modules/dashboards/spec/features/project_status_spec.rb index 60eaa9a6ffec..ae1fa82de54a 100644 --- a/modules/dashboards/spec/features/project_status_spec.rb +++ b/modules/dashboards/spec/features/project_status_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/dashboard" -RSpec.describe "Project status widget on dashboard", :js do +RSpec.describe "Project status widget on dashboard", :js, :selenium do let!(:project) do create(:project, status_code: "on_track", diff --git a/modules/dashboards/spec/features/work_package_graph_overview_spec.rb b/modules/dashboards/spec/features/work_package_graph_overview_spec.rb index b98bc0f99cf5..19b7231c2179 100644 --- a/modules/dashboards/spec/features/work_package_graph_overview_spec.rb +++ b/modules/dashboards/spec/features/work_package_graph_overview_spec.rb @@ -82,7 +82,7 @@ end # As a graph is rendered as a canvas, we have limited abilities to test the widget - it "can add the widget" do + it "can add the widget", :selenium do sleep(0.1) dashboard.add_widget(1, 1, :within, "Work packages overview") diff --git a/modules/dashboards/spec/features/work_package_graph_spec.rb b/modules/dashboards/spec/features/work_package_graph_spec.rb index dfd6c8885b2b..4f71d0c9e45a 100644 --- a/modules/dashboards/spec/features/work_package_graph_spec.rb +++ b/modules/dashboards/spec/features/work_package_graph_spec.rb @@ -30,7 +30,10 @@ require_relative "../support/pages/dashboard" -RSpec.describe "Arbitrary WorkPackage query graph widget dashboard", :js, with_ee: %i[grid_widget_wp_graph] do +RSpec.describe "Arbitrary WorkPackage query graph widget dashboard", + :js, + :selenium, + with_ee: %i[grid_widget_wp_graph] do let!(:type) { create(:type) } let!(:other_type) { create(:type) } let!(:priority) { create(:default_priority) } diff --git a/modules/dashboards/spec/features/work_package_table_spec.rb b/modules/dashboards/spec/features/work_package_table_spec.rb index efd15a765a84..88b254bf8fad 100644 --- a/modules/dashboards/spec/features/work_package_table_spec.rb +++ b/modules/dashboards/spec/features/work_package_table_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/dashboard" -RSpec.describe "Arbitrary WorkPackage query table widget dashboard", :js do +RSpec.describe "Arbitrary WorkPackage query table widget dashboard", :js, :selenium do let!(:type) { create(:type) } let!(:other_type) { create(:type) } let!(:priority) { create(:default_priority) } diff --git a/modules/documents/spec/features/attachment_upload_spec.rb b/modules/documents/spec/features/attachment_upload_spec.rb index e8c424138221..6d82d2277199 100644 --- a/modules/documents/spec/features/attachment_upload_spec.rb +++ b/modules/documents/spec/features/attachment_upload_spec.rb @@ -29,7 +29,9 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "Upload attachment to documents", :js, +RSpec.describe "Upload attachment to documents", + :js, + :selenium, with_settings: { journal_aggregation_time_minutes: 0 } do diff --git a/modules/meeting/spec/features/meetings_new_spec.rb b/modules/meeting/spec/features/meetings_new_spec.rb index a15200032926..ed33b784b925 100644 --- a/modules/meeting/spec/features/meetings_new_spec.rb +++ b/modules/meeting/spec/features/meetings_new_spec.rb @@ -65,12 +65,12 @@ let(:new_page) { Pages::Meetings::New.new(nil) } context "with permission to create meetings" do - it "does not render menus"do + it "does not render menus" do new_page.visit! new_page.expect_no_main_menu end - describe "clicking on the create new meeting button"do + describe "clicking on the create new meeting button" do it "navigates to the global create form" do index_page.visit! index_page.click_create_new @@ -149,7 +149,7 @@ end end - context "without permission to create meetings"do + context "without permission to create meetings" do let(:permissions) { %i[view_meetings] } it "shows no edit link" do @@ -159,7 +159,7 @@ end end - context "as an admin"do + context "as an admin" do let(:current_user) { admin } it "allows creating meeting in a project without members" do @@ -226,7 +226,7 @@ other_user end - describe "clicking on the create new meeting button"do + describe "clicking on the create new meeting button" do it "navigates to the project-specific create form" do index_page.visit! index_page.click_create_new @@ -276,7 +276,7 @@ end end - context "without permission to create meetings"do + context "without permission to create meetings" do let(:permissions) { %i[view_meetings] } it "shows no edit link" do @@ -286,7 +286,7 @@ end end - context "as an admin"do + context "as an admin" do let(:current_user) { admin } let(:field) do TextEditorField.new(page, diff --git a/modules/my_page/spec/features/my/accountable_spec.rb b/modules/my_page/spec/features/my/accountable_spec.rb index ff7d978b3239..dccfa56b42af 100644 --- a/modules/my_page/spec/features/my/accountable_spec.rb +++ b/modules/my_page/spec/features/my/accountable_spec.rb @@ -30,7 +30,9 @@ require_relative "../../support/pages/my/page" -RSpec.describe "Accountable widget on my page", :js do +RSpec.describe "Accountable widget on my page", + :js, + :selenium do let!(:type) { create(:type) } let!(:priority) { create(:default_priority) } let!(:project) { create(:project, types: [type]) } diff --git a/modules/my_page/spec/features/my/assigned_to_me_spec.rb b/modules/my_page/spec/features/my/assigned_to_me_spec.rb index f313d4c5504a..922800561ae1 100644 --- a/modules/my_page/spec/features/my/assigned_to_me_spec.rb +++ b/modules/my_page/spec/features/my/assigned_to_me_spec.rb @@ -30,7 +30,7 @@ require_relative "../../support/pages/my/page" -RSpec.describe "Assigned to me embedded query on my page", :js do +RSpec.describe "Assigned to me embedded query on my page", :js, :selenium do let!(:type) { create(:type) } let!(:priority) { create(:default_priority) } let!(:project) { create(:project, types: [type]) } diff --git a/modules/my_page/spec/features/my/custom_text_spec.rb b/modules/my_page/spec/features/my/custom_text_spec.rb index 955e5422227f..c9a147111099 100644 --- a/modules/my_page/spec/features/my/custom_text_spec.rb +++ b/modules/my_page/spec/features/my/custom_text_spec.rb @@ -30,7 +30,9 @@ require_relative "../../support/pages/my/page" -RSpec.describe "Custom text widget on my page", :js do +RSpec.describe "Custom text widget on my page", + :js, + :selenium do let(:permissions) do [] end diff --git a/modules/my_page/spec/features/my/documents_spec.rb b/modules/my_page/spec/features/my/documents_spec.rb index 215c53e8f3b2..36be6b14b09c 100644 --- a/modules/my_page/spec/features/my/documents_spec.rb +++ b/modules/my_page/spec/features/my/documents_spec.rb @@ -30,7 +30,9 @@ require_relative "../../support/pages/my/page" -RSpec.describe "My page documents widget", :js do +RSpec.describe "My page documents widget", + :js, + :selenium do let!(:project) { create(:project) } let!(:other_project) { create(:project) } let!(:visible_document) do diff --git a/modules/my_page/spec/features/my/my_page_spec.rb b/modules/my_page/spec/features/my/my_page_spec.rb index 88ebd892eb3c..c83fac736e99 100644 --- a/modules/my_page/spec/features/my/my_page_spec.rb +++ b/modules/my_page/spec/features/my/my_page_spec.rb @@ -30,7 +30,9 @@ require_relative "../../support/pages/my/page" -RSpec.describe "My page", :js do +RSpec.describe "My page", + :js, + :selenium do let!(:type) { create(:type) } let!(:project) { create(:project, types: [type]) } let!(:open_status) { create(:default_status) } diff --git a/modules/my_page/spec/features/my/news_spec.rb b/modules/my_page/spec/features/my/news_spec.rb index e7e8706b70eb..c7a50a23f9bd 100644 --- a/modules/my_page/spec/features/my/news_spec.rb +++ b/modules/my_page/spec/features/my/news_spec.rb @@ -30,7 +30,9 @@ require_relative "../../support/pages/my/page" -RSpec.describe "My page news widget spec", :js do +RSpec.describe "My page news widget spec", + :js, + :selenium do let!(:project) { create(:project) } let!(:other_project) { create(:project) } let!(:visible_news) do diff --git a/modules/my_page/spec/features/my/time_entries_current_user_spec.rb b/modules/my_page/spec/features/my/time_entries_current_user_spec.rb index 61bf9925aac5..2b693b1b0d5a 100644 --- a/modules/my_page/spec/features/my/time_entries_current_user_spec.rb +++ b/modules/my_page/spec/features/my/time_entries_current_user_spec.rb @@ -30,7 +30,7 @@ require_relative "../../support/pages/my/page" -RSpec.describe "My page time entries current user widget spec", :js do +RSpec.describe "My page time entries current user widget spec", :js, :selenium do let!(:type) { create(:type) } let!(:project) { create(:project, types: [type]) } let!(:activity) { create(:time_entry_activity) } diff --git a/modules/my_page/spec/features/my/work_package_table_spec.rb b/modules/my_page/spec/features/my/work_package_table_spec.rb index c6f8f0fdb1be..2c453017ee78 100644 --- a/modules/my_page/spec/features/my/work_package_table_spec.rb +++ b/modules/my_page/spec/features/my/work_package_table_spec.rb @@ -30,7 +30,9 @@ require_relative "../../support/pages/my/page" -RSpec.describe "Arbitrary WorkPackage query table widget on my page", :js do +RSpec.describe "Arbitrary WorkPackage query table widget on my page", + :js, + :selenium do let!(:type) { create(:type) } let!(:other_type) { create(:type) } let!(:priority) { create(:default_priority) } diff --git a/modules/overviews/spec/features/managing_overview_page_spec.rb b/modules/overviews/spec/features/managing_overview_page_spec.rb index b05955516e07..5760ba3651b9 100644 --- a/modules/overviews/spec/features/managing_overview_page_spec.rb +++ b/modules/overviews/spec/features/managing_overview_page_spec.rb @@ -30,7 +30,7 @@ require_relative "../support/pages/overview" -RSpec.describe "Overview page managing", :js do +RSpec.describe "Overview page managing", :js, :selenium do let!(:type) { create(:type) } let!(:project) { create(:project, types: [type], description: "My **custom** description") } let!(:open_status) { create(:default_status) } diff --git a/modules/reporting/spec/features/export_timesheet_spec.rb b/modules/reporting/spec/features/export_timesheet_spec.rb index 35f552fc9611..347b0412f5bc 100644 --- a/modules/reporting/spec/features/export_timesheet_spec.rb +++ b/modules/reporting/spec/features/export_timesheet_spec.rb @@ -29,7 +29,7 @@ require_relative "../spec_helper" require_relative "support/pages/cost_report_page" -RSpec.describe "Timesheet PDF export", :js do +RSpec.describe "Timesheet PDF export", :js, :selenium do shared_let(:project) { create(:project) } shared_let(:user) { create(:admin) } shared_let(:cost_type) { create(:cost_type, name: "Post-war", unit: "cap", unit_plural: "caps") } diff --git a/modules/reporting/spec/features/update_cost_report_spec.rb b/modules/reporting/spec/features/update_cost_report_spec.rb index 1c0d960d5982..0ffbdd669cc0 100644 --- a/modules/reporting/spec/features/update_cost_report_spec.rb +++ b/modules/reporting/spec/features/update_cost_report_spec.rb @@ -29,7 +29,7 @@ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper.rb") require_relative "support/pages/cost_report_page" -RSpec.describe "updating a cost report's cost type", :js do +RSpec.describe "updating a cost report's cost type", :js, :selenium do let(:project) { create(:project_with_types, members: { user => create(:project_role) }) } let(:user) do create(:admin) diff --git a/modules/reporting/spec/features/update_entries_spec.rb b/modules/reporting/spec/features/update_entries_spec.rb index cc5eac314a9c..783639f3e18d 100644 --- a/modules/reporting/spec/features/update_entries_spec.rb +++ b/modules/reporting/spec/features/update_entries_spec.rb @@ -30,7 +30,7 @@ require_relative "support/pages/cost_report_page" require_relative "support/components/cost_reports_base_table" -RSpec.describe "Updating entries within the cost report", :js do +RSpec.describe "Updating entries within the cost report", :js, :selenium do let(:project) { create(:project) } let(:user) { create(:admin, member_with_permissions: { project => %i[work_package_assigned] }) } let(:work_package) { create(:work_package, project:) } diff --git a/modules/storages/spec/features/manage_project_storage_spec.rb b/modules/storages/spec/features/manage_project_storage_spec.rb index 174881483e1b..133e12ff797e 100644 --- a/modules/storages/spec/features/manage_project_storage_spec.rb +++ b/modules/storages/spec/features/manage_project_storage_spec.rb @@ -38,7 +38,11 @@ # We decrease the notification polling interval because some portions of the JS code rely on something triggering # the Angular change detection. This is usually done by the notification polling, but we don't want to wait RSpec.describe("Activation of storages in projects", - :js, :oauth_connection_helpers, :storage_server_helpers, :webmock, with_settings: { notifications_polling_interval: 1_000 }) do + :js, + :oauth_connection_helpers, + :storage_server_helpers, + :webmock, + with_settings: { notifications_polling_interval: 1_000 }) do let(:user) { create(:user) } # The first page is the Project -> Settings -> General page, so we need # to provide the user with the edit_project permission in the role. diff --git a/modules/storages/spec/features/storages/admin/create_storage_spec.rb b/modules/storages/spec/features/storages/admin/create_storage_spec.rb index f95d5625a443..cbea8ca87e4b 100644 --- a/modules/storages/spec/features/storages/admin/create_storage_spec.rb +++ b/modules/storages/spec/features/storages/admin/create_storage_spec.rb @@ -33,6 +33,7 @@ RSpec.describe "Admin Create a new file storage", :js, + :selenium, :storage_server_helpers do shared_let(:admin) { create(:admin, preferences: { time_zone: "Etc/UTC" }) } diff --git a/modules/storages/spec/features/storages/admin/edit_storage_spec.rb b/modules/storages/spec/features/storages/admin/edit_storage_spec.rb index b5e1833bfa8a..86bc6a3d86d5 100644 --- a/modules/storages/spec/features/storages/admin/edit_storage_spec.rb +++ b/modules/storages/spec/features/storages/admin/edit_storage_spec.rb @@ -33,6 +33,7 @@ RSpec.describe "Admin Edit File storage", :js, + :selenium, :storage_server_helpers do shared_let(:admin) { create(:admin, preferences: { time_zone: "Etc/UTC" }) } diff --git a/modules/storages/spec/features/storages/admin/index_storages_spec.rb b/modules/storages/spec/features/storages/admin/index_storages_spec.rb index ecc90dde96d5..7423d3d12e36 100644 --- a/modules/storages/spec/features/storages/admin/index_storages_spec.rb +++ b/modules/storages/spec/features/storages/admin/index_storages_spec.rb @@ -33,6 +33,7 @@ RSpec.describe "Admin List File storages", :js, + :selenium, :storage_server_helpers do shared_let(:admin) { create(:admin, preferences: { time_zone: "Etc/UTC" }) } diff --git a/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb b/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb index c46f77211e7b..caaa6bd30528 100644 --- a/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb +++ b/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb @@ -33,6 +33,7 @@ RSpec.describe "OAuth Access Grant Nudge upon adding a storage to a project", :js, + :selenium, :webmock do shared_let(:user) { create(:user, preferences: { time_zone: "Etc/UTC" }) } diff --git a/modules/team_planner/spec/features/team_planner_add_existing_work_packages_spec.rb b/modules/team_planner/spec/features/team_planner_add_existing_work_packages_spec.rb index 16ed55fdd885..6102d8fb701a 100644 --- a/modules/team_planner/spec/features/team_planner_add_existing_work_packages_spec.rb +++ b/modules/team_planner/spec/features/team_planner_add_existing_work_packages_spec.rb @@ -30,7 +30,9 @@ require_relative "shared_context" require_relative "../support/components/add_existing_pane" -RSpec.describe "Team planner add existing work packages", :js do +RSpec.describe "Team planner add existing work packages", + :js, + :selenium do include_context "with team planner full access" let(:closed_status) { create(:status, is_closed: true) } diff --git a/modules/team_planner/spec/features/team_planner_context_menu_spec.rb b/modules/team_planner/spec/features/team_planner_context_menu_spec.rb index 45cb6f9b1a99..6e76984d89b0 100644 --- a/modules/team_planner/spec/features/team_planner_context_menu_spec.rb +++ b/modules/team_planner/spec/features/team_planner_context_menu_spec.rb @@ -4,6 +4,7 @@ RSpec.describe "Work package table context menu", :js, + :selenium, with_ee: %i[team_planner_view], with_settings: { start_of_week: 1 } do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_create_spec.rb b/modules/team_planner/spec/features/team_planner_create_spec.rb index 2f2e55409d33..c84b87b9e561 100644 --- a/modules/team_planner/spec/features/team_planner_create_spec.rb +++ b/modules/team_planner/spec/features/team_planner_create_spec.rb @@ -29,7 +29,10 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner create new work package", :js, with_ee: %i[team_planner_view] do +RSpec.describe "Team planner create new work package", + :js, + :selenium, + with_ee: %i[team_planner_view] do include_context "with team planner full access" let(:type_task) { create(:type_task) } diff --git a/modules/team_planner/spec/features/team_planner_dates_spec.rb b/modules/team_planner/spec/features/team_planner_dates_spec.rb index 27ff76fbedbf..1f653a368f82 100644 --- a/modules/team_planner/spec/features/team_planner_dates_spec.rb +++ b/modules/team_planner/spec/features/team_planner_dates_spec.rb @@ -29,7 +29,9 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner working days", :js, +RSpec.describe "Team planner working days", + :js, + :selenium, with_ee: %i[team_planner_view], with_settings: { start_of_week: 1 } do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_error_handling_spec.rb b/modules/team_planner/spec/features/team_planner_error_handling_spec.rb index 3cc19da17095..11f89981f74e 100644 --- a/modules/team_planner/spec/features/team_planner_error_handling_spec.rb +++ b/modules/team_planner/spec/features/team_planner_error_handling_spec.rb @@ -29,7 +29,9 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner error handling", :js, +RSpec.describe "Team planner error handling", + :js, + :selenium, with_settings: { start_of_week: 1 } do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_global_create_spec.rb b/modules/team_planner/spec/features/team_planner_global_create_spec.rb index ed237bbe4034..7cc3b2755d1a 100644 --- a/modules/team_planner/spec/features/team_planner_global_create_spec.rb +++ b/modules/team_planner/spec/features/team_planner_global_create_spec.rb @@ -34,6 +34,7 @@ RSpec.describe "Team Planner", "Creating a view from a Global Context", :js, + :selenium, with_ee: %i[team_planner_view] do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_index_spec.rb b/modules/team_planner/spec/features/team_planner_index_spec.rb index b9d8aed59ce8..d368554f89cb 100644 --- a/modules/team_planner/spec/features/team_planner_index_spec.rb +++ b/modules/team_planner/spec/features/team_planner_index_spec.rb @@ -29,7 +29,10 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner index", :js, with_ee: %i[team_planner_view] do +RSpec.describe "Team planner index", + :js, + :selenium, + with_ee: %i[team_planner_view] do shared_let(:project) do create(:project) end diff --git a/modules/team_planner/spec/features/team_planner_menu_spec.rb b/modules/team_planner/spec/features/team_planner_menu_spec.rb index c8f157af449c..90663c40fb43 100644 --- a/modules/team_planner/spec/features/team_planner_menu_spec.rb +++ b/modules/team_planner/spec/features/team_planner_menu_spec.rb @@ -28,7 +28,9 @@ require "spec_helper" -RSpec.describe "Team planner Menu Item", :js do +RSpec.describe "Team planner Menu Item", + :js, + :selenium do shared_let(:project) do create(:project, enabled_module_names: %w[work_package_tracking team_planner_view]) end diff --git a/modules/team_planner/spec/features/team_planner_overview_spec.rb b/modules/team_planner/spec/features/team_planner_overview_spec.rb index 6848f6360b36..38a55af6ca30 100644 --- a/modules/team_planner/spec/features/team_planner_overview_spec.rb +++ b/modules/team_planner/spec/features/team_planner_overview_spec.rb @@ -33,6 +33,8 @@ require_relative "shared_context" RSpec.describe "Team planner overview", + :js, + :selenium, with_ee: %i[team_planner_view] do # The order the Projects are created in is important. By naming `project` alphanumerically # after `other_project`, we can ensure that subsequent specs that assert sorting is diff --git a/modules/team_planner/spec/features/team_planner_project_include_spec.rb b/modules/team_planner/spec/features/team_planner_project_include_spec.rb index ab0ff0cf7ce3..c3b388e9a15d 100644 --- a/modules/team_planner/spec/features/team_planner_project_include_spec.rb +++ b/modules/team_planner/spec/features/team_planner_project_include_spec.rb @@ -30,7 +30,10 @@ require "features/work_packages/project_include/project_include_shared_examples" require_relative "../support/pages/team_planner" -RSpec.describe "Team planner project include", :js, with_ee: %i[team_planner_view] do +RSpec.describe "Team planner project include", + :js, + :selenium, + with_ee: %i[team_planner_view] do shared_let(:enabled_modules) { %w[work_package_tracking team_planner_view] } shared_let(:permissions) do %w[view_work_packages edit_work_packages add_work_packages diff --git a/modules/team_planner/spec/features/team_planner_remove_event_spec.rb b/modules/team_planner/spec/features/team_planner_remove_event_spec.rb index d721790bf889..359a6fc57838 100644 --- a/modules/team_planner/spec/features/team_planner_remove_event_spec.rb +++ b/modules/team_planner/spec/features/team_planner_remove_event_spec.rb @@ -32,6 +32,7 @@ RSpec.describe "Team planner remove event", :js, + :selenium, with_ee: %i[team_planner_view], with_settings: { start_of_week: 1 } do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_spec.rb b/modules/team_planner/spec/features/team_planner_spec.rb index b29c0e4304a9..986447e8ed7b 100644 --- a/modules/team_planner/spec/features/team_planner_spec.rb +++ b/modules/team_planner/spec/features/team_planner_spec.rb @@ -31,6 +31,7 @@ RSpec.describe "Team planner", :js, + :selenium, with_ee: %i[team_planner_view], with_settings: { start_of_week: 1 } do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_split_view_spec.rb b/modules/team_planner/spec/features/team_planner_split_view_spec.rb index 25f0ae4d7bb6..8e640829d994 100644 --- a/modules/team_planner/spec/features/team_planner_split_view_spec.rb +++ b/modules/team_planner/spec/features/team_planner_split_view_spec.rb @@ -29,7 +29,10 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner split view navigation", :js, with_ee: %i[team_planner_view] do +RSpec.describe "Team planner split view navigation", + :js, + :selenium, + with_ee: %i[team_planner_view] do include_context "with team planner full access" let!(:view) { create(:view_team_planner, query:) } diff --git a/modules/team_planner/spec/features/team_planner_subproject_constraints_spec.rb b/modules/team_planner/spec/features/team_planner_subproject_constraints_spec.rb index 3322014b6469..f2edf7e04475 100644 --- a/modules/team_planner/spec/features/team_planner_subproject_constraints_spec.rb +++ b/modules/team_planner/spec/features/team_planner_subproject_constraints_spec.rb @@ -31,6 +31,7 @@ RSpec.describe "Team planner constraints for a subproject", :js, + :selenium, with_ee: %i[team_planner_view], with_settings: { start_of_week: 1 } do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_upsale_spec.rb b/modules/team_planner/spec/features/team_planner_upsale_spec.rb index ec848007220f..f749e01aa914 100644 --- a/modules/team_planner/spec/features/team_planner_upsale_spec.rb +++ b/modules/team_planner/spec/features/team_planner_upsale_spec.rb @@ -29,7 +29,9 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner index", :js do +RSpec.describe "Team planner index", + :js, + :selenium do include_context "with team planner full access" let(:current_user) { user } diff --git a/modules/team_planner/spec/features/team_planner_user_interaction_spec.rb b/modules/team_planner/spec/features/team_planner_user_interaction_spec.rb index 6e2ce202f32e..416f2800db9b 100644 --- a/modules/team_planner/spec/features/team_planner_user_interaction_spec.rb +++ b/modules/team_planner/spec/features/team_planner_user_interaction_spec.rb @@ -31,6 +31,7 @@ RSpec.describe "Team planner drag&dop and resizing", :js, + :selenium, with_ee: %i[team_planner_view], with_settings: { start_of_week: 1 } do include_context "with team planner full access" diff --git a/modules/team_planner/spec/features/team_planner_view_modes_spec.rb b/modules/team_planner/spec/features/team_planner_view_modes_spec.rb index ac1a83a201a4..c7e19f938989 100644 --- a/modules/team_planner/spec/features/team_planner_view_modes_spec.rb +++ b/modules/team_planner/spec/features/team_planner_view_modes_spec.rb @@ -29,7 +29,10 @@ require "spec_helper" require_relative "shared_context" -RSpec.describe "Team planner", :js, with_ee: %i[team_planner_view] do +RSpec.describe "Team planner", + :js, + :selenium, + with_ee: %i[team_planner_view] do include_context "with team planner full access" it "allows switching of view modes", with_settings: { working_days: [1, 2, 3, 4, 5] } do diff --git a/modules/two_factor_authentication/spec/features/admin_edit_two_factor_devices_spec.rb b/modules/two_factor_authentication/spec/features/admin_edit_two_factor_devices_spec.rb index 1166c3987a9f..5fe4bad5d5f0 100644 --- a/modules/two_factor_authentication/spec/features/admin_edit_two_factor_devices_spec.rb +++ b/modules/two_factor_authentication/spec/features/admin_edit_two_factor_devices_spec.rb @@ -1,6 +1,6 @@ require_relative "../spec_helper" -RSpec.describe "Admin 2FA management", :js, with_settings: { +RSpec.describe "Admin 2FA management", :js, :selenium, with_settings: { plugin_openproject_two_factor_authentication: { "active_strategies" => %i[developer totp] } } do let(:dialog) { Components::PasswordConfirmationDialog.new } diff --git a/modules/webhooks/spec/features/manage_webhooks_spec.rb b/modules/webhooks/spec/features/manage_webhooks_spec.rb index 9df3b63b3488..03e68086d2d6 100644 --- a/modules/webhooks/spec/features/manage_webhooks_spec.rb +++ b/modules/webhooks/spec/features/manage_webhooks_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Manage webhooks through UI", :js do +RSpec.describe "Manage webhooks through UI", :js, :selenium do before do login_as user end diff --git a/spec/features/a11y/home_spec.rb b/spec/features/a11y/home_spec.rb index 591c53173da3..c2a75322aa49 100644 --- a/spec/features/a11y/home_spec.rb +++ b/spec/features/a11y/home_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe "Home", :js, with_settings: { login_required: false } do +RSpec.describe "Home", :js, :selenium, with_settings: { login_required: false } do context "for #content" do it "passes axe-core accessibility tests" do visit "/" diff --git a/spec/features/admin/attribute_help_texts_spec.rb b/spec/features/admin/attribute_help_texts_spec.rb index a53cb7b63774..8537835f0364 100644 --- a/spec/features/admin/attribute_help_texts_spec.rb +++ b/spec/features/admin/attribute_help_texts_spec.rb @@ -44,7 +44,9 @@ end # TODO: Migrate to cuprite when the `better_cuprite_billy` driver is added - context "with direct uploads (Regression #34285)", :with_direct_uploads, :selenium do + context "with direct uploads (Regression #34285)", + :selenium, + :with_direct_uploads do before do allow_any_instance_of(Attachment).to receive(:diskfile).and_return image_fixture end diff --git a/spec/features/admin/backup_spec.rb b/spec/features/admin/backup_spec.rb index d90ee4a6ea91..96ecbf1090e1 100644 --- a/spec/features/admin/backup_spec.rb +++ b/spec/features/admin/backup_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "backup", :js do +RSpec.describe "backup", :js, :selenium do let(:current_user) do create(:user, global_permissions: [:create_backup], diff --git a/spec/features/admin/custom_fields/multi_value_custom_fields_spec.rb b/spec/features/admin/custom_fields/multi_value_custom_fields_spec.rb index 8f6d17d7a9ba..6ebcd9752414 100644 --- a/spec/features/admin/custom_fields/multi_value_custom_fields_spec.rb +++ b/spec/features/admin/custom_fields/multi_value_custom_fields_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Multi-value custom fields creation", :js do +RSpec.describe "Multi-value custom fields creation", :js, :selenium do shared_let(:admin) { create(:admin) } before do diff --git a/spec/features/api_docs/index_spec.rb b/spec/features/api_docs/index_spec.rb index c35633b158dc..e7c8aad2c94e 100644 --- a/spec/features/api_docs/index_spec.rb +++ b/spec/features/api_docs/index_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "REST API docs index page", :js do +RSpec.describe "REST API docs index page", :js, :selenium do subject(:visit_docs_page) { visit(api_docs_path) } context "with anonymous user" do diff --git a/spec/features/auth/consent_auth_stage_spec.rb b/spec/features/auth/consent_auth_stage_spec.rb index e6463a1b376e..b61cdb69bbc0 100644 --- a/spec/features/auth/consent_auth_stage_spec.rb +++ b/spec/features/auth/consent_auth_stage_spec.rb @@ -132,6 +132,7 @@ def expect_not_logged_in context "when enabled, and consent exists", :js, + :selenium, with_settings: { consent_info: { en: "# Consent header!" }, consent_required: true diff --git a/spec/features/custom_fields/reorder_options_spec.rb b/spec/features/custom_fields/reorder_options_spec.rb index 796151433aaf..2c51753b2f40 100644 --- a/spec/features/custom_fields/reorder_options_spec.rb +++ b/spec/features/custom_fields/reorder_options_spec.rb @@ -13,7 +13,7 @@ def get_possible_values_reordered(amount) get_possible_values(amount).sort end -RSpec.describe "Reordering custom options of a list custom field", :js do +RSpec.describe "Reordering custom options of a list custom field", :js, :selenium do let(:user) { create(:admin) } let(:cf_page) { Pages::CustomFields::IndexPage.new } diff --git a/spec/features/forums/attachment_upload_spec.rb b/spec/features/forums/attachment_upload_spec.rb index dfb2a7bd0bd5..5294ba932355 100644 --- a/spec/features/forums/attachment_upload_spec.rb +++ b/spec/features/forums/attachment_upload_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "Upload attachment to forum message", :js do +RSpec.describe "Upload attachment to forum message", :js, :selenium do let(:forum) { create(:forum) } let(:user) do create(:user, diff --git a/spec/features/forums/message_spec.rb b/spec/features/forums/message_spec.rb index 4a5dbc0214c9..e28940aed22c 100644 --- a/spec/features/forums/message_spec.rb +++ b/spec/features/forums/message_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "messages", :js do +RSpec.describe "messages", :js, :selenium do let(:forum) do create(:forum) end diff --git a/spec/features/my/sessions_management_spec.rb b/spec/features/my/sessions_management_spec.rb index b72d30c7a71b..85c5ceba2086 100644 --- a/spec/features/my/sessions_management_spec.rb +++ b/spec/features/my/sessions_management_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "My account session management", :js do +RSpec.describe "My account session management", :js, :selenium do include Redmine::I18n let(:user) { create(:user) } diff --git a/spec/features/notifications/notification_center/notification_center_spec.rb b/spec/features/notifications/notification_center/notification_center_spec.rb index 75d72b1ff9ba..a87b3f86c93b 100644 --- a/spec/features/notifications/notification_center/notification_center_spec.rb +++ b/spec/features/notifications/notification_center/notification_center_spec.rb @@ -1,9 +1,11 @@ require "spec_helper" -RSpec.describe "Notification center", :js, with_ee: %i[date_alerts], - # We decrease the notification polling interval because some portions of the JS code rely on something triggering - # the Angular change detection. This is usually done by the notification polling, but we don't want to wait - with_settings: { journal_aggregation_time_minutes: 0, notifications_polling_interval: 1_000 } do +RSpec.describe "Notification center", + :js, + with_ee: %i[date_alerts], + # We decrease the notification polling interval because some portions of the JS code rely on something triggering + # the Angular change detection. This is usually done by the notification polling, but we don't want to wait + with_settings: { journal_aggregation_time_minutes: 0, notifications_polling_interval: 1_000 } do # Notice that the setup in this file here is not following the normal rules as # it also tests notification creation. let!(:project1) { create(:project) } @@ -105,8 +107,8 @@ # rubocop:disable FactoryBot/ExcessiveCreateList create_list(:notification, 100, attributes.merge(reason: :mentioned)) + - create_list(:notification, 105, attributes.merge(reason: :watched)) + - create_list(:notification, 50, attributes_project2.merge(reason: :assigned)) + create_list(:notification, 105, attributes.merge(reason: :watched)) + + create_list(:notification, 50, attributes_project2.merge(reason: :assigned)) # rubocop:enable FactoryBot/ExcessiveCreateList end diff --git a/spec/features/oauth/authorization_code_flow_spec.rb b/spec/features/oauth/authorization_code_flow_spec.rb index 84ffc46df8ef..eee2fbdeb35b 100644 --- a/spec/features/oauth/authorization_code_flow_spec.rb +++ b/spec/features/oauth/authorization_code_flow_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "OAuth authorization code flow", :js do +RSpec.describe "OAuth authorization code flow", :js, :selenium do let!(:user) { create(:user) } let!(:redirect_uri) { "urn:ietf:wg:oauth:2.0:oob" } let!(:allowed_redirect_uri) { redirect_uri } diff --git a/spec/features/onboarding/onboarding_tour_spec.rb b/spec/features/onboarding/onboarding_tour_spec.rb index 911434956859..743e984e4b9b 100644 --- a/spec/features/onboarding/onboarding_tour_spec.rb +++ b/spec/features/onboarding/onboarding_tour_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" RSpec.describe "onboarding tour for new users", - :js do + :js, :selenium do let(:user) { create(:admin) } let(:project) do create(:project, name: "Demo project", identifier: "demo-project", public: true, diff --git a/spec/features/projects/favorite_spec.rb b/spec/features/projects/favorite_spec.rb index 375d8edb3e7b..7de84ff2aea2 100644 --- a/spec/features/projects/favorite_spec.rb +++ b/spec/features/projects/favorite_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../../../modules/my_page/spec/support/pages/my/page" -RSpec.describe "Favorite projects", :js do +RSpec.describe "Favorite projects", :js, :selenium do shared_let(:project) { create(:public_project, name: "My favorite!", enabled_module_names: []) } shared_let(:other_project) { create(:public_project, name: "Other project", enabled_module_names: []) } shared_let(:user) do diff --git a/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb b/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb index 04a67db9b42a..34b4a5700bb0 100644 --- a/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../shared_context" -RSpec.describe "Edit project custom fields on project overview page", :js do +RSpec.describe "Edit project custom fields on project overview page", :js, :selenium do include_context "with seeded projects, members and project custom fields" let(:overview_page) { Pages::Projects::Show.new(project) } diff --git a/spec/features/search/recently_viewed_work_packages_spec.rb b/spec/features/search/recently_viewed_work_packages_spec.rb index 271814e75368..ffde8f865520 100644 --- a/spec/features/search/recently_viewed_work_packages_spec.rb +++ b/spec/features/search/recently_viewed_work_packages_spec.rb @@ -32,6 +32,7 @@ RSpec.describe "Recently viewed work packages", :js, + :selenium, with_settings: { login_required: false } do include Components::Autocompleter::NgSelectAutocompleteHelpers diff --git a/spec/features/search/search_spec.rb b/spec/features/search/search_spec.rb index 1eae85d3398b..25d6fa581fd5 100644 --- a/spec/features/search/search_spec.rb +++ b/spec/features/search/search_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Search", :js, with_settings: { per_page_options: "5" } do +RSpec.describe "Search", :js, :selenium, with_settings: { per_page_options: "5" } do include Components::Autocompleter::NgSelectAutocompleteHelpers shared_let(:admin) { create(:admin) } diff --git a/spec/features/types/form_configuration_spec.rb b/spec/features/types/form_configuration_spec.rb index 0376c310c078..b678017b0c05 100644 --- a/spec/features/types/form_configuration_spec.rb +++ b/spec/features/types/form_configuration_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "form configuration", :js do +RSpec.describe "form configuration", :js, :selenium do shared_let(:admin) { create(:admin) } let(:type) { create(:type) } diff --git a/spec/features/types/reset_form_configuration_spec.rb b/spec/features/types/reset_form_configuration_spec.rb index 93ee119f1a03..0eb78756f4ac 100644 --- a/spec/features/types/reset_form_configuration_spec.rb +++ b/spec/features/types/reset_form_configuration_spec.rb @@ -28,7 +28,9 @@ require "spec_helper" -RSpec.describe "Reset form configuration", :js do +RSpec.describe "Reset form configuration", + :js, + :selenium do shared_let(:admin) { create(:admin) } let(:type) { create(:type) } diff --git a/spec/features/users/invite_user_modal/invite_user_modal_spec.rb b/spec/features/users/invite_user_modal/invite_user_modal_spec.rb index 87d69b2c5533..195a175a6f5c 100644 --- a/spec/features/users/invite_user_modal/invite_user_modal_spec.rb +++ b/spec/features/users/invite_user_modal/invite_user_modal_spec.rb @@ -270,7 +270,7 @@ roles: [role_no_permissions]) end - it "disables projects for which you do not have rights", :js do + it "disables projects for which you do not have rights", :js, :selenium do ngselect = modal.open_select_in_step ".ng-select-container" expect(ngselect).to have_text "#{project_no_permissions.name}\nYou are not allowed to invite members to this project" end diff --git a/spec/features/users/user_memberships_spec.rb b/spec/features/users/user_memberships_spec.rb index 55d002101bf6..c449c7b4a4b8 100644 --- a/spec/features/users/user_memberships_spec.rb +++ b/spec/features/users/user_memberships_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../principals/shared_memberships_examples" -RSpec.describe "user memberships through user page", :js do +RSpec.describe "user memberships through user page", :js, :selenium do include_context "principal membership management context" shared_let(:principal) { create(:user, firstname: "Foobar", lastname: "Blabla") } diff --git a/spec/features/versions/graph_spec.rb b/spec/features/versions/graph_spec.rb index 230f9c23b65b..5569fdda2628 100644 --- a/spec/features/versions/graph_spec.rb +++ b/spec/features/versions/graph_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "version show graph", :js do +RSpec.describe "version show graph", :js, :selenium do shared_let(:user) { create(:admin) } # parent # +- sibling diff --git a/spec/features/wiki/adding_editing_history_spec.rb b/spec/features/wiki/adding_editing_history_spec.rb index d30970bd2513..f4f150a0f294 100644 --- a/spec/features/wiki/adding_editing_history_spec.rb +++ b/spec/features/wiki/adding_editing_history_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "wiki pages", :js, with_settings: { journal_aggregation_time_minutes: 0 } do +RSpec.describe "wiki pages", :js, :selenium, with_settings: { journal_aggregation_time_minutes: 0 } do let(:project) do create(:project, enabled_module_names: [:news]) end diff --git a/spec/features/wiki/attachment_upload_spec.rb b/spec/features/wiki/attachment_upload_spec.rb index 0184c6f4f348..619f50441fd0 100644 --- a/spec/features/wiki/attachment_upload_spec.rb +++ b/spec/features/wiki/attachment_upload_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "Upload attachment to wiki page", :js do +RSpec.describe "Upload attachment to wiki page", :js, :selenium do let(:user) do create(:user, member_with_permissions: { project => %i[view_wiki_pages edit_wiki_pages] }) diff --git a/spec/features/wiki/child_pages_spec.rb b/spec/features/wiki/child_pages_spec.rb index b76c973ea6da..cc778d1098e2 100644 --- a/spec/features/wiki/child_pages_spec.rb +++ b/spec/features/wiki/child_pages_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "wiki child pages", :js do +RSpec.describe "wiki child pages", :js, :selenium do let(:project) do create(:project) end diff --git a/spec/features/wiki/wiki_page_external_link_spec.rb b/spec/features/wiki/wiki_page_external_link_spec.rb index d04b2c75cd1a..83bab1324025 100644 --- a/spec/features/wiki/wiki_page_external_link_spec.rb +++ b/spec/features/wiki/wiki_page_external_link_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Wiki page external link", :js do +RSpec.describe "Wiki page external link", :js, :selenium do shared_let(:admin) { create(:admin) } current_user { admin } diff --git a/spec/features/work_packages/attachments/attachment_upload_spec.rb b/spec/features/work_packages/attachments/attachment_upload_spec.rb index 34b00f91e750..aabfdb0703cc 100644 --- a/spec/features/work_packages/attachments/attachment_upload_spec.rb +++ b/spec/features/work_packages/attachments/attachment_upload_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/page_objects/notification" -RSpec.describe "Upload attachment to work package", :js do +RSpec.describe "Upload attachment to work package", :js, :selenium do let(:role) do create(:project_role, permissions: %i[view_work_packages add_work_packages edit_work_packages add_work_package_notes]) @@ -134,7 +134,7 @@ end let!(:table) { Pages::WorkPackagesTable.new project } - it "can add two work packages in a row when uploading (Regression #42933)" do |example| + it "can add two work packages in a row when uploading (Regression #42933)" do |_example| table.visit! new_page = table.create_wp_by_button type subject = new_page.edit_field :subject @@ -143,7 +143,7 @@ target = find(".ck-content") attachments.drag_and_drop_file(target, image_fixture.path) - sleep 2 unless using_cuprite? + sleep 2 unless using_cuprite? # rubocop:disable OpenProject/NoSleepInFeatureSpecs editor.wait_until_upload_progress_toaster_cleared editor.in_editor do |_container, editable| @@ -151,7 +151,7 @@ expect(editable).to have_no_css(".ck-upload-placeholder-loader") end - sleep 2 unless using_cuprite? + sleep 2 unless using_cuprite? # rubocop:disable OpenProject/NoSleepInFeatureSpecs scroll_to_and_click find_by_id("work-packages--edit-actions-save") @@ -204,14 +204,14 @@ visit new_project_work_packages_path(project.identifier, type: type.id) end - it "can upload an image via drag & drop (Regression #28189)" do |example| + it "can upload an image via drag & drop (Regression #28189)" do |_example| subject = new_page.edit_field :subject subject.set_value "My subject" target = find(".ck-content") attachments.drag_and_drop_file(target, image_fixture.path) - sleep 2 unless using_cuprite? + sleep 2 unless using_cuprite? # rubocop:disable OpenProject/NoSleepInFeatureSpecs editor.wait_until_upload_progress_toaster_cleared editor.in_editor do |_container, editable| @@ -219,7 +219,7 @@ expect(editable).to have_no_css(".ck-upload-placeholder-loader") end - sleep 2 unless using_cuprite? + sleep 2 unless using_cuprite? # rubocop:disable OpenProject/NoSleepInFeatureSpecs scroll_to_and_click find_by_id("work-packages--edit-actions-save") @@ -247,7 +247,7 @@ # everywhere so if this works it should work everywhere else too. # TODO: Add better_cuprite_billy. I'm not sure what needs to be set up so the request to AWS passes. # Need help - context "with direct uploads", :with_direct_uploads, :js do + context "with direct uploads", :js, :with_direct_uploads do before do allow_any_instance_of(Attachment).to receive(:diskfile).and_return Struct.new(:path).new(image_fixture.path.to_s) end diff --git a/spec/features/work_packages/cancel_editing_spec.rb b/spec/features/work_packages/cancel_editing_spec.rb index 55a84035532a..b857644adaf4 100644 --- a/spec/features/work_packages/cancel_editing_spec.rb +++ b/spec/features/work_packages/cancel_editing_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Cancel editing work package", :js do +RSpec.describe "Cancel editing work package", :js, :selenium do let(:user) { create(:admin) } let(:project) { create(:project) } let(:work_package) { create(:work_package, project:) } diff --git a/spec/features/work_packages/details/context_menu_spec.rb b/spec/features/work_packages/details/context_menu_spec.rb index c448cd4109d7..c2b7cb1db5c1 100644 --- a/spec/features/work_packages/details/context_menu_spec.rb +++ b/spec/features/work_packages/details/context_menu_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Work package single context menu", :js do +RSpec.describe "Work package single context menu", :js, :selenium do let(:user) { create(:admin) } let(:work_package) { create(:work_package) } diff --git a/spec/features/work_packages/details/markdown/activity_comments_spec.rb b/spec/features/work_packages/details/markdown/activity_comments_spec.rb index 07afd80e0e7c..e8b7bf81937c 100644 --- a/spec/features/work_packages/details/markdown/activity_comments_spec.rb +++ b/spec/features/work_packages/details/markdown/activity_comments_spec.rb @@ -3,7 +3,7 @@ require "features/work_packages/shared_contexts" require "features/work_packages/details/inplace_editor/shared_examples" -RSpec.describe "activity comments", :js do +RSpec.describe "activity comments", :js, :selenium do let(:project) { create(:project, public: true) } let!(:work_package) do create(:work_package, diff --git a/spec/features/work_packages/details/markdown/todolist_spec.rb b/spec/features/work_packages/details/markdown/todolist_spec.rb index 2d9781e77fcb..6a233e1858f1 100644 --- a/spec/features/work_packages/details/markdown/todolist_spec.rb +++ b/spec/features/work_packages/details/markdown/todolist_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Todolists in CKEditor", :js do +RSpec.describe "Todolists in CKEditor", :js, :selenium do let(:user) { create(:admin) } before do diff --git a/spec/features/work_packages/display_representations/switch_display_representations_on_mobile_spec.rb b/spec/features/work_packages/display_representations/switch_display_representations_on_mobile_spec.rb index e44899d2e5cf..6b430f9fbf70 100644 --- a/spec/features/work_packages/display_representations/switch_display_representations_on_mobile_spec.rb +++ b/spec/features/work_packages/display_representations/switch_display_representations_on_mobile_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Switching work package view on mobile", :js do +RSpec.describe "Switching work package view on mobile", :js, :selenium do let(:user) { create(:admin) } let(:project) { create(:project) } let(:wp_table) { Pages::WorkPackagesTable.new(project) } diff --git a/spec/features/work_packages/export_spec.rb b/spec/features/work_packages/export_spec.rb index e4d14d052b17..ab138f97b67a 100644 --- a/spec/features/work_packages/export_spec.rb +++ b/spec/features/work_packages/export_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/work_packages/work_packages_page" -RSpec.describe "work package export" do +RSpec.describe "work package export", :js, :selenium do let(:project) { create(:project_with_types, types: [type_a, type_b]) } let(:export_type) { "CSV" } let(:current_user) { create(:admin) } diff --git a/spec/features/work_packages/highlighting_spec.rb b/spec/features/work_packages/highlighting_spec.rb index 41213f0625ac..41763c187a96 100644 --- a/spec/features/work_packages/highlighting_spec.rb +++ b/spec/features/work_packages/highlighting_spec.rb @@ -1,6 +1,8 @@ require "spec_helper" -RSpec.describe "Work Package highlighting fields", :js, +RSpec.describe "Work Package highlighting fields", + :js, + :selenium, with_ee: %i[conditional_highlighting] do let(:user) { create(:admin) } diff --git a/spec/features/work_packages/new/work_package_default_description_spec.rb b/spec/features/work_packages/new/work_package_default_description_spec.rb index d905d29feb8f..ed9138b6d6cf 100644 --- a/spec/features/work_packages/new/work_package_default_description_spec.rb +++ b/spec/features/work_packages/new/work_package_default_description_spec.rb @@ -3,7 +3,7 @@ require "features/work_packages/work_packages_page" require "features/page_objects/notification" -RSpec.describe "new work package", :js do +RSpec.describe "new work package", :js, :selenium do let(:type_task) { create(:type_task, description: "# New Task template\n\nHello there") } let(:type_feature) { create(:type_feature, description: "", is_default: true) } let(:type_bug) { create(:type_bug, description: "# New Bug template\n\nGeneral Kenobi") } diff --git a/spec/features/work_packages/sorting/manual_sorting_spec.rb b/spec/features/work_packages/sorting/manual_sorting_spec.rb index 96558b119264..cbe90184c002 100644 --- a/spec/features/work_packages/sorting/manual_sorting_spec.rb +++ b/spec/features/work_packages/sorting/manual_sorting_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require "features/work_packages/work_packages_page" -RSpec.describe "Manual sorting of WP table", :js do +RSpec.describe "Manual sorting of WP table", :js, :selenium do let(:user) { create(:admin) } let(:wp_table) { Pages::WorkPackagesTable.new(project) } diff --git a/spec/features/work_packages/table/group_by/group_by_progress_spec.rb b/spec/features/work_packages/table/group_by/group_by_progress_spec.rb index 292e8cfbf547..5c894f8a07db 100644 --- a/spec/features/work_packages/table/group_by/group_by_progress_spec.rb +++ b/spec/features/work_packages/table/group_by/group_by_progress_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Work Package group by progress", :js do +RSpec.describe "Work Package group by progress", :js, :selenium do shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } diff --git a/spec/features/work_packages/table/hierarchy/parent_column_spec.rb b/spec/features/work_packages/table/hierarchy/parent_column_spec.rb index a29da2d2bb0c..9325d90834fd 100644 --- a/spec/features/work_packages/table/hierarchy/parent_column_spec.rb +++ b/spec/features/work_packages/table/hierarchy/parent_column_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "Work Package table parent column", :js do +RSpec.describe "Work Package table parent column", :js, :selenium do let(:user) { create(:admin) } let!(:parent) { create(:work_package, project:) } let!(:child) { create(:work_package, project:, parent:) } diff --git a/spec/features/work_packages/table/inline_create/create_work_packages_spec.rb b/spec/features/work_packages/table/inline_create/create_work_packages_spec.rb index 91e48751c651..6d21b242f66e 100644 --- a/spec/features/work_packages/table/inline_create/create_work_packages_spec.rb +++ b/spec/features/work_packages/table/inline_create/create_work_packages_spec.rb @@ -1,6 +1,6 @@ require "spec_helper" -RSpec.describe "inline create work package", :js do +RSpec.describe "inline create work package", :js, :selenium do let(:type) { create(:type) } let(:types) { [type] } diff --git a/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb b/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb index 272d54179058..11a244cdcc9b 100644 --- a/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb +++ b/spec/features/work_packages/table/queries/date_is_empty_filter_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe 'Filter by date with "is empty"', :js do +RSpec.describe 'Filter by date with "is empty"', :js, :selenium do let(:user) { create(:admin) } let(:project) { create(:project) } diff --git a/spec/features/work_packages/table/queries/id_filter_spec.rb b/spec/features/work_packages/table/queries/id_filter_spec.rb index d046168a2b19..4cdafa749f7f 100644 --- a/spec/features/work_packages/table/queries/id_filter_spec.rb +++ b/spec/features/work_packages/table/queries/id_filter_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Work package filtering by id", :js do +RSpec.describe "Work package filtering by id", :js, :selenium do let(:project) { create(:project) } let(:wp_table) { Pages::WorkPackagesTable.new(project) } let(:filters) { Components::WorkPackages::Filters.new } diff --git a/spec/features/work_packages/table/queries/query_history_spec.rb b/spec/features/work_packages/table/queries/query_history_spec.rb index e064a7249624..a5b5c96074c3 100644 --- a/spec/features/work_packages/table/queries/query_history_spec.rb +++ b/spec/features/work_packages/table/queries/query_history_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Going back and forth through the browser history", :js do +RSpec.describe "Going back and forth through the browser history", :js, :selenium do let(:user) do create(:user, member_with_roles: { project => role }) end diff --git a/spec/features/work_packages/table/queries/query_name_inline_edit_spec.rb b/spec/features/work_packages/table/queries/query_name_inline_edit_spec.rb index 0cdfc9327ed0..9e2bde5a94f7 100644 --- a/spec/features/work_packages/table/queries/query_name_inline_edit_spec.rb +++ b/spec/features/work_packages/table/queries/query_name_inline_edit_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Query name inline edit", :js do +RSpec.describe "Query name inline edit", :js, :selenium do let(:user) do create(:user, member_with_roles: { project => role }) end diff --git a/spec/features/work_packages/table/work_packages_table_project_include_spec.rb b/spec/features/work_packages/table/work_packages_table_project_include_spec.rb index 0d81a11cee48..dbf39d1161c9 100644 --- a/spec/features/work_packages/table/work_packages_table_project_include_spec.rb +++ b/spec/features/work_packages/table/work_packages_table_project_include_spec.rb @@ -29,7 +29,7 @@ require "spec_helper" require_relative "../project_include/project_include_shared_examples" -RSpec.describe "Work package project include", :js do +RSpec.describe "Work package project include", :js, :selenium do shared_let(:enabled_modules) { %w[work_package_tracking] } shared_let(:status) { create(:default_status) } shared_let(:priority) { create(:default_priority) } diff --git a/spec/features/wysiwyg/macros/code_block_macro_spec.rb b/spec/features/wysiwyg/macros/code_block_macro_spec.rb index eb5626d1f478..2f928c128bf7 100644 --- a/spec/features/wysiwyg/macros/code_block_macro_spec.rb +++ b/spec/features/wysiwyg/macros/code_block_macro_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Wysiwyg code block macro", :js do +RSpec.describe "Wysiwyg code block macro", :js, :selenium do shared_let(:admin) { create(:admin) } let(:user) { admin } let(:project) { create(:project, enabled_module_names: %w[wiki]) } diff --git a/spec/features/wysiwyg/work_package_linking_spec.rb b/spec/features/wysiwyg/work_package_linking_spec.rb index 718b615307d1..c3d8815aa688 100644 --- a/spec/features/wysiwyg/work_package_linking_spec.rb +++ b/spec/features/wysiwyg/work_package_linking_spec.rb @@ -28,7 +28,7 @@ require "spec_helper" -RSpec.describe "Wysiwyg work package linking", :js do +RSpec.describe "Wysiwyg work package linking", :js, :selenium do let(:user) { create(:admin) } let(:project) { create(:project, enabled_module_names: %w[wiki work_package_tracking]) } let(:work_package) { create(:work_package, subject: "Foobar", project:) } From 7da3c13caf3345e24f9be91cd3edf72708e05ea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 14 Jan 2025 10:03:01 +0100 Subject: [PATCH 7/9] Fix link clicking in cuprite --- spec/support/pages/page.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spec/support/pages/page.rb b/spec/support/pages/page.rb index 7580c68f2e42..433c15be55aa 100644 --- a/spec/support/pages/page.rb +++ b/spec/support/pages/page.rb @@ -176,8 +176,12 @@ def path def navigate_to_modules_menu_item(link_title) visit root_path - within "#op-app-header--modules-menu-list", visible: false do - click_on link_title, visible: false + within ".op-app-header" do + click_on "Modules" + end + + within "#op-app-header--modules-menu-list", visible: :all do + click_on link_title, visible: :all end end end From 91340b94b4af8bdc00d5807baa32b4c7266ab17c Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Tue, 14 Jan 2025 15:00:11 +0100 Subject: [PATCH 8/9] Remove unused variable --- spec/support/cuprite_setup.rb | 7 ------- 1 file changed, 7 deletions(-) diff --git a/spec/support/cuprite_setup.rb b/spec/support/cuprite_setup.rb index 54614c5a5c1d..dd6066ff386d 100644 --- a/spec/support/cuprite_setup.rb +++ b/spec/support/cuprite_setup.rb @@ -105,13 +105,6 @@ def register_better_cuprite(language, name: :"better_cuprite_#{language}") register_better_cuprite "en" -MODULES_WITH_CUPRITE_ENABLED = %w[ - avatars - backlogs - job_status - meeting -].freeze - RSpec.configure do |config| config.around(:each, :js, type: :feature) do |example| # Skip if driver is explicitly requested From 8ab8ae498d0171c28e9a2df5d3ebaf69d5f33b06 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Tue, 14 Jan 2025 15:49:21 +0100 Subject: [PATCH 9/9] Rename AssociateUserToken to CreateService This is more aligned with how we call other similar services, since the focus of this service is about creating user tokens. --- .../create_service.rb} | 58 ++++++++++--------- .../open_project/openid_connect/hooks/hook.rb | 2 +- .../create_service_spec.rb} | 2 +- 3 files changed, 32 insertions(+), 30 deletions(-) rename modules/openid_connect/app/services/openid_connect/{associate_user_token.rb => user_tokens/create_service.rb} (50%) rename modules/openid_connect/spec/services/openid_connect/{associate_user_token_spec.rb => user_tokens/create_service_spec.rb} (99%) diff --git a/modules/openid_connect/app/services/openid_connect/associate_user_token.rb b/modules/openid_connect/app/services/openid_connect/user_tokens/create_service.rb similarity index 50% rename from modules/openid_connect/app/services/openid_connect/associate_user_token.rb rename to modules/openid_connect/app/services/openid_connect/user_tokens/create_service.rb index e1ece957b585..7bfa6b4b729f 100644 --- a/modules/openid_connect/app/services/openid_connect/associate_user_token.rb +++ b/modules/openid_connect/app/services/openid_connect/user_tokens/create_service.rb @@ -29,43 +29,45 @@ # + module OpenIDConnect - class AssociateUserToken - def initialize(user, jwt_parser: JwtParser.new(verify_audience: false, required_claims: ["aud"])) - @user = user - @jwt_parser = jwt_parser - end - - def call(access_token:, refresh_token: nil, known_audiences: [], clear_previous: false) - if access_token.blank? - Rails.logger.error("Could not associate token to user: No access token") - return + module UserTokens + class CreateService + def initialize(user, jwt_parser: JwtParser.new(verify_audience: false, required_claims: ["aud"])) + @user = user + @jwt_parser = jwt_parser end - if @user.nil? - Rails.logger.error("Could not associate token to user: Can't find user") - return - end + def call(access_token:, refresh_token: nil, known_audiences: [], clear_previous: false) + if access_token.blank? + Rails.logger.error("Could not associate token to user: No access token") + return + end - @user.oidc_user_tokens.destroy_all if clear_previous + if @user.nil? + Rails.logger.error("Could not associate token to user: Can't find user") + return + end - token = prepare_token(access_token:, refresh_token:, known_audiences:) - token.save! if token.audiences.any? - end + @user.oidc_user_tokens.destroy_all if clear_previous + + token = prepare_token(access_token:, refresh_token:, known_audiences:) + token.save! if token.audiences.any? + end - private + private - def prepare_token(access_token:, refresh_token:, known_audiences:) - @user.oidc_user_tokens.build(access_token:, refresh_token:).tap do |token| - token.audiences = merge_audiences(known_audiences, discover_audiences(access_token).value_or([])) + def prepare_token(access_token:, refresh_token:, known_audiences:) + @user.oidc_user_tokens.build(access_token:, refresh_token:).tap do |token| + token.audiences = merge_audiences(known_audiences, discover_audiences(access_token).value_or([])) + end end - end - def discover_audiences(access_token) - @jwt_parser.parse(access_token).fmap { |decoded, _| Array(decoded["aud"]) } - end + def discover_audiences(access_token) + @jwt_parser.parse(access_token).fmap { |decoded, _| Array(decoded["aud"]) } + end - def merge_audiences(*args) - args.flatten.uniq + def merge_audiences(*args) + args.flatten.uniq + end end end end diff --git a/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb b/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb index a3bf89f7111f..19d544e25dc6 100644 --- a/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb +++ b/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb @@ -41,7 +41,7 @@ def user_logged_in(context) # We clear previous tokens while adding this one to avoid keeping # stale tokens around (and to avoid piling up duplicate IDP tokens) # -> Fresh login causes fresh set of tokens - OpenIDConnect::AssociateUserToken.new(user).call( + OpenIDConnect::UserTokens::CreateService.new(user).call( access_token: session["omniauth.oidc_access_token"], refresh_token: session["omniauth.oidc_refresh_token"], known_audiences: [OpenIDConnect::UserToken::IDP_AUDIENCE], diff --git a/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb b/modules/openid_connect/spec/services/openid_connect/user_tokens/create_service_spec.rb similarity index 99% rename from modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb rename to modules/openid_connect/spec/services/openid_connect/user_tokens/create_service_spec.rb index d0f8fa8694b3..523c6e92d258 100644 --- a/modules/openid_connect/spec/services/openid_connect/associate_user_token_spec.rb +++ b/modules/openid_connect/spec/services/openid_connect/user_tokens/create_service_spec.rb @@ -29,7 +29,7 @@ #++ require "spec_helper" -RSpec.describe OpenIDConnect::AssociateUserToken do +RSpec.describe OpenIDConnect::UserTokens::CreateService do subject { described_class.new(user, jwt_parser: parser).call(**args) } let(:user) { create(:user) }