From 1acadf6ea6c6839af43f68f038f50c87e9d5a770 Mon Sep 17 00:00:00 2001 From: Martin Meyerhoff Date: Tue, 4 Feb 2025 13:42:32 +0100 Subject: [PATCH] Add specs for format matchers These led to a bit of confusion in the config-object PR, so let's add some tests here. --- config/alchemy/config.yml | 6 ++--- spec/dummy/config/alchemy/elements.yml | 7 +++++ spec/libraries/alchemy/tasks/usage_spec.rb | 1 + spec/libraries/config_spec.rb | 27 +++++++++++++++++++ .../alchemy/ingredient_validator_spec.rb | 22 +++++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/config/alchemy/config.yml b/config/alchemy/config.yml index c810a2b6cb..e51345bd09 100644 --- a/config/alchemy/config.yml +++ b/config/alchemy/config.yml @@ -199,9 +199,9 @@ link_target_options: [blank] # validates_format_of :url, with: Alchemy::Config.get('format_matchers')['url'] # format_matchers: - email: !ruby/regexp '/\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/' - url: !ruby/regexp '/\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?\z/ix' - link_url: !ruby/regexp '/^(tel:|mailto:|\/|[a-z]+:\/\/)/' + email: !ruby/regexp /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/ + url: !ruby/regexp /\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?\z/ix + link_url: !ruby/regexp /^(tel:|mailto:|\/|[a-z]+:\/\/)/ # The layout used for rendering the +alchemy/admin/pages#show+ action. admin_page_preview_layout: application diff --git a/spec/dummy/config/alchemy/elements.yml b/spec/dummy/config/alchemy/elements.yml index 6f433a895a..22c5455f42 100644 --- a/spec/dummy/config/alchemy/elements.yml +++ b/spec/dummy/config/alchemy/elements.yml @@ -263,3 +263,10 @@ - name: element_with_warning warning: "Do not use this element!" + +- name: element_with_url + ingredients: + - role: url + type: Text + validate: + - format: url diff --git a/spec/libraries/alchemy/tasks/usage_spec.rb b/spec/libraries/alchemy/tasks/usage_spec.rb index b4af2e6072..611919382a 100644 --- a/spec/libraries/alchemy/tasks/usage_spec.rb +++ b/spec/libraries/alchemy/tasks/usage_spec.rb @@ -22,6 +22,7 @@ {"name" => "contactform", "count" => 0}, {"name" => "download", "count" => 0}, {"name" => "element_with_ingredient_groups", "count" => 0}, + {"name" => "element_with_url", "count" => 0}, {"name" => "element_with_warning", "count" => 0}, {"name" => "erb_cell", "count" => 0}, {"name" => "erb_element", "count" => 0}, diff --git a/spec/libraries/config_spec.rb b/spec/libraries/config_spec.rb index c1ab0c74d7..45a03c37b2 100644 --- a/spec/libraries/config_spec.rb +++ b/spec/libraries/config_spec.rb @@ -178,5 +178,32 @@ module Alchemy end end end + + describe "format matchers" do + describe "email" do + subject { Alchemy::Config.get("format_matchers")["email"] } + + it { is_expected.to match("hello@gmail.com") } + it { is_expected.not_to match("stulli@gmx") } + end + + describe "url" do + subject { Alchemy::Config.get("format_matchers")["url"] } + + it { is_expected.to match("www.example.com:80/about") } + it { is_expected.not_to match('www.example.com:80\/about') } + end + + describe "link_url" do + subject { Alchemy::Config.get("format_matchers")["link_url"] } + + it { is_expected.to match("tel:12345") } + it { is_expected.to match("mailto:stulli@gmx.de") } + it { is_expected.to match("/home") } + it { is_expected.to match("https://example.com/home") } + it { is_expected.not_to match('\/brehmstierleben') } + it { is_expected.not_to match('https:\/\/example.com/home') } + end + end end end diff --git a/spec/models/alchemy/ingredient_validator_spec.rb b/spec/models/alchemy/ingredient_validator_spec.rb index 8e64f28613..5e19eaca75 100644 --- a/spec/models/alchemy/ingredient_validator_spec.rb +++ b/spec/models/alchemy/ingredient_validator_spec.rb @@ -58,6 +58,28 @@ end end + context "an element with url format validation" do + let(:element) { create(:alchemy_element, :with_ingredients, name: "element_with_url") } + let(:ingredient) { element.ingredient_by_role(:url) } + + before do + expect(ingredient).to receive(:value).at_least(:once) { value } + validate + end + + context "with a slash" do + let(:value) { "www.example.com:80/about" } + + it { expect(ingredient.errors).to be_blank } + end + + context "and the value is not matching" do + let(:value) { 'www.example.com:80\/about' } + + it { expect(ingredient.errors).to be_present } + end + end + context "with an ingredient having length validation" do let(:element) { create(:alchemy_element, :with_ingredients, name: "all_you_can_eat") } let(:ingredient) { element.ingredient_by_role(:headline) }