@@ -29,6 +29,16 @@ async function signIn(
2929 ] ) ;
3030}
3131
32+ async function delayProfileActionRequests ( page : Page , delayMs = 500 ) {
33+ await page . route ( / \/ p r o f i l e (?: \/ | \? | $ ) / , async ( route ) => {
34+ if ( route . request ( ) . method ( ) === "POST" ) {
35+ await page . waitForTimeout ( delayMs ) ;
36+ }
37+
38+ await route . continue ( ) ;
39+ } ) ;
40+ }
41+
3242test ( "public-listing shows the seeded public listing and guest contact gate" , async ( {
3343 page,
3444} ) => {
@@ -47,7 +57,7 @@ test("public-listing shows the seeded public listing and guest contact gate", as
4757test ( "profile loads the seeded host account and listings" , async ( { page } ) => {
4858 await signIn ( page , { email : HOST_EMAIL , redirectTo : "/profile" } ) ;
4959
50- await expect ( page . getByTestId ( "profile-first-name" ) ) . toHaveText ( "Avery" , {
60+ await expect ( page . getByTestId ( "profile-first-name" ) ) . toHaveText ( / \S + / , {
5161 timeout : PROFILE_RENDER_TIMEOUT_MS ,
5262 } ) ;
5363 await expect ( page . getByTestId ( "profile-listings" ) ) . toContainText (
@@ -58,6 +68,106 @@ test("profile loads the seeded host account and listings", async ({ page }) => {
5868 ) ;
5969} ) ;
6070
71+ test ( "sign-in form preserves redirect_to" , async ( { page } ) => {
72+ await signIn ( page , {
73+ email : HOST_EMAIL ,
74+ redirectTo : "/profile" ,
75+ } ) ;
76+
77+ await expect ( page ) . toHaveURL ( / \/ p r o f i l e $ / ) ;
78+ } ) ;
79+
80+ test ( "profile account actions show pending feedback and update the read view" , async ( {
81+ page,
82+ } ) => {
83+ await signIn ( page , { email : HOST_EMAIL , redirectTo : "/profile" } ) ;
84+ await delayProfileActionRequests ( page ) ;
85+
86+ await page . getByTestId ( "profile-account-first-name-edit" ) . click ( ) ;
87+ const firstNameInput = page . getByTestId ( "profile-account-first-name-input" ) ;
88+ const originalFirstName = await firstNameInput . inputValue ( ) ;
89+ const updatedFirstName =
90+ originalFirstName === "Avery Test" ? "Avery Again" : "Avery Test" ;
91+ await firstNameInput . fill ( updatedFirstName ) ;
92+
93+ const firstNameSubmit = page . getByTestId ( "profile-account-first-name-submit" ) ;
94+ const firstNameClick = firstNameSubmit . click ( ) ;
95+ await expect ( firstNameSubmit ) . toBeDisabled ( ) ;
96+ await expect ( firstNameSubmit ) . toHaveAttribute ( "aria-busy" , "true" ) ;
97+ await firstNameClick ;
98+ await expect ( page . getByTestId ( "profile-account-first-name-value" ) ) . toHaveText (
99+ updatedFirstName
100+ ) ;
101+
102+ await page . getByTestId ( "profile-account-newsletter-edit" ) . click ( ) ;
103+ const newsletterInput = page . getByTestId ( "profile-account-newsletter-input" ) ;
104+ const originalNewsletterPreference = await newsletterInput . inputValue ( ) ;
105+ const updatedNewsletterPreference =
106+ originalNewsletterPreference === "true" ? "false" : "true" ;
107+ await newsletterInput . selectOption ( updatedNewsletterPreference ) ;
108+
109+ const newsletterSubmit = page . getByTestId (
110+ "profile-account-newsletter-submit"
111+ ) ;
112+ const newsletterClick = newsletterSubmit . click ( ) ;
113+ await expect ( newsletterSubmit ) . toBeDisabled ( ) ;
114+ await expect ( newsletterSubmit ) . toHaveAttribute ( "aria-busy" , "true" ) ;
115+ await newsletterClick ;
116+ await page . getByTestId ( "profile-account-newsletter-edit" ) . click ( ) ;
117+ await expect (
118+ page . getByTestId ( "profile-account-newsletter-input" )
119+ ) . toHaveValue ( updatedNewsletterPreference ) ;
120+ await page . getByRole ( "button" , { name : / c a n c e l | a b b r e c h e n / i } ) . click ( ) ;
121+
122+ await page . getByTestId ( "profile-account-language-edit" ) . click ( ) ;
123+ const languageInput = page . getByTestId ( "profile-account-language-input" ) ;
124+ const originalLanguage = await languageInput . inputValue ( ) ;
125+ const updatedLanguage = originalLanguage === "de" ? "en" : "de" ;
126+ await languageInput . selectOption ( updatedLanguage ) ;
127+
128+ const languageSubmit = page . getByTestId ( "profile-account-language-submit" ) ;
129+ const languageClick = languageSubmit . click ( ) ;
130+ await expect ( languageSubmit ) . toBeDisabled ( ) ;
131+ await expect ( languageSubmit ) . toHaveAttribute ( "aria-busy" , "true" ) ;
132+ await languageClick ;
133+ await page . getByTestId ( "profile-account-language-edit" ) . click ( ) ;
134+ await expect ( page . getByTestId ( "profile-account-language-input" ) ) . toHaveValue (
135+ updatedLanguage
136+ ) ;
137+ await page . getByRole ( "button" , { name : / c a n c e l | a b b r e c h e n / i } ) . click ( ) ;
138+
139+ await page . getByTestId ( "profile-account-first-name-edit" ) . click ( ) ;
140+ await page
141+ . getByTestId ( "profile-account-first-name-input" )
142+ . fill ( originalFirstName ) ;
143+ await page . getByTestId ( "profile-account-first-name-submit" ) . click ( ) ;
144+ await expect ( page . getByTestId ( "profile-account-first-name-value" ) ) . toHaveText (
145+ originalFirstName
146+ ) ;
147+
148+ await page . getByTestId ( "profile-account-newsletter-edit" ) . click ( ) ;
149+ await page
150+ . getByTestId ( "profile-account-newsletter-input" )
151+ . selectOption ( originalNewsletterPreference ) ;
152+ await page . getByTestId ( "profile-account-newsletter-submit" ) . click ( ) ;
153+ await page . getByTestId ( "profile-account-newsletter-edit" ) . click ( ) ;
154+ await expect (
155+ page . getByTestId ( "profile-account-newsletter-input" )
156+ ) . toHaveValue ( originalNewsletterPreference ) ;
157+ await page . getByRole ( "button" , { name : / c a n c e l | a b b r e c h e n / i } ) . click ( ) ;
158+
159+ await page . getByTestId ( "profile-account-language-edit" ) . click ( ) ;
160+ await page
161+ . getByTestId ( "profile-account-language-input" )
162+ . selectOption ( originalLanguage ) ;
163+ await page . getByTestId ( "profile-account-language-submit" ) . click ( ) ;
164+ await page . getByTestId ( "profile-account-language-edit" ) . click ( ) ;
165+ await expect ( page . getByTestId ( "profile-account-language-input" ) ) . toHaveValue (
166+ originalLanguage
167+ ) ;
168+ await page . getByRole ( "button" , { name : / c a n c e l | a b b r e c h e n / i } ) . click ( ) ;
169+ } ) ;
170+
61171test ( "chat loads the seeded thread and composer for a signed-in donor" , async ( {
62172 page,
63173} ) => {
0 commit comments