Skip to content

Allow alpha and beta pre-release labels in release workflow version v…

e832177
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
Merged

Allow alpha and beta pre-release labels in release workflow version validation #2379

Allow alpha and beta pre-release labels in release workflow version v…
e832177
Select commit
Loading
Failed to load commit list.
GitHub Actions / Test Report - test/Bff.Tests succeeded Mar 2, 2026 in 1s

579 passed, 0 failed and 3 skipped

Tests passed successfully

✅ bff/test/Bff.Tests/bin/Release/net10.0/TestResults/Bff.Tests.trx

582 tests were completed in 60s with 579 passed, 0 failed and 3 skipped.

Test suite Passed Failed Skipped Time
Bff.Tests.Blazor.BffBlazorTests 12✅ 10s
Bff.Tests.Blazor.ServerSideTokenStoreTests 1✅ 879ms
Bff.Tests.PublicApiVerificationTests 5✅ 1s
Duende.Bff.Blazor.Client.UnitTests.AntiForgeryHandlerTests 1✅ 10ms
Duende.Bff.Blazor.Client.UnitTests.BffClientAuthenticationStateProviderTests 4✅ 571ms
Duende.Bff.Blazor.Client.UnitTests.FetchUserServiceTests 2✅ 559ms
Duende.Bff.Blazor.Client.UnitTests.ServiceCollectionExtensionsTests 18✅ 36ms
Duende.Bff.EntityFramework.Tests.UserSessionStoreTests 26✅ 9s
Duende.Bff.Tests.Benchmarks.BenchmarkTests+Login 6✅ 286ms
Duende.Bff.Tests.Benchmarks.BenchmarkTests+Proxy 5✅ 260ms
Duende.Bff.Tests.BffFrontendIndexTests 12✅ 7s
Duende.Bff.Tests.BffFrontendMatchingTests 7✅ 3s
Duende.Bff.Tests.BffFrontendSigninTests 27✅ 16s
Duende.Bff.Tests.BffHostBuilder.HostBuilder_SessionTests 6✅ 8s
Duende.Bff.Tests.BffOptionsConfigurationTests 6✅ 11s
Duende.Bff.Tests.BffRemoteApiTests 10✅ 7s
Duende.Bff.Tests.BffScenarioTests 1✅ 973ms
Duende.Bff.Tests.BffWithoutExplicitFrontendTests 1✅ 8s
Duende.Bff.Tests.Configuration.BffBuilderTests 14✅ 1⚪ 5s
Duende.Bff.Tests.Configuration.ConfigBindingTests 1✅ 3s
Duende.Bff.Tests.Configuration.OptionsMonitorExplorationTests 1✅ 24ms
Duende.Bff.Tests.ConventionTests 9✅ 685ms
Duende.Bff.Tests.Diagnostics.FrontendCountDiagnosticEntryTests 1✅ 2s
Duende.Bff.Tests.Endpoints.DPoPRemoteEndpointTests 6✅ 11s
Duende.Bff.Tests.Endpoints.DPoPTestsWithManualAuthentication 2✅ 1s
Duende.Bff.Tests.Endpoints.LocalEndpointTests 40✅ 19s
Duende.Bff.Tests.Endpoints.Management.BackchannelLogoutEndpointTests 18✅ 10s
Duende.Bff.Tests.Endpoints.Management.LoginEndpointTests 48✅ 20s
Duende.Bff.Tests.Endpoints.Management.LogoutEndpointTests 27✅ 21s
Duende.Bff.Tests.Endpoints.Management.ManagementBasePathTests 5✅ 2s
Duende.Bff.Tests.Endpoints.Management.UserEndpointTests 16✅ 9s
Duende.Bff.Tests.Endpoints.RemoteEndpointTests 66✅ 60s
Duende.Bff.Tests.Endpoints.WireupTests 3✅ 8s
Duende.Bff.Tests.Endpoints.YarpTests 46✅ 23s
Duende.Bff.Tests.Headers.ApiAndBffUseForwardedHeaders 2✅ 1s
Duende.Bff.Tests.Headers.ApiUseForwardedHeaders 2✅ 571ms
Duende.Bff.Tests.Headers.GeneralTests 15✅ 9s
Duende.Bff.Tests.IAccessTokenRetriever_Extensibility_tests 2✅ 8s
Duende.Bff.Tests.Internal.ClaimsPrincipalRecordTests 6✅ 19ms
Duende.Bff.Tests.LicensingTests 5✅ 11s
Duende.Bff.Tests.MultiFrontend.FrontendCollectionTests 5✅ 2⚪ 1s
Duende.Bff.Tests.MultiFrontend.FrontendSelectorTests 20✅ 751ms
Duende.Bff.Tests.MultiFrontend.HostHeaderValueTests 31✅ 7ms
Duende.Bff.Tests.MultiFrontend.PathMapperTests 6✅ 3ms
Duende.Bff.Tests.SessionManagement.CookieSlidingTests 12✅ 8s
Duende.Bff.Tests.SessionManagement.RevokeRefreshTokenTests 12✅ 15s
Duende.Bff.Tests.SessionManagement.ServerSideTicketStoreTests 5✅ 5s
Duende.Bff.Tests.TestInfra.TestInfraTests 3✅ 3s

✅ Bff.Tests.Blazor.BffBlazorTests

✅ Can_get_home(setup: BffWithFrontend)
✅ Can_get_home(setup: ManuallyConfiguredBff)
✅ Can_get_home(setup: V4Bff)
✅ Can_get_secure_when_logged_in(setup: BffWithFrontend)
✅ Can_get_secure_when_logged_in(setup: ManuallyConfiguredBff)
✅ Can_get_secure_when_logged_in(setup: V4Bff)
✅ Cannot_get_secure_without_loggin_in(setup: BffWithFrontend)
✅ Cannot_get_secure_without_loggin_in(setup: ManuallyConfiguredBff)
✅ Cannot_get_secure_without_loggin_in(setup: V4Bff)
✅ Without_serverside_sessions_add_blazorserver_fails(setup: BffWithFrontend)
✅ Without_serverside_sessions_add_blazorserver_fails(setup: ManuallyConfiguredBff)
✅ Without_serverside_sessions_add_blazorserver_fails(setup: V4Bff)

✅ Bff.Tests.Blazor.ServerSideTokenStoreTests

✅ Can_add_retrieve_and_remove_tokens

✅ Bff.Tests.PublicApiVerificationTests

✅ VerifyPublicApi_Bff
✅ VerifyPublicApi_Bff_Blazor
✅ VerifyPublicApi_Bff_Blazor_Client
✅ VerifyPublicApi_Bff_EntityFramework
✅ VerifyPublicApi_Bff_Yarp

✅ Duende.Bff.Blazor.Client.UnitTests.AntiForgeryHandlerTests

✅ Adds_expected_header

✅ Duende.Bff.Blazor.Client.UnitTests.BffClientAuthenticationStateProviderTests

✅ timer_stops_when_user_logs_out
✅ when_anonymous_user_in_persistent_state_GetAuthState_returns_anonymous_and_does_not_poll
✅ when_no_user_in_persistent_state_GetAuthState_polls_user_endpoint
✅ when_user_in_persistent_state_GetAuthState_returns_that_user_and_then_polls_user_endpoint

✅ Duende.Bff.Blazor.Client.UnitTests.FetchUserServiceTests

✅ GetUserAsync_maps_claims_into_ClaimsPrincipal
✅ GetUserAsync_returns_anonymous_when_http_request_fails

✅ Duende.Bff.Blazor.Client.UnitTests.ServiceCollectionExtensionsTests

✅ AddBffBlazorClient_can_set_options_with_callback
✅ AddLocalApiHttpClient_configures_HttpClient_base_address
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/\", configuredRemotePath: \"remote-apis\", expectedBaseAddress: \"https://example.com/remote-apis/\")
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/\", configuredRemotePath: null, expectedBaseAddress: \"https://example.com/remote-apis/\")
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/with/base/path/\", configuredRemotePath: \"/custom/route/to/apis\", expectedBaseAddress: \"https://example.com/with/base/path/custom/route/to\"···)
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/with/base/path/\", configuredRemotePath: \"custom/route/to/apis\", expectedBaseAddress: \"https://example.com/with/base/path/custom/route/to\"···)
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/with/base/path\", configuredRemotePath: \"/custom/route/to/apis\", expectedBaseAddress: \"https://example.com/with/base/path/custom/route/to\"···)
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/with/base/path\", configuredRemotePath: \"custom/route/to/apis\", expectedBaseAddress: \"https://example.com/with/base/path/custom/route/to\"···)
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/with/base/path\", configuredRemotePath: null, expectedBaseAddress: \"https://example.com/with/base/path/remote-apis/\")
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com\", configuredRemotePath: \"custom/route/to/apis\", expectedBaseAddress: \"https://example.com/custom/route/to/apis/\")
✅ AddRemoteApiHttpClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com\", configuredRemotePath: null, expectedBaseAddress: \"https://example.com/remote-apis/\")
✅ When_base_address_option_is_default_AddBffBlazorClient_configures_HttpClient_base_address_from_host_env
✅ When_base_address_option_is_default_AddRemoteApiHttpClient_configures_HttpClient_base_address_from_host_env
✅ When_base_address_option_is_default_AddRemoteApiHttpClient_configures_HttpClient_base_address_from_host_env_and_config_callback_is_respected
✅ When_base_address_option_is_default_AddRemoteApiHttpClient_for_typed_clients_configures_HttpClient_base_address_from_host_env
✅ When_base_address_option_is_default_AddRemoteApiHttpClient_for_typed_clients_configures_HttpClient_base_address_from_host_env_and_config_callback_is_respected
✅ When_base_address_option_is_set_AddBffBlazorClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com/\", expectedBaseAddress: \"https://example.com/\")
✅ When_base_address_option_is_set_AddBffBlazorClient_configures_HttpClient_base_address(configuredRemoteAddress: \"https://example.com\", expectedBaseAddress: \"https://example.com/\")

✅ Duende.Bff.EntityFramework.Tests.UserSessionStoreTests

✅ concurrent_deletes_with_exception_handler_and_detatching_should_succeed
✅ CreateUserSessionAsync_should_succeed
✅ CreateUserSessions_are_partitioned_per_frontend
✅ CreateUserSessions_sessions_are_unique_per_frontend
✅ DeleteUserSessionAsync_for_invalid_key_should_succeed
✅ DeleteUserSessionAsync_for_valid_key_should_succeed
✅ DeleteUserSessionAsync_respects_multi_frontends
✅ DeleteUserSessionsAsync_for_invalid_sid_should_do_nothing
✅ DeleteUserSessionsAsync_for_invalid_sub_and_sid_should_succeed
✅ DeleteUserSessionsAsync_for_invalid_sub_should_do_nothing
✅ DeleteUserSessionsAsync_for_missing_sub_and_sid_should_throw
✅ DeleteUserSessionsAsync_for_valid_sid_should_succeed
✅ DeleteUserSessionsAsync_for_valid_sub_and_sid_should_succeed
✅ DeleteUserSessionsAsync_for_valid_sub_should_succeed
✅ GetUserSessionAsync_for_invalid_key_should_return_null
✅ GetUserSessionAsync_for_valid_key_should_succeed
✅ GetUserSessionAsync_should_work_for_multi_frontends
✅ GetUserSessionsAsync_for_invalid_sid_should_return_empty
✅ GetUserSessionsAsync_for_invalid_sub_and_sid_should_succeed
✅ GetUserSessionsAsync_for_invalid_sub_should_return_empty
✅ GetUserSessionsAsync_for_missing_sub_and_sid_should_throw
✅ GetUserSessionsAsync_for_valid_sid_should_succeed
✅ GetUserSessionsAsync_for_valid_sub_and_sid_should_succeed
✅ GetUserSessionsAsync_for_valid_sub_should_succeed
✅ UpdateUserSessionAsync_for_invalid_key_should_succeed
✅ UpdateUserSessionAsync_should_succeed

✅ Duende.Bff.Tests.Benchmarks.BenchmarkTests+Login

✅ InvokeBenchmarksAsTests(benchmark: \"MultiFrontendBenchmarks\", testName: \"MultiFrontend_AnonLocalEndpoint\")
✅ InvokeBenchmarksAsTests(benchmark: \"MultiFrontendBenchmarks\", testName: \"MultiFrontend_ClientCredentialsToken\")
✅ InvokeBenchmarksAsTests(benchmark: \"MultiFrontendBenchmarks\", testName: \"MultiFrontend_LocalEndpoint\")
✅ InvokeBenchmarksAsTests(benchmark: \"MultiFrontendBenchmarks\", testName: \"MultiFrontend_login_to_default\")
✅ InvokeBenchmarksAsTests(benchmark: \"MultiFrontendBenchmarks\", testName: \"MultiFrontend_login_to_frontend_3\")
✅ InvokeBenchmarksAsTests(benchmark: \"MultiFrontendBenchmarks\", testName: \"MultiFrontend_user_token\")

✅ Duende.Bff.Tests.Benchmarks.BenchmarkTests+Proxy

✅ InvokeBenchmarksAsTests(benchmark: \"SingleFrontendBenchmarks\", testName: \"SingleFrontend_AnonLocalEndpoint\")
✅ InvokeBenchmarksAsTests(benchmark: \"SingleFrontendBenchmarks\", testName: \"SingleFrontend_ClientCredentialsToken\")
✅ InvokeBenchmarksAsTests(benchmark: \"SingleFrontendBenchmarks\", testName: \"SingleFrontend_LocalEndpoint\")
✅ InvokeBenchmarksAsTests(benchmark: \"SingleFrontendBenchmarks\", testName: \"SingleFrontend_Login\")
✅ InvokeBenchmarksAsTests(benchmark: \"SingleFrontendBenchmarks\", testName: \"SingleFrontend_UserToken\")

✅ Duende.Bff.Tests.BffFrontendIndexTests

✅ After_login_index_document_is_returned
✅ Can_also_proxy_all_static_assets
✅ Can_customize_index_html
✅ Given_index_can_call_local_api
✅ Given_index_can_call_proxied_endpoint
✅ Index_document_is_returned_on_fallback_path
✅ IndexHtml_is_cached_but_refreshed_when_modifying_frontend
✅ Proxying_static_assets_works_with_path_based_routing
✅ static_assets_proxying_also_allows_query_strings
✅ When_proxying_static_assets_then_index_html_is_also_transformed
✅ When_using_StaticAssets_func_controls(indexHtmlOnly: False)
✅ When_using_StaticAssets_func_controls(indexHtmlOnly: True)

✅ Duende.Bff.Tests.BffFrontendMatchingTests

✅ Can_match_frontend_on_path
✅ Can_select_frontend_based_on_domain_name
✅ Given_single_frontend_then_is_selected
✅ Given_unmatched_frontend_then_default_frontend_is_disabled
✅ When_no_frontend_but_openid_config_then_all_endpoints_are_present
✅ When_no_frontend_matched_then_show_frontend_returns_none
✅ Will_also_respect_xforwarded_host

✅ Duende.Bff.Tests.BffFrontendSigninTests

✅ Can_add_frontends_using_AddFrontends_ExtensionMethod
✅ Can_get_home
✅ Can_hijack_login_and_logout_endpoints_and_call_default
✅ Can_hijack_management_endpoints(endpoint: \"/backchannel\")
✅ Can_hijack_management_endpoints(endpoint: \"/diagnostics\")
✅ Can_hijack_management_endpoints(endpoint: \"/login\")
✅ Can_hijack_management_endpoints(endpoint: \"/logout\")
✅ Can_hijack_management_endpoints(endpoint: \"/silent-login-callback\")
✅ Can_hijack_management_endpoints(endpoint: \"/silent-login\")
✅ Can_hijack_management_endpoints(endpoint: \"/user\")
✅ Can_login
✅ Can_login_perf
✅ can_signin_with_path_based_frontend
✅ cannot_access_secret_page_without_logging_in
✅ Default_settings_augment_frontend_settings
✅ Event_handlers_are_used
✅ Event_handlers_are_used_from_bff_defaults
✅ given_path_based_frontend_cannot_login_on_root
✅ given_path_based_frontend_login_endpoint_should_challenge_and_redirect_to_root_with_custom_prefix
✅ given_path_based_frontend_then_can_perform_silent_signin
✅ When_creating_new_frontend_old_config_is_not_reused
✅ When_only_providing_config_then_can_still_log_in
✅ When_only_providing_config_then_cannot_login_to_unmatched_frontend
✅ When_providing_oidc_config_this_is_used_for_matched_frontend
✅ When_updating_frontend_then_subsequent_api_call_uses_updated_token
✅ When_updating_frontend_then_subsequent_login_uses_new_cookiesettings
✅ When_updating_frontend_then_subsequent_login_uses_new_openid_connect_settings

✅ Duende.Bff.Tests.BffHostBuilder.HostBuilder_SessionTests

✅ Can_enable_inmemory_sessions
✅ can_run_using_entity_framework
✅ Can_run_without_session_storage
✅ Cannot_add_cleanup_host_without_entity_framework
✅ Will_cleanup_sessions
✅ Will_cleanup_sessions_even_if_in_other_host

✅ Duende.Bff.Tests.BffOptionsConfigurationTests

✅ calls_outside_http_context_can_get_cookie_configuration(setup: BffWithFrontend)
✅ calls_outside_http_context_can_get_cookie_configuration(setup: ManuallyConfiguredBff)
✅ calls_outside_http_context_can_get_cookie_configuration(setup: V4Bff)
✅ calls_outside_http_context_can_get_oidc_configuration(setup: BffWithFrontend)
✅ calls_outside_http_context_can_get_oidc_configuration(setup: ManuallyConfiguredBff)
✅ calls_outside_http_context_can_get_oidc_configuration(setup: V4Bff)

✅ Duende.Bff.Tests.BffRemoteApiTests

✅ calls_to_remote_endpoint_with_useraccesstokenparameters_having_stored_named_token_should_forward_user_to_api
✅ When_logged_in_can_proxy_and_get_subject(requiredTokenType: User)
✅ When_logged_in_can_proxy_and_get_subject(requiredTokenType: UserOrClient)
✅ When_logged_in_can_proxy_and_get_subject(requiredTokenType: UserOrNone)
✅ When_not_logged_in_and_retrieving_optional_user_token_then_no_call_to_IUserTokenManager_should_be_made
✅ When_not_logged_in_can_get_token(requiredTokenType: Client)
✅ When_not_logged_in_can_get_token(requiredTokenType: UserOrClient)
✅ When_not_logged_in_can_get_token(requiredTokenType: UserOrNone)
✅ When_not_logged_in_cannot_get_required_user_token
✅ When_not_logged_in_UserOrClient_falls_through_to_client_token

✅ Duende.Bff.Tests.BffScenarioTests

✅ When_using_bff_as_host_and_client_credentials_token_manager_with_no_http_context_still_works

✅ Duende.Bff.Tests.BffWithoutExplicitFrontendTests

✅ Can_login

✅ Duende.Bff.Tests.Configuration.BffBuilderTests

✅ Can_add_frontends_in_multiple_calls
✅ Can_add_multiple_frontends
✅ Can_configure_frontends_in_configuration_as_string(useCdnIndexUrl: False)
✅ Can_configure_frontends_in_configuration_as_string(useCdnIndexUrl: True)
✅ Can_load_default_cookie_configuration
✅ Can_load_default_oidc_configuration
✅ Can_load_frontend_with_all_possible_values_from_configuration
✅ Can_load_frontend_with_all_values_from_configuration
✅ Can_load_frontend_with_minimal_values_from_configuration
✅ Can_load_frontend_with_proxy_config
✅ Cannot_add_duplicate_frontends
✅ When_config_file_is_updated_then_frontend_store_is_updated
✅ when_loading_frontend_default_config_is_applied
✅ When_updating_frontends_in_config_then_are_removed_from_Oidc_cache
⚪ Will_reject_invalid_configuration

✅ Duende.Bff.Tests.Configuration.ConfigBindingTests

✅ Can_load_remote_apis_at_runtime_from_multiple_config_sources

✅ Duende.Bff.Tests.Configuration.OptionsMonitorExplorationTests

✅ OptionMonitorsAreUpdatedAsynchronously

✅ Duende.Bff.Tests.ConventionTests

✅ All_async_methods_should_end_with_Async_and_have_cancellation_token_as_last_parameter
✅ All_interface_async_methods_should_have_cancellation_token_with_default
✅ All_strongly_typed_strings_are_readonly_struct
✅ All_strongly_typed_strings_have_internal_create_method
✅ All_strongly_typed_strings_Have_private_value
✅ All_strongly_typed_strings_should_have_only_expected_constructors
✅ All_strongly_typed_strings_should_have_public_constructor_that_throws
✅ All_types_in_Internal_namespace_should_be_internal
✅ All_types_not_in_Internal_namespace_should_be_sealed_or_static

✅ Duende.Bff.Tests.Diagnostics.FrontendCountDiagnosticEntryTests

✅ Should_print_the_number_of_frontends_during_defined_interval

✅ Duende.Bff.Tests.Endpoints.DPoPRemoteEndpointTests

✅ Can_call_dpop_protected_api_with_client_token
✅ Can_call_dpop_protected_api_with_user_token
✅ DPoP_htu_matches_yarp_destination_when_api_has_path_prefix
✅ HTU_values_are_correctly_verified_for_paths_and_subpaths(mappedPath: \"/api/foo\", targetPath: \"api/foo\", calledPath: \"api/foo/bar\")
✅ HTU_values_are_correctly_verified_for_paths_and_subpaths(mappedPath: \"/api/foo\", targetPath: \"api/foo\", calledPath: \"api/foo\")
✅ HTU_values_are_correctly_verified_for_paths_and_subpaths(mappedPath: \"/api/foo\", targetPath: \"foo\", calledPath: \"api/foo\")

✅ Duende.Bff.Tests.Endpoints.DPoPTestsWithManualAuthentication

✅ When_calling_api_endpoint_with_dpop_enabled_then_dpop_headers_are_sent
✅ When_logging_in_then_dpop_is_sent

✅ Duende.Bff.Tests.Endpoints.LocalEndpointTests

✅ authorization_policy_failure_should_return_403
✅ calls_to_anon_endpoint_should_allow_anonymous(setup: BffWithFrontend)
✅ calls_to_anon_endpoint_should_allow_anonymous(setup: ManuallyConfiguredBff)
✅ calls_to_anon_endpoint_should_allow_anonymous(setup: V4Bff)
✅ calls_to_authorized_local_endpoint_should_succeed(setup: BffWithFrontend)
✅ calls_to_authorized_local_endpoint_should_succeed(setup: ManuallyConfiguredBff)
✅ calls_to_authorized_local_endpoint_should_succeed(setup: V4Bff)
✅ calls_to_authorized_local_endpoint_without_csrf_should_succeed_without_antiforgery_header(setup: BffWithFrontend)
✅ calls_to_authorized_local_endpoint_without_csrf_should_succeed_without_antiforgery_header(setup: ManuallyConfiguredBff)
✅ calls_to_authorized_local_endpoint_without_csrf_should_succeed_without_antiforgery_header(setup: V4Bff)
✅ calls_to_local_endpoint_should_require_antiforgery_header(setup: BffWithFrontend)
✅ calls_to_local_endpoint_should_require_antiforgery_header(setup: ManuallyConfiguredBff)
✅ calls_to_local_endpoint_should_require_antiforgery_header(setup: V4Bff)
✅ calls_to_local_endpoint_without_csrf_should_not_require_antiforgery_header(setup: BffWithFrontend)
✅ calls_to_local_endpoint_without_csrf_should_not_require_antiforgery_header(setup: ManuallyConfiguredBff)
✅ calls_to_local_endpoint_without_csrf_should_not_require_antiforgery_header(setup: V4Bff)
✅ challenge_response_should_return_401(setup: BffWithFrontend)
✅ challenge_response_should_return_401(setup: ManuallyConfiguredBff)
✅ challenge_response_should_return_401(setup: V4Bff)
✅ challenge_response_when_response_handling_skipped_should_trigger_redirect_for_login(setup: BffWithFrontend)
✅ challenge_response_when_response_handling_skipped_should_trigger_redirect_for_login(setup: ManuallyConfiguredBff)
✅ challenge_response_when_response_handling_skipped_should_trigger_redirect_for_login(setup: V4Bff)
✅ fallback_policy_should_not_fail(setup: BffWithFrontend)
✅ fallback_policy_should_not_fail(setup: ManuallyConfiguredBff)
✅ fallback_policy_should_not_fail(setup: V4Bff)
✅ forbidden_api_call_should_return_403(setup: BffWithFrontend)
✅ forbidden_api_call_should_return_403(setup: ManuallyConfiguredBff)
✅ forbidden_api_call_should_return_403(setup: V4Bff)
✅ put_to_local_endpoint_should_succeed(setup: BffWithFrontend)
✅ put_to_local_endpoint_should_succeed(setup: ManuallyConfiguredBff)
✅ put_to_local_endpoint_should_succeed(setup: V4Bff)
✅ unauthenticated_api_call_should_return_401(setup: BffWithFrontend)
✅ unauthenticated_api_call_should_return_401(setup: ManuallyConfiguredBff)
✅ unauthenticated_api_call_should_return_401(setup: V4Bff)
✅ unauthenticated_calls_to_authorized_local_endpoint_should_fail(setup: BffWithFrontend)
✅ unauthenticated_calls_to_authorized_local_endpoint_should_fail(setup: ManuallyConfiguredBff)
✅ unauthenticated_calls_to_authorized_local_endpoint_should_fail(setup: V4Bff)
✅ unauthenticated_non_bff_endpoint_should_return_302_for_login(setup: BffWithFrontend)
✅ unauthenticated_non_bff_endpoint_should_return_302_for_login(setup: ManuallyConfiguredBff)
✅ unauthenticated_non_bff_endpoint_should_return_302_for_login(setup: V4Bff)

✅ Duende.Bff.Tests.Endpoints.Management.BackchannelLogoutEndpointTests

✅ backchannel_logout_endpoint_for_incorrect_sid_should_not_logout_user(setup: BffWithFrontend)
✅ backchannel_logout_endpoint_for_incorrect_sid_should_not_logout_user(setup: ManuallyConfiguredBff)
✅ backchannel_logout_endpoint_for_incorrect_sid_should_not_logout_user(setup: V4Bff)
✅ backchannel_logout_endpoint_for_incorrect_sub_should_not_logout_user(setup: BffWithFrontend)
✅ backchannel_logout_endpoint_for_incorrect_sub_should_not_logout_user(setup: ManuallyConfiguredBff)
✅ backchannel_logout_endpoint_for_incorrect_sub_should_not_logout_user(setup: V4Bff)
✅ backchannel_logout_endpoint_should_signout(setup: BffWithFrontend)
✅ backchannel_logout_endpoint_should_signout(setup: ManuallyConfiguredBff)
✅ backchannel_logout_endpoint_should_signout(setup: V4Bff)
✅ backchannel_logout_should_allow_anonymous(setup: BffWithFrontend)
✅ backchannel_logout_should_allow_anonymous(setup: ManuallyConfiguredBff)
✅ backchannel_logout_should_allow_anonymous(setup: V4Bff)
✅ when_BackchannelLogoutAllUserSessions_is_false_backchannel_logout_should_logout_all_sessions(setup: BffWithFrontend)
✅ when_BackchannelLogoutAllUserSessions_is_false_backchannel_logout_should_logout_all_sessions(setup: ManuallyConfiguredBff)
✅ when_BackchannelLogoutAllUserSessions_is_false_backchannel_logout_should_logout_all_sessions(setup: V4Bff)
✅ when_BackchannelLogoutAllUserSessions_is_false_backchannel_logout_should_only_logout_one_session(setup: BffWithFrontend)
✅ when_BackchannelLogoutAllUserSessions_is_false_backchannel_logout_should_only_logout_one_session(setup: ManuallyConfiguredBff)
✅ when_BackchannelLogoutAllUserSessions_is_false_backchannel_logout_should_only_logout_one_session(setup: V4Bff)

✅ Duende.Bff.Tests.Endpoints.Management.LoginEndpointTests

✅ can_issue_silent_login_with_prompt_none(setup: BffWithFrontend)
✅ can_issue_silent_login_with_prompt_none(setup: ManuallyConfiguredBff)
✅ can_issue_silent_login_with_prompt_none(setup: V4Bff)
✅ can_use_prompt_supported_by_IdentityServer(setup: BffWithFrontend)
✅ can_use_prompt_supported_by_IdentityServer(setup: ManuallyConfiguredBff)
✅ can_use_prompt_supported_by_IdentityServer(setup: V4Bff)
✅ given_list_of_referers_when_receiving_referer_on_silent_callback_then_allowed(setup: BffWithFrontend)
✅ given_list_of_referers_when_receiving_referer_on_silent_callback_then_allowed(setup: ManuallyConfiguredBff)
✅ given_list_of_referers_when_receiving_referer_on_silent_callback_then_allowed(setup: V4Bff)
✅ given_list_of_referers_with_invalid_referer_then_returns_bad_request(setup: BffWithFrontend)
✅ given_list_of_referers_with_invalid_referer_then_returns_bad_request(setup: ManuallyConfiguredBff)
✅ given_list_of_referers_with_invalid_referer_then_returns_bad_request(setup: V4Bff)
✅ given_list_of_referers_without_missing_header_then_returns_bad_request(setup: BffWithFrontend)
✅ given_list_of_referers_without_missing_header_then_returns_bad_request(setup: ManuallyConfiguredBff)
✅ given_list_of_referers_without_missing_header_then_returns_bad_request(setup: V4Bff)
✅ login_endpoint_should_accept_returnUrl(setup: BffWithFrontend)
✅ login_endpoint_should_accept_returnUrl(setup: ManuallyConfiguredBff)
✅ login_endpoint_should_accept_returnUrl(setup: V4Bff)
✅ login_endpoint_should_authenticatre_and_redirect_to_root(setup: BffWithFrontend)
✅ login_endpoint_should_authenticatre_and_redirect_to_root(setup: ManuallyConfiguredBff)
✅ login_endpoint_should_authenticatre_and_redirect_to_root(setup: V4Bff)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_custom_prefix_trailing_slash(setup: BffWithFrontend)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_custom_prefix_trailing_slash(setup: ManuallyConfiguredBff)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_custom_prefix_trailing_slash(setup: V4Bff)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_custom_prefix(setup: BffWithFrontend)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_custom_prefix(setup: ManuallyConfiguredBff)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_custom_prefix(setup: V4Bff)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_root_prefix(setup: BffWithFrontend)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_root_prefix(setup: ManuallyConfiguredBff)
✅ login_endpoint_should_challenge_and_redirect_to_root_with_root_prefix(setup: V4Bff)
✅ login_endpoint_should_not_accept_non_local_returnUrl(setup: BffWithFrontend)
✅ login_endpoint_should_not_accept_non_local_returnUrl(setup: ManuallyConfiguredBff)
✅ login_endpoint_should_not_accept_non_local_returnUrl(setup: V4Bff)
✅ login_endpoint_with_existing_session_should_challenge(setup: BffWithFrontend)
✅ login_endpoint_with_existing_session_should_challenge(setup: ManuallyConfiguredBff)
✅ login_endpoint_with_existing_session_should_challenge(setup: V4Bff)
✅ login_should_allow_anonymous(setup: BffWithFrontend)
✅ login_should_allow_anonymous(setup: ManuallyConfiguredBff)
✅ login_should_allow_anonymous(setup: V4Bff)
✅ login_with_unsupported_prompt_is_rejected(setup: BffWithFrontend)
✅ login_with_unsupported_prompt_is_rejected(setup: ManuallyConfiguredBff)
✅ login_with_unsupported_prompt_is_rejected(setup: V4Bff)
✅ silent_login_should_challenge_and_return_silent_login_html(setup: BffWithFrontend)
✅ silent_login_should_challenge_and_return_silent_login_html(setup: ManuallyConfiguredBff)
✅ silent_login_should_challenge_and_return_silent_login_html(setup: V4Bff)
✅ when_unauthenticated_silent_login_should_return_isLoggedIn_false(setup: BffWithFrontend)
✅ when_unauthenticated_silent_login_should_return_isLoggedIn_false(setup: ManuallyConfiguredBff)
✅ when_unauthenticated_silent_login_should_return_isLoggedIn_false(setup: V4Bff)

✅ Duende.Bff.Tests.Endpoints.Management.LogoutEndpointTests

✅ can_logout_twice(setup: BffWithFrontend)
✅ can_logout_twice(setup: ManuallyConfiguredBff)
✅ can_logout_twice(setup: V4Bff)
✅ logout_endpoint_for_anonymous_user_without_sid_should_succeed(setup: BffWithFrontend)
✅ logout_endpoint_for_anonymous_user_without_sid_should_succeed(setup: ManuallyConfiguredBff)
✅ logout_endpoint_for_anonymous_user_without_sid_should_succeed(setup: V4Bff)
✅ logout_endpoint_for_authenticated_should_require_sid(setup: BffWithFrontend)
✅ logout_endpoint_for_authenticated_should_require_sid(setup: ManuallyConfiguredBff)
✅ logout_endpoint_for_authenticated_should_require_sid(setup: V4Bff)
✅ logout_endpoint_for_authenticated_user_without_sid_should_succeed(setup: BffWithFrontend)
✅ logout_endpoint_for_authenticated_user_without_sid_should_succeed(setup: ManuallyConfiguredBff)
✅ logout_endpoint_for_authenticated_user_without_sid_should_succeed(setup: V4Bff)
✅ logout_endpoint_for_authenticated_when_require_option_is_false_should_not_require_sid(setup: BffWithFrontend)
✅ logout_endpoint_for_authenticated_when_require_option_is_false_should_not_require_sid(setup: ManuallyConfiguredBff)
✅ logout_endpoint_for_authenticated_when_require_option_is_false_should_not_require_sid(setup: V4Bff)
✅ logout_endpoint_should_accept_returnUrl(setup: BffWithFrontend)
✅ logout_endpoint_should_accept_returnUrl(setup: ManuallyConfiguredBff)
✅ logout_endpoint_should_accept_returnUrl(setup: V4Bff)
✅ logout_endpoint_should_allow_anonymous(setup: BffWithFrontend)
✅ logout_endpoint_should_allow_anonymous(setup: ManuallyConfiguredBff)
✅ logout_endpoint_should_allow_anonymous(setup: V4Bff)
✅ logout_endpoint_should_reject_non_local_returnUrl(setup: BffWithFrontend)
✅ logout_endpoint_should_reject_non_local_returnUrl(setup: ManuallyConfiguredBff)
✅ logout_endpoint_should_reject_non_local_returnUrl(setup: V4Bff)
✅ logout_endpoint_should_signout(setup: BffWithFrontend)
✅ logout_endpoint_should_signout(setup: ManuallyConfiguredBff)
✅ logout_endpoint_should_signout(setup: V4Bff)

✅ Duende.Bff.Tests.Endpoints.Management.ManagementBasePathTests

✅ custom_ManagementBasePath_should_affect_basepath(path: \"/login\", expectedStatusCode: Found)
✅ custom_ManagementBasePath_should_affect_basepath(path: \"/logout\", expectedStatusCode: Found)
✅ custom_ManagementBasePath_should_affect_basepath(path: \"/silent-login-callback\", expectedStatusCode: OK)
✅ custom_ManagementBasePath_should_affect_basepath(path: \"/silent-login\", expectedStatusCode: Found)
✅ custom_ManagementBasePath_should_affect_basepath(path: \"/user\", expectedStatusCode: Unauthorized)

✅ Duende.Bff.Tests.Endpoints.Management.UserEndpointTests

✅ can_enrich_claims_in_user_endpoint_by_performing_a_call_to_a_remote_service
✅ user_endpoint_for_authenticated_user_should_return_claims(setup: BffWithFrontend)
✅ user_endpoint_for_authenticated_user_should_return_claims(setup: ManuallyConfiguredBff)
✅ user_endpoint_for_authenticated_user_should_return_claims(setup: V4Bff)
✅ user_endpoint_for_authenticated_user_with_sid_should_return_claims_including_logout(setup: BffWithFrontend)
✅ user_endpoint_for_authenticated_user_with_sid_should_return_claims_including_logout(setup: ManuallyConfiguredBff)
✅ user_endpoint_for_authenticated_user_with_sid_should_return_claims_including_logout(setup: V4Bff)
✅ user_endpoint_for_authenticated_user_without_csrf_header_should_fail(setup: BffWithFrontend)
✅ user_endpoint_for_authenticated_user_without_csrf_header_should_fail(setup: ManuallyConfiguredBff)
✅ user_endpoint_for_authenticated_user_without_csrf_header_should_fail(setup: V4Bff)
✅ user_endpoint_for_unauthenticated_user_should_fail(setup: BffWithFrontend)
✅ user_endpoint_for_unauthenticated_user_should_fail(setup: ManuallyConfiguredBff)
✅ user_endpoint_for_unauthenticated_user_should_fail(setup: V4Bff)
✅ when_configured_user_endpoint_for_unauthenticated_user_should_return_200_and_empty(setup: BffWithFrontend)
✅ when_configured_user_endpoint_for_unauthenticated_user_should_return_200_and_empty(setup: ManuallyConfiguredBff)
✅ when_configured_user_endpoint_for_unauthenticated_user_should_return_200_and_empty(setup: V4Bff)

✅ Duende.Bff.Tests.Endpoints.RemoteEndpointTests

✅ calls_to_remote_api_that_returns_forbidden_will_return_forbidden(setup: BffWithFrontend)
✅ calls_to_remote_api_that_returns_forbidden_will_return_forbidden(setup: ManuallyConfiguredBff)
✅ calls_to_remote_api_that_returns_forbidden_will_return_forbidden(setup: V4Bff)
✅ calls_to_remote_api_that_returns_unauthorized_will_return_unauthorized(setup: BffWithFrontend)
✅ calls_to_remote_api_that_returns_unauthorized_will_return_unauthorized(setup: ManuallyConfiguredBff)
✅ calls_to_remote_api_that_returns_unauthorized_will_return_unauthorized(setup: V4Bff)
✅ calls_to_remote_endpoint_should_fail_when_token_retrieval_fails(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_should_fail_when_token_retrieval_fails(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_should_fail_when_token_retrieval_fails(setup: V4Bff)
✅ calls_to_remote_endpoint_should_forward_client_token_to_api(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_should_forward_client_token_to_api(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_should_forward_client_token_to_api(setup: V4Bff)
✅ calls_to_remote_endpoint_should_forward_user_or_anonymous_to_api(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_should_forward_user_or_anonymous_to_api(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_should_forward_user_or_anonymous_to_api(setup: V4Bff)
✅ calls_to_remote_endpoint_should_forward_user_or_client_to_api(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_should_forward_user_or_client_to_api(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_should_forward_user_or_client_to_api(setup: V4Bff)
✅ calls_to_remote_endpoint_should_forward_user_to_api(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_should_forward_user_to_api(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_should_forward_user_to_api(setup: V4Bff)
✅ calls_to_remote_endpoint_should_require_csrf(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_should_require_csrf(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_should_require_csrf(setup: V4Bff)
✅ calls_to_remote_endpoint_should_send_token_from_token_retriever_when_token_retrieval_succeeds(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_should_send_token_from_token_retriever_when_token_retrieval_succeeds(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_should_send_token_from_token_retriever_when_token_retrieval_succeeds(setup: V4Bff)
✅ calls_to_remote_endpoint_with_anon_should_be_anon(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_with_anon_should_be_anon(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_with_anon_should_be_anon(setup: V4Bff)
✅ calls_to_remote_endpoint_with_useraccesstokenparameters_having_not_stored_corresponding_named_token_finds_no_matching_token_should_fail(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_with_useraccesstokenparameters_having_not_stored_corresponding_named_token_finds_no_matching_token_should_fail(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_with_useraccesstokenparameters_having_not_stored_corresponding_named_token_finds_no_matching_token_should_fail(setup: V4Bff)
✅ calls_to_remote_endpoint_with_useraccesstokenparameters_having_stored_named_token_should_forward_user_to_api(setup: BffWithFrontend)
✅ calls_to_remote_endpoint_with_useraccesstokenparameters_having_stored_named_token_should_forward_user_to_api(setup: ManuallyConfiguredBff)
✅ calls_to_remote_endpoint_with_useraccesstokenparameters_having_stored_named_token_should_forward_user_to_api(setup: V4Bff)
✅ Can_register_default_forwarder_config_for_MapRemoteBffApiEndpoint(setup: BffWithFrontend)
✅ Can_register_default_forwarder_config_for_MapRemoteBffApiEndpoint(setup: ManuallyConfiguredBff)
✅ Can_register_default_forwarder_config_for_MapRemoteBffApiEndpoint(setup: V4Bff)
✅ endpoints_that_disable_csrf_should_not_require_csrf_header(setup: BffWithFrontend)
✅ endpoints_that_disable_csrf_should_not_require_csrf_header(setup: ManuallyConfiguredBff)
✅ endpoints_that_disable_csrf_should_not_require_csrf_header(setup: V4Bff)
✅ MapRemoteBffApiEndpoint_can_override_config_to_configure_a_timeout(setup: BffWithFrontend)
✅ MapRemoteBffApiEndpoint_can_override_config_to_configure_a_timeout(setup: ManuallyConfiguredBff)
✅ MapRemoteBffApiEndpoint_can_override_config_to_configure_a_timeout(setup: V4Bff)
✅ MapRemoteBffApiEndpoint_can_override_default_transform(setup: BffWithFrontend)
✅ MapRemoteBffApiEndpoint_can_override_default_transform(setup: ManuallyConfiguredBff)
✅ MapRemoteBffApiEndpoint_can_override_default_transform(setup: V4Bff)
✅ post_to_remote_endpoint_should_forward_user_to_api(setup: BffWithFrontend)
✅ post_to_remote_endpoint_should_forward_user_to_api(setup: ManuallyConfiguredBff)
✅ post_to_remote_endpoint_should_forward_user_to_api(setup: V4Bff)
✅ put_to_remote_endpoint_should_forward_user_to_api(setup: BffWithFrontend)
✅ put_to_remote_endpoint_should_forward_user_to_api(setup: ManuallyConfiguredBff)
✅ put_to_remote_endpoint_should_forward_user_to_api(setup: V4Bff)
✅ response_status_401_from_remote_endpoint_should_return_401_from_bff(setup: BffWithFrontend)
✅ response_status_401_from_remote_endpoint_should_return_401_from_bff(setup: ManuallyConfiguredBff)
✅ response_status_401_from_remote_endpoint_should_return_401_from_bff(setup: V4Bff)
✅ response_status_403_from_remote_endpoint_should_return_403_from_bff(setup: BffWithFrontend)
✅ response_status_403_from_remote_endpoint_should_return_403_from_bff(setup: ManuallyConfiguredBff)
✅ response_status_403_from_remote_endpoint_should_return_403_from_bff(setup: V4Bff)
✅ unauthenticated_calls_to_remote_endpoint_should_return_401(setup: BffWithFrontend)
✅ unauthenticated_calls_to_remote_endpoint_should_return_401(setup: ManuallyConfiguredBff)
✅ unauthenticated_calls_to_remote_endpoint_should_return_401(setup: V4Bff)
✅ when_id_srv_client_is_disabled_then_unauthorized(setup: BffWithFrontend)
✅ when_id_srv_client_is_disabled_then_unauthorized(setup: ManuallyConfiguredBff)
✅ when_id_srv_client_is_disabled_then_unauthorized(setup: V4Bff)

✅ Duende.Bff.Tests.Endpoints.WireupTests

✅ Can_call_map_management_endpoints_with_automapping
✅ Can_call_map_management_endpoints_with_automapping_when_management_path_has_template
✅ Without_auto_wireup_management_endpoints_are_not_mapped

✅ Duende.Bff.Tests.Endpoints.YarpTests

✅ anonymous_call_to_no_token_requirement_route_should_succeed(setup: BffWithFrontend)
✅ anonymous_call_to_no_token_requirement_route_should_succeed(setup: ManuallyConfiguredBff)
✅ anonymous_call_to_no_token_requirement_route_should_succeed(setup: V4Bff)
✅ anonymous_call_to_optional_user_token_route_should_succeed(setup: BffWithFrontend)
✅ anonymous_call_to_optional_user_token_route_should_succeed(setup: ManuallyConfiguredBff)
✅ anonymous_call_to_optional_user_token_route_should_succeed(setup: V4Bff)
✅ anonymous_call_to_user_token_requirement_route_should_fail(setup: BffWithFrontend)
✅ anonymous_call_to_user_token_requirement_route_should_fail(setup: ManuallyConfiguredBff)
✅ anonymous_call_to_user_token_requirement_route_should_fail(setup: V4Bff)
✅ anonymous_call_with_no_csrf_header_to_csrf_route_should_fail(setup: BffWithFrontend)
✅ anonymous_call_with_no_csrf_header_to_csrf_route_should_fail(setup: ManuallyConfiguredBff)
✅ anonymous_call_with_no_csrf_header_to_csrf_route_should_fail(setup: V4Bff)
✅ anonymous_call_with_no_csrf_header_to_no_token_requirement_no_csrf_route_should_succeed(setup: BffWithFrontend)
✅ anonymous_call_with_no_csrf_header_to_no_token_requirement_no_csrf_route_should_succeed(setup: ManuallyConfiguredBff)
✅ anonymous_call_with_no_csrf_header_to_no_token_requirement_no_csrf_route_should_succeed(setup: V4Bff)
✅ authenticated_GET_should_forward_user_to_api_for_user(setup: BffWithFrontend)
✅ authenticated_GET_should_forward_user_to_api_for_user(setup: ManuallyConfiguredBff)
✅ authenticated_GET_should_forward_user_to_api_for_user(setup: V4Bff)
✅ authenticated_Post_should_forward_user_to_api_for_User(setup: BffWithFrontend)
✅ authenticated_Post_should_forward_user_to_api_for_User(setup: ManuallyConfiguredBff)
✅ authenticated_Post_should_forward_user_to_api_for_User(setup: V4Bff)
✅ authenticated_Post_should_forward_user_to_api_for_UserOrNone(setup: BffWithFrontend)
✅ authenticated_Post_should_forward_user_to_api_for_UserOrNone(setup: ManuallyConfiguredBff)
✅ authenticated_Post_should_forward_user_to_api_for_UserOrNone(setup: V4Bff)
✅ authenticated_PUT_should_forward_user_to_api_for_UserOrNone(setup: BffWithFrontend)
✅ authenticated_PUT_should_forward_user_to_api_for_UserOrNone(setup: ManuallyConfiguredBff)
✅ authenticated_PUT_should_forward_user_to_api_for_UserOrNone(setup: V4Bff)
✅ call_to_client_token_route_should_forward_client_token_to_api(setup: BffWithFrontend)
✅ call_to_client_token_route_should_forward_client_token_to_api(setup: ManuallyConfiguredBff)
✅ call_to_client_token_route_should_forward_client_token_to_api(setup: V4Bff)
✅ call_to_user_or_client_token_route_should_forward_user_or_client_token_to_api(setup: BffWithFrontend)
✅ call_to_user_or_client_token_route_should_forward_user_or_client_token_to_api(setup: ManuallyConfiguredBff)
✅ call_to_user_or_client_token_route_should_forward_user_or_client_token_to_api(setup: V4Bff)
✅ can_disable_anti_forgery_check(setup: BffWithFrontend)
✅ can_disable_anti_forgery_check(setup: ManuallyConfiguredBff)
✅ can_disable_anti_forgery_check(setup: V4Bff)
✅ old_anonymous_call_to_optional_user_token_route_should_succeed(setup: BffWithFrontend)
✅ old_anonymous_call_to_optional_user_token_route_should_succeed(setup: ManuallyConfiguredBff)
✅ old_anonymous_call_to_optional_user_token_route_should_succeed(setup: V4Bff)
✅ response_status_401_from_remote_endpoint_should_return_401_from_bff(setup: BffWithFrontend)
✅ response_status_401_from_remote_endpoint_should_return_401_from_bff(setup: ManuallyConfiguredBff)
✅ response_status_401_from_remote_endpoint_should_return_401_from_bff(setup: V4Bff)
✅ response_status_403_from_remote_endpoint_should_return_403_from_bff(setup: BffWithFrontend)
✅ response_status_403_from_remote_endpoint_should_return_403_from_bff(setup: ManuallyConfiguredBff)
✅ response_status_403_from_remote_endpoint_should_return_403_from_bff(setup: V4Bff)
✅ yarp_works_with_path_based_routing

✅ Duende.Bff.Tests.Headers.ApiAndBffUseForwardedHeaders

✅ bff_host_name_should_propagate_to_api
✅ forwarded_host_name_with_header_forwarding_should_propagate_to_api

✅ Duende.Bff.Tests.Headers.ApiUseForwardedHeaders

✅ bff_host_name_should_propagate_to_api
✅ forwarded_host_name_should_not_propagate_to_api

✅ Duende.Bff.Tests.Headers.GeneralTests

✅ custom_header_should_be_forwarded_and_xforwarded_headers_should_be_created(setup: BffWithFrontend)
✅ custom_header_should_be_forwarded_and_xforwarded_headers_should_be_created(setup: ManuallyConfiguredBff)
✅ custom_header_should_be_forwarded_and_xforwarded_headers_should_be_created(setup: V4Bff)
✅ custom_header_should_be_forwarded(setup: BffWithFrontend)
✅ custom_header_should_be_forwarded(setup: ManuallyConfiguredBff)
✅ custom_header_should_be_forwarded(setup: V4Bff)
✅ If_management_endpoints_are_mapped_manually_then_warning_is_written(setup: BffWithFrontend)
✅ If_management_endpoints_are_mapped_manually_then_warning_is_written(setup: ManuallyConfiguredBff)
✅ If_management_endpoints_are_mapped_manually_then_warning_is_written(setup: V4Bff)
✅ local_endpoint_should_receive_standard_headers(setup: BffWithFrontend)
✅ local_endpoint_should_receive_standard_headers(setup: ManuallyConfiguredBff)
✅ local_endpoint_should_receive_standard_headers(setup: V4Bff)
✅ Will_auto_register_login_endpoints(setup: BffWithFrontend)
✅ Will_auto_register_login_endpoints(setup: ManuallyConfiguredBff)
✅ Will_auto_register_login_endpoints(setup: V4Bff)

✅ Duende.Bff.Tests.IAccessTokenRetriever_Extensibility_tests

✅ When_calling_custom_endpoint_then_AccessTokenRetrievalContext_has_api_address_and_localpath
✅ When_calling_sub_custom_endpoint_then_AccessTokenRetrievalContext_has_api_address_and_localpath

✅ Duende.Bff.Tests.Internal.ClaimsPrincipalRecordTests

✅ Can_convert_between_ClaimsPrincipal_and_ClaimsPrincipalRecord
✅ Can_convert_ClaimsPrincipalRecord_with_default_ClaimsRecord
✅ Can_convert_default_ClaimsPrincipalRecord
✅ ToClaimsPrincipal_handles_null_Claims_from_deserialization
✅ ToClaimsPrincipal_handles_null_Type_in_ClaimRecord_from_deserialization
✅ ToClaimsPrincipal_handles_null_Value_in_ClaimRecord_from_deserialization

✅ Duende.Bff.Tests.LicensingTests

✅ Given_expired_license_then_log_warning
✅ Given_no_license_then_error_log
✅ Given_valid_but_expired_license_then_no_valid_or_trial_mode_logs
✅ Should_log_error_when_trial_mode_authenticated_session_limit_exceeded
✅ Should_not_log_error_when_below_trial_mode_authenticated_session_limit

✅ Duende.Bff.Tests.MultiFrontend.FrontendCollectionTests

✅ Can_load_frontends_from_config
✅ Can_load_frontends_from_constructor
⚪ Cookie_Config_precedence_is_programmatic_defaults_then_configured_defaults_then_frontend_specific
⚪ ODIC_Config_precedence_is_programmatic_defaults_then_configured_defaults_then_frontend_specific
✅ When_frontend_is_removed_then_event_is_raised
✅ When_frontend_is_updated_then_event_is_raised
✅ When_identical_frontend_is_updated_then_no_event_is_raised

✅ Duende.Bff.Tests.MultiFrontend.FrontendSelectorTests

✅ HostHeader_takes_precedence_over_path
✅ Slash_also_functions_as_default_frontend
✅ TryMapFrontend_EmptyStore_ReturnsFalse
✅ TryMapFrontend_FallbackToDefaultFrontend_ReturnsTrue
✅ TryMapFrontend_MatchesByHost_ReturnsTrue
✅ TryMapFrontend_MatchesByHostAndPath_ReturnsTrue
✅ TryMapFrontend_MatchesByHostAndPathUri_ReturnsTrue
✅ TryMapFrontend_MatchesByHostUri_ReturnsTrue
✅ TryMapFrontend_MatchesByPath_logs_warning_on_invalid_case
✅ TryMapFrontend_MatchesByPath_ReturnsTrue
✅ TryMapFrontend_MultipleHosts_MatchesMostSpecific
✅ TryMapFrontend_MultiplePaths_MatchesMostSpecific
✅ TryMapFrontend_NoHostSpecified_MatchesByPath
✅ TryMapFrontend_NoMatches_ReturnsFalse
✅ TryMapFrontend_Will_return_first
✅ When_mapping_duplicate_then_warning_is_written(path: \"/\", uri: null)
✅ When_mapping_duplicate_then_warning_is_written(path: \"/some_path\", uri: \"https://some-url\")
✅ When_mapping_duplicate_then_warning_is_written(path: \"/some_path\", uri: null)
✅ When_mapping_duplicate_then_warning_is_written(path: null, uri: \"https://some-url\")
✅ When_mapping_duplicate_then_warning_is_written(path: null, uri: null)

✅ Duende.Bff.Tests.MultiFrontend.HostHeaderValueTests

✅ Can_compare_with_http_request(input: \"http://uri\", requestUri: \"http://uri\", matches: True, reason: \"default https port\")
✅ Can_compare_with_http_request(input: \"http://uri\", requestUri: \"https://uri\", matches: False, reason: \"different scheme\")
✅ Can_compare_with_http_request(input: \"https://uri:123\", requestUri: \"https://different:123\", matches: False, reason: \"different host, same port\")
✅ Can_compare_with_http_request(input: \"https://uri:123\", requestUri: \"https://uri:321\", matches: False, reason: \"different port\")
✅ Can_compare_with_http_request(input: \"https://uri\", requestUri: \"https://different\", matches: False, reason: \"different host, no port\")
✅ Can_compare_with_http_request(input: \"https://uri\", requestUri: \"https://uri\", matches: True, reason: \"same uri\")
✅ Can_compare_with_http_request(input: \"uri:443\", requestUri: \"https://uri\", matches: True, reason: \"default https port\")
✅ Can_compare_with_http_request(input: \"wss://uri\", requestUri: \"wss://uri\", matches: True, reason: \"Uri with websockets\")
✅ Can_parse_host_header(input: \"host.com:443\", host: \"host.com\", port: 443)
✅ Can_parse_host_header(input: \"host.com:5000\", host: \"host.com\", port: 5000)
✅ Can_parse_host_header(input: \"host.com:80\", host: \"host.com\", port: 80)
✅ Can_parse_host_header(input: \"host.com\", host: \"host.com\", port: 443)
✅ Can_parse_host_header(input: \"http://host.com:80\", host: \"host.com\", port: 80)
✅ Can_parse_host_header(input: \"https://host.com:443\", host: \"host.com\", port: 443)
✅ Can_parse_host_header(input: \"https://host.com:80\", host: \"host.com\", port: 80)
✅ Can_parse_host_header(input: \"https://host.com\", host: \"host.com\", port: 443)
✅ Equals_can_handle_default_ports
✅ Equals_can_handle_explicit_ports
✅ HostHeader_WithExplicitInitialization_SetsProperties
✅ Parse_WithCustomPort_SetsCorrectPort
✅ Parse_WithFragment_IgnoresFragment
✅ Parse_WithValidHttpsUrl_SetsCorrectProperties
✅ Parse_WithValidHttpUrl_SetsCorrectProperties
✅ ToHostStringHandlesDefaultPorts(url: \"http://example.com:80\", hoststring: \"example.com\", port: 80)
✅ ToHostStringHandlesDefaultPorts(url: \"http://example.com:888\", hoststring: \"example.com\", port: 888)
✅ ToHostStringHandlesDefaultPorts(url: \"http://example.com\", hoststring: \"example.com\", port: 80)
✅ ToHostStringHandlesDefaultPorts(url: \"https://example.com:443\", hoststring: \"example.com\", port: 443)
✅ ToHostStringHandlesDefaultPorts(url: \"https://example.com:888\", hoststring: \"example.com\", port: 888)
✅ ToHostStringHandlesDefaultPorts(url: \"https://example.com\", hoststring: \"example.com\", port: 443)
✅ Will_catch_invalid_hostheader(input: \"http:/not\", reason: \"not a valid host header\")
✅ Will_catch_invalid_hostheader(input: \"not:a\", reason: \"not a valid host header\")

✅ Duende.Bff.Tests.MultiFrontend.PathMapperTests

✅ MapPath_WithCaseInsensitiveMatch_UpdatesPathBaseAndPath
✅ MapPath_WithEmptyPathBase_AddsMatchingPathToPathBase
✅ MapPath_WithExactMatchingPath_UpdatesPathBaseAndLeavesEmptyPath
✅ MapPath_WithMatchingPath_UpdatesPathBaseAndPath
✅ MapPath_WithNoMatchingPath_Returns404
✅ MapPath_WithNoMatchingPaths_DoesNotModifyPathBaseOrPath

✅ Duende.Bff.Tests.SessionManagement.CookieSlidingTests

✅ user_endpoint_cookie_should_slide(setup: BffWithFrontend)
✅ user_endpoint_cookie_should_slide(setup: ManuallyConfiguredBff)
✅ user_endpoint_cookie_should_slide(setup: V4Bff)
✅ user_endpoint_when_sliding_flag_is_passed_cookie_should_not_slide(setup: BffWithFrontend)
✅ user_endpoint_when_sliding_flag_is_passed_cookie_should_not_slide(setup: ManuallyConfiguredBff)
✅ user_endpoint_when_sliding_flag_is_passed_cookie_should_not_slide(setup: V4Bff)
✅ user_endpoint_when_uservalidate_renews_and_sliding_flag_is_passed_cookie_should_not_slide(setup: BffWithFrontend)
✅ user_endpoint_when_uservalidate_renews_and_sliding_flag_is_passed_cookie_should_not_slide(setup: ManuallyConfiguredBff)
✅ user_endpoint_when_uservalidate_renews_and_sliding_flag_is_passed_cookie_should_not_slide(setup: V4Bff)
✅ user_endpoint_when_uservalidate_renews_cookie_should_slide(setup: BffWithFrontend)
✅ user_endpoint_when_uservalidate_renews_cookie_should_slide(setup: ManuallyConfiguredBff)
✅ user_endpoint_when_uservalidate_renews_cookie_should_slide(setup: V4Bff)

✅ Duende.Bff.Tests.SessionManagement.RevokeRefreshTokenTests

✅ backchannel_logout_endpoint_should_revoke_refreshtoken(setup: BffWithFrontend)
✅ backchannel_logout_endpoint_should_revoke_refreshtoken(setup: ManuallyConfiguredBff)
✅ backchannel_logout_endpoint_should_revoke_refreshtoken(setup: V4Bff)
✅ logout_should_revoke_refreshtoken(setup: BffWithFrontend)
✅ logout_should_revoke_refreshtoken(setup: ManuallyConfiguredBff)
✅ logout_should_revoke_refreshtoken(setup: V4Bff)
✅ when_setting_disabled_backchannel_logout_endpoint_should_not_revoke_refreshtoken(setup: BffWithFrontend)
✅ when_setting_disabled_backchannel_logout_endpoint_should_not_revoke_refreshtoken(setup: ManuallyConfiguredBff)
✅ when_setting_disabled_backchannel_logout_endpoint_should_not_revoke_refreshtoken(setup: V4Bff)
✅ when_setting_disabled_logout_should_not_revoke_refreshtoken(setup: BffWithFrontend)
✅ when_setting_disabled_logout_should_not_revoke_refreshtoken(setup: ManuallyConfiguredBff)
✅ when_setting_disabled_logout_should_not_revoke_refreshtoken(setup: V4Bff)

✅ Duende.Bff.Tests.SessionManagement.ServerSideTicketStoreTests

✅ Given_multiple_frontends_each_frontend_gets_a_session
✅ Given_multiple_frontends_logout_only_affects_single_frontend
✅ StoreAsync_should_remove_conflicting_entries_prior_to_creating_new_entry(setup: BffWithFrontend)
✅ StoreAsync_should_remove_conflicting_entries_prior_to_creating_new_entry(setup: ManuallyConfiguredBff)
✅ StoreAsync_should_remove_conflicting_entries_prior_to_creating_new_entry(setup: V4Bff)

✅ Duende.Bff.Tests.TestInfra.TestInfraTests

✅ Can_add_api_endpoint_to_bff_host
✅ Can_login_to_bff_host
✅ Can_login_to_identity_server