@@ -52,8 +52,8 @@ def test_create_and_delete_share_by_key(page: Page, radicale_server: str) -> Non
5252 "tr[data-name='sharetokenrowtemplate']:not(.hidden) span[data-name='ro']"
5353 )
5454 ).to_be_visible ()
55- page .once ("dialog" , lambda dialog : dialog .accept ())
5655 page .click ('tr:not(.hidden) button[data-name="delete"]' , strict = True )
56+ page .click ('#deleteconfirmationscene button[data-name="delete"]' )
5757 expect (
5858 page .locator ("tr[data-name='sharetokenrowtemplate']:not(.hidden)" )
5959 ).to_have_count (0 )
@@ -68,8 +68,8 @@ def test_create_and_delete_share_by_key(page: Page, radicale_server: str) -> Non
6868 "tr[data-name='sharetokenrowtemplate']:not(.hidden) span[data-name='rw']"
6969 )
7070 ).to_be_visible ()
71- page .once ("dialog" , lambda dialog : dialog .accept ())
7271 page .click ('tr:not(.hidden) button[data-name="delete"]' , strict = True )
72+ page .click ('#deleteconfirmationscene button[data-name="delete"]' )
7373 expect (
7474 page .locator ("tr[data-name='sharetokenrowtemplate']:not(.hidden)" )
7575 ).to_have_count (0 )
@@ -97,8 +97,8 @@ def test_create_and_delete_share_by_map(page: Page, radicale_server: str) -> Non
9797 "tr[data-name='sharemaprowtemplate']:not(.hidden) span[data-name='ro']"
9898 )
9999 ).to_be_visible ()
100- page .once ("dialog" , lambda dialog : dialog .accept ())
101100 page .click ('tr:not(.hidden) button[data-name="delete"]' , strict = True )
101+ page .click ('#deleteconfirmationscene button[data-name="delete"]' )
102102 expect (
103103 page .locator ("tr[data-name='sharemaprowtemplate']:not(.hidden)" )
104104 ).to_have_count (0 )
@@ -115,8 +115,8 @@ def test_create_and_delete_share_by_map(page: Page, radicale_server: str) -> Non
115115 "tr[data-name='sharemaprowtemplate']:not(.hidden) span[data-name='rw']"
116116 )
117117 ).to_be_visible ()
118- page .once ("dialog" , lambda dialog : dialog .accept ())
119118 page .click ('tr:not(.hidden) button[data-name="delete"]' , strict = True )
119+ page .click ('#deleteconfirmationscene button[data-name="delete"]' )
120120 expect (
121121 page .locator ("tr[data-name='sharemaprowtemplate']:not(.hidden)" )
122122 ).to_have_count (0 )
@@ -139,15 +139,29 @@ def test_share_with_property_overrides(page: Page, radicale_server: str) -> None
139139 page .click ('article:not(.hidden) a[data-name="share"]' , force = True , strict = True )
140140 page .click ('button[data-name="sharebytoken"]' )
141141
142+ # Verify property override is closed by default
143+ expect (
144+ page .locator ('input[data-name="displayname_override_enabled"]' )
145+ ).not_to_be_visible ()
146+ page .click ('details[data-name="properties_override"] summary' )
147+
142148 # Verify defaults
149+ expect (page .locator ('input[data-name="displayname_override"]' )).to_have_value (
150+ "Test Collection"
151+ )
143152 expect (page .locator ('input[data-name="description_override"]' )).to_have_value (
144153 "Original Description"
145154 )
146155 expect (page .locator ('input[data-name="color_override"]' )).to_have_value ("#ff0000" )
156+ expect (page .locator ('input[data-name="displayname_override"]' )).to_be_disabled ()
147157 expect (page .locator ('input[data-name="description_override"]' )).to_be_disabled ()
148158 expect (page .locator ('input[data-name="color_override"]' )).to_be_disabled ()
149159
150160 # Set overrides
161+ page .click ('label[for="newshare_attr_displayname_enabled"]' )
162+ page .locator ('input[data-name="displayname_override"]' ).fill (
163+ "Overridden Displayname"
164+ )
151165 page .click ('label[for="newshare_attr_description_enabled"]' )
152166 page .locator ('input[data-name="description_override"]' ).fill (
153167 "Overridden Description"
@@ -182,8 +196,20 @@ def test_share_journal_no_overrides(page: Page, radicale_server: str) -> None:
182196 page .click ('article:not(.hidden) a[data-name="share"]' , force = True , strict = True )
183197 page .click ('button[data-name="sharebytoken"]' )
184198
185- # Verify property override fieldset is hidden
186- expect (page .locator ('fieldset[data-name="properties_override"]' )).to_be_hidden ()
199+ # Verify property override visibility
200+ expect (page .locator ('details[data-name="properties_override"]' )).to_be_visible ()
201+ expect (
202+ page .locator ('input[data-name="displayname_override_enabled"]' )
203+ ).not_to_be_visible ()
204+ page .click ('details[data-name="properties_override"] summary' )
205+
206+ expect (
207+ page .locator ('input[data-name="displayname_override_enabled"]' )
208+ ).to_be_visible ()
209+ expect (
210+ page .locator ('input[data-name="description_override_enabled"]' )
211+ ).to_be_hidden ()
212+ expect (page .locator ('input[data-name="color_override_enabled"]' )).to_be_hidden ()
187213
188214 # Create the share
189215 page .click ('#newshare button[data-name="submit"]' )
@@ -423,3 +449,107 @@ def test_no_incoming_shares_message(page: Page, radicale_server: str) -> None:
423449
424450 page .click ('#incomingsharingscene button[data-name="cancel"]' )
425451 expect (page .locator ("#incomingsharingscene" )).to_be_hidden ()
452+
453+
454+ def test_create_and_delete_share_by_bday (page : Page , radicale_server : str ) -> None :
455+ login (page , radicale_server )
456+ # create collection of type ADDRESSBOOK for bday (bday only works with ADDRESSBOOK)
457+ page .click ('a[data-name="new"]' )
458+ page .locator ('#createcollectionscene select[data-name="type"]' ).select_option (
459+ "ADDRESSBOOK"
460+ )
461+ page .locator ('#createcollectionscene input[data-name="displayname"]' ).fill (
462+ "Addressbook For Bday"
463+ )
464+ page .click ('#createcollectionscene button[data-name="submit"]' )
465+
466+ page .hover ("article:not(.hidden)" )
467+ page .click ('article:not(.hidden) a[data-name="share"]' , force = True , strict = True )
468+
469+ expect (
470+ page .locator ("tr[data-name='sharebdayrowtemplate']:not(.hidden)" )
471+ ).to_have_count (0 )
472+
473+ page .click ('button[data-name="sharebybday"]' )
474+
475+ # verify user is auto-filled with current user (admin)
476+ expect (page .locator ('input[data-name="shareuser"]' )).to_have_value ("admin" )
477+ page .locator ('input[data-name="sharehref"]' ).fill ("bdaymapped" )
478+
479+ # verify that the permissions section is hidden entirely
480+ expect (page .locator ("input#newshare_attr_permissions_ro" )).to_be_hidden ()
481+ expect (page .locator ("input#newshare_attr_permissions_rw" )).to_be_hidden ()
482+
483+ page .click ('#newshare button[data-name="submit"]' )
484+ expect (
485+ page .locator ("tr[data-name='sharebdayrowtemplate']:not(.hidden)" )
486+ ).to_have_count (1 )
487+
488+ # verify no permissions pill in the bday row
489+ expect (
490+ page .locator (
491+ "tr[data-name='sharebdayrowtemplate']:not(.hidden) span[data-name='ro']"
492+ )
493+ ).to_have_count (0 )
494+
495+ # Close the share scene and verify the virtual bday calendar is now in the collections list
496+ page .click ('#sharecollectionscene button[data-name="cancel"]' )
497+ expect (page .locator ("#sharecollectionscene" )).to_be_hidden ()
498+
499+ # The virtual calendar (bdaymapped) should appear as its own article
500+ # after the cache was invalidated following the self-share
501+ expect (page .locator ("article:not(.hidden)" )).to_have_count (2 )
502+
503+ # Delete the bday share by re-opening the share scene
504+ page .hover ("article:not(.hidden) >> nth=0" )
505+ page .click ('article:not(.hidden) >> nth=0 >> a[data-name="share"]' , force = True )
506+ page .click (
507+ "tr[data-name='sharebdayrowtemplate']:not(.hidden) button[data-name='delete']" ,
508+ strict = True ,
509+ )
510+ page .click ('#deleteconfirmationscene button[data-name="delete"]' )
511+ expect (
512+ page .locator ("tr[data-name='sharebdayrowtemplate']:not(.hidden)" )
513+ ).to_have_count (0 )
514+
515+
516+ def test_bday_section_hidden_for_calendar (page : Page , radicale_server : str ) -> None :
517+ """Verify the bday calendar section is hidden for CALENDAR collections."""
518+ login (page , radicale_server )
519+
520+ page .click ('a[data-name="new"]' )
521+ page .locator ('#createcollectionscene select[data-name="type"]' ).select_option (
522+ "CALENDAR"
523+ )
524+ page .locator ('#createcollectionscene input[data-name="displayname"]' ).fill (
525+ "My Calendar"
526+ )
527+ page .click ('#createcollectionscene button[data-name="submit"]' )
528+
529+ page .hover ("article:not(.hidden)" )
530+ page .click ('article:not(.hidden) a[data-name="share"]' , force = True , strict = True )
531+
532+ expect (page .locator ("#sharecollectionscene" )).to_be_visible ()
533+ expect (page .locator ("div[data-name='sharebybday']" )).to_be_hidden ()
534+ page .click ('#sharecollectionscene button[data-name="cancel"]' )
535+
536+
537+ def test_bday_section_visible_for_addressbook (page : Page , radicale_server : str ) -> None :
538+ """Verify the bday calendar section is visible for ADDRESSBOOK collections."""
539+ login (page , radicale_server )
540+
541+ page .click ('a[data-name="new"]' )
542+ page .locator ('#createcollectionscene select[data-name="type"]' ).select_option (
543+ "ADDRESSBOOK"
544+ )
545+ page .locator ('#createcollectionscene input[data-name="displayname"]' ).fill (
546+ "My Addressbook"
547+ )
548+ page .click ('#createcollectionscene button[data-name="submit"]' )
549+
550+ page .hover ("article:not(.hidden)" )
551+ page .click ('article:not(.hidden) a[data-name="share"]' , force = True , strict = True )
552+
553+ expect (page .locator ("#sharecollectionscene" )).to_be_visible ()
554+ expect (page .locator ("div[data-name='sharebybday']" )).to_be_visible ()
555+ page .click ('#sharecollectionscene button[data-name="cancel"]' )
0 commit comments