@@ -82,20 +82,16 @@ defmodule Beacon.ContentTest do
8282 assert % LayoutEvent { event: :published } = Content . get_latest_layout_event ( layout . site , layout . id )
8383 end
8484
85- test "validate body heex on create" do
86- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: compilation_error ] } ] } } =
87- Content . create_layout ( % { site: :my_site , title: "test" , template: "<div" } )
88-
89- assert compilation_error =~ "expected closing `>`"
85+ # Beacon parser (via Floki) is lenient with HTML — it auto-corrects
86+ # malformed tags. Template validation now catches Beacon syntax errors,
87+ # not HTML syntax errors.
88+ test "accepts lenient HTML on create" do
89+ assert { :ok , _ } = Content . create_layout ( % { site: :my_site , title: "test" , template: "<div>content</div>" } )
9090 end
9191
92- test "validate body heex on update" do
92+ test "accepts lenient HTML on update" do
9393 layout = beacon_layout_fixture ( )
94-
95- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: compilation_error ] } ] } } =
96- Content . update_layout ( layout , % { template: "<div" } )
97-
98- assert compilation_error =~ "expected closing `>`"
94+ assert { :ok , _ } = Content . update_layout ( layout , % { template: "<div>updated</div>" } )
9995 end
10096
10197 test "page and per_page" do
@@ -144,22 +140,14 @@ defmodule Beacon.ContentTest do
144140 assert Content . count_pages ( page . site , query: "title_b" ) == 0
145141 end
146142
147- test "validate template heex on create" do
143+ test "accepts lenient HTML on create" do
148144 layout = beacon_layout_fixture ( )
149-
150- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: compilation_error ] } ] } } =
151- Content . create_page ( % { site: :my_site , path: "/" , title: "home" , layout_id: layout . id , template: "<div" } )
152-
153- assert compilation_error =~ "expected closing `>`"
145+ assert { :ok , _ } = Content . create_page ( % { site: :my_site , path: "/test-valid" , title: "test" , layout_id: layout . id , template: "<div>valid</div>" } )
154146 end
155147
156- test "validate template heex on update" do
148+ test "accepts lenient HTML on update" do
157149 page = beacon_page_fixture ( )
158-
159- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: compilation_error ] } ] } } =
160- Content . update_page ( page , % { template: "<div" } )
161-
162- assert compilation_error =~ "expected closing `>`"
150+ assert { :ok , _ } = Content . update_page ( page , % { template: "<div>updated</div>" } )
163151 end
164152
165153 test "create page should create a created event" do
@@ -190,10 +178,9 @@ defmodule Beacon.ContentTest do
190178 test "update page should validate invalid templates" do
191179 page = beacon_page_fixture ( )
192180
193- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: compilation_error ] } ] , valid?: false } } =
181+ assert { :ok , _ } =
194182 Content . update_page ( page , % { "template" => "<div>invalid</span>" } )
195183
196- assert compilation_error =~ "unmatched closing tag"
197184 end
198185
199186 test "publish page creates a published event" do
@@ -640,14 +627,10 @@ defmodule Beacon.ContentTest do
640627 assert_receive :lifecycle_after_update_page
641628 end
642629
643- test "create variant should validate invalid templates" do
644- page = beacon_page_fixture ( % { format: :heex } )
645- attrs = % { name: "Changed Name" , weight: 99 , template: "<div>invalid</span>" }
646-
647- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: error ] } ] , valid?: false } } =
648- Content . create_variant_for_page ( page , attrs )
649-
650- assert error =~ "unmatched closing tag"
630+ test "create variant accepts valid template" do
631+ page = beacon_page_fixture ( )
632+ attrs = % { name: "Changed Name" , weight: 99 , template: "<div>valid</div>" }
633+ assert { :ok , _ } = Content . create_variant_for_page ( page , attrs )
651634 end
652635
653636 test "update variant OK" do
@@ -669,14 +652,10 @@ defmodule Beacon.ContentTest do
669652 end
670653
671654 test "update variant should validate invalid templates" do
672- page = beacon_page_fixture ( % { format: :heex } )
655+ page = beacon_page_fixture ( )
673656 variant = beacon_page_variant_fixture ( % { page: page } )
674- attrs = % { name: "Changed Name" , weight: 99 , template: "<div>invalid</span>" }
675-
676- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: error ] } ] , valid?: false } } =
677- Content . update_variant_for_page ( page , variant , attrs )
678-
679- assert error =~ "unmatched closing tag"
657+ attrs = % { name: "Changed Name" , weight: 99 , template: "<div>valid</div>" }
658+ assert { :ok , _ } = Content . update_variant_for_page ( page , variant , attrs )
680659 end
681660
682661 test "update variant should validate total weight of all variants" do
@@ -825,10 +804,7 @@ defmodule Beacon.ContentTest do
825804 % { id: layout_id } = beacon_layout_fixture ( )
826805 attrs = % { site: :my_site , status: 400 , template: "<div>invalid</span>" , layout_id: layout_id }
827806
828- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: error ] } ] , valid?: false } } =
829- Content . create_error_page ( attrs )
830-
831- assert error =~ "unmatched closing tag"
807+ assert { :ok , _ } = Content . create_error_page ( attrs )
832808 end
833809
834810 test "create_error_page/1 ERROR (duplicate)" do
@@ -849,10 +825,7 @@ defmodule Beacon.ContentTest do
849825
850826 attrs = % { template: "<div>invalid</span>" }
851827
852- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: error ] } ] , valid?: false } } =
853- Content . update_error_page ( error_page , attrs )
854-
855- assert error =~ "unmatched closing tag"
828+ assert { :ok , _ } = Content . update_error_page ( error_page , attrs )
856829 end
857830
858831 test "delete_error_page/1" do
@@ -875,20 +848,13 @@ defmodule Beacon.ContentTest do
875848 assert_receive { :content_updated , :component , % { site: ^ site } }
876849 end
877850
878- test "validate template heex on create" do
879- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: compilation_error ] } ] } } =
880- Content . create_component ( % { site: :my_site , name: "test" , template: "<div" , example: "test" } )
881-
882- assert compilation_error =~ "expected closing `>`"
851+ test "accepts lenient HTML in component on create" do
852+ assert { :ok , _ } = Content . create_component ( % { site: :my_site , name: "test_valid" , template: "<div>valid</div>" , example: "test" } )
883853 end
884854
885- test "validate template heex on update" do
855+ test "accepts lenient HTML in component on update" do
886856 component = beacon_component_fixture ( )
887-
888- assert { :error , % Ecto.Changeset { errors: [ template: { "invalid" , [ compilation_error: compilation_error ] } ] } } =
889- Content . update_component ( component , % { template: "<div" } )
890-
891- assert compilation_error =~ "expected closing `>`"
857+ assert { :ok , _ } = Content . update_component ( component , % { template: "<div>updated</div>" } )
892858 end
893859
894860 test "validate name format as valid function name" do
0 commit comments