2024-02-08 12:59:52 +08:00
# frozen_string_literal: true
RSpec . describe ThemeSettingsManager :: Objects do
fab! ( :theme )
2024-03-27 10:54:30 +08:00
let ( :theme_setting ) do
2024-02-28 10:33:22 +08:00
yaml = File . read ( " #{ Rails . root } /spec/fixtures/theme_settings/objects_settings.yaml " )
field = theme . set_field ( target : :settings , name : " yaml " , value : yaml )
theme . save!
2024-03-27 10:54:30 +08:00
theme . settings
2024-02-28 10:33:22 +08:00
end
2024-02-08 12:59:52 +08:00
it " can store a list of objects " do
2024-02-28 10:33:22 +08:00
new_value = [
{
" name " = > " section 3 " ,
" links " = > [
{ " name " = > " section 3 link 1 " , " url " = > " https://section3link1.com " } ,
{ " name " = > " section 3 link 2 " } ,
] ,
} ,
{
" name " = > " section 4 " ,
" links " = > [ { " name " = > " section 4 link 1 " , " url " = > " https://section4link1.com " } ] ,
} ,
]
2024-02-08 12:59:52 +08:00
2024-03-27 10:54:30 +08:00
theme_setting [ :objects_setting ] . value = new_value
2024-02-08 12:59:52 +08:00
2024-02-28 10:33:22 +08:00
expect ( theme . reload . settings [ :objects_setting ] . value ) . to eq ( new_value )
end
it " raises the right error when there are objects which are not valid " do
new_value = [
{ " name " = > " section 3 " , " links " = > [ { " url " = > " https://some.url.no.name " } ] } ,
{
" links " = > [
{
" name " = > " some name that exceeds the max length of 20 characters " ,
" url " = > " https://some.url " ,
} ,
] ,
} ,
]
2024-02-08 12:59:52 +08:00
2024-03-27 10:54:30 +08:00
expect { theme_setting [ :objects_setting ] . value = new_value } . to raise_error (
2024-02-28 10:33:22 +08:00
Discourse :: InvalidParameters ,
" The property at JSON Pointer '/0/links/0/name' must be present. The property at JSON Pointer '/1/name' must be present. The property at JSON Pointer '/1/links/0/name' must be at most 20 characters long. " ,
2024-02-08 12:59:52 +08:00
)
end
2024-03-27 10:54:30 +08:00
describe " # categories " do
fab! ( :category_1 ) { Fabricate ( :category ) }
fab! ( :category_2 ) { Fabricate ( :category ) }
fab! ( :category_3 ) { Fabricate ( :private_category , group : Fabricate ( :group ) ) }
fab! ( :admin )
it " returns an empty array when there are no properties of `categories` type " do
expect ( theme_setting [ :objects_setting ] . categories ( Guardian . new ) ) . to eq ( [ ] )
end
it " returns the categories record for all the properties of `categories` type in a flat array " do
new_value = [
{
" category_ids " = > [ category_1 . id , category_2 . id ] ,
" child_categories " = > [ { " category_ids " = > [ category_3 . id ] } ] ,
} ,
]
theme_setting [ :objects_with_categories ] . value = new_value
expect ( theme . reload . settings [ :objects_with_categories ] . value ) . to eq ( new_value )
expect ( theme . settings [ :objects_with_categories ] . categories ( Guardian . new ) ) . to contain_exactly (
category_1 ,
category_2 ,
)
expect (
theme . settings [ :objects_with_categories ] . categories ( Guardian . new ( admin ) ) ,
) . to contain_exactly ( category_1 , category_2 , category_3 )
end
end
2024-02-08 12:59:52 +08:00
end