@@ -7,36 +7,39 @@ import {
77 submitAndWaitForResponse ,
88} from "./lib/testUtils" ;
99
10- test . describe . configure ( { mode : "parallel " } ) ;
10+ test . describe . configure ( { mode : "serial " } ) ;
1111
12- // TODO: This test is very flaky. Feels like tossing a coin and hope that it won't fail. Needs to be revisited.
13- test . describe ( "hash my url" , ( ) => {
12+ test . describe ( "private links creation and usage" , ( ) => {
1413 test . beforeEach ( async ( { users } ) => {
1514 const user = await users . create ( ) ;
1615 await user . apiLogin ( ) ;
1716 } ) ;
1817 test . afterEach ( async ( { users } ) => {
1918 await users . deleteAll ( ) ;
2019 } ) ;
21- test ( "generate url hash " , async ( { page } ) => {
20+ test ( "generate private link and make a booking with it " , async ( { page } ) => {
2221 await page . goto ( "/event-types" ) ;
2322 // We wait until loading is finished
24- await page . waitForSelector ( '[data-testid="event-types"]' ) ;
25- await page . locator ( "ul[data-testid= event-types] > li a" ) . first ( ) . click ( ) ;
26- await expect ( page . getByTestId ( "vertical-tab-event_setup_tab_title" ) ) . toHaveAttribute (
27- "aria-current" ,
28- "page"
29- ) ; // fix the race condition
30- await expect ( page . getByTestId ( "vertical-tab-event_setup_tab_title" ) ) . toContainText ( "Event Setup" ) ; //fix the race condition
23+ await Promise . all ( [
24+ page . waitForURL ( "**/ event-types" ) ,
25+ page . getByTestId ( "event-types" ) . locator ( "li a" ) . first ( ) . click ( ) ,
26+ ] ) ;
27+
28+ await expect ( page . locator ( "[data-testid=event-title]" ) ) . toBeVisible ( ) ;
29+
3130 // We wait for the page to load
32- await page . locator ( ".primary-navigation >> text=Advanced" ) . click ( ) ;
33- // ignore if it is already checked, and click if unchecked
34- const hashedLinkCheck = await page . locator ( '[data-testid="multiplePrivateLinksCheck"]' ) ;
31+ await page . locator ( "[data-testid=vertical-tab-event_advanced_tab_title]" ) . click ( ) ;
3532
36- await hashedLinkCheck . click ( ) ;
33+ const hashedLinkCheck = page . locator ( '[data-testid="multiplePrivateLinksCheck"]' ) ;
34+ await expect ( hashedLinkCheck ) . toBeVisible ( ) ;
3735
38- // we wait for the hashedLink setting to load
39- const $url = await page . locator ( '//*[@data-testid="generated-hash-url-0"]' ) . inputValue ( ) ;
36+ // ignore if it is already checked, and click if unchecked
37+ if ( ! ( await hashedLinkCheck . isChecked ( ) ) ) {
38+ await hashedLinkCheck . click ( ) ;
39+ }
40+
41+ // Wait for the private link URL input to be visible and get its value
42+ const $url = await page . locator ( '[data-testid="private-link-url"]' ) . inputValue ( ) ;
4043
4144 // click update
4245 await submitAndWaitForResponse ( page , "/api/trpc/eventTypes/update?batch=1" , {
@@ -47,33 +50,148 @@ test.describe("hash my url", () => {
4750 await selectFirstAvailableTimeSlotNextMonth ( page ) ;
4851 await bookTimeSlot ( page ) ;
4952 // Make sure we're navigated to the success page
50- await expect ( page . locator ( "[data-testid=success-page]" ) ) . toBeVisible ( ) ;
53+ const successPage = page . getByTestId ( "success-page" ) ;
54+ await expect ( successPage ) . toBeVisible ( ) ;
5155
52- // hash regenerates after successful booking
56+ // hash regenerates after successful booking (only for usage-based links)
5357 await page . goto ( "/event-types" ) ;
54- // We wait until loading is finished
5558 await page . waitForSelector ( '[data-testid="event-types"]' ) ;
59+ await page . reload ( ) ; // ensure fresh state
60+
5661 await page . locator ( "ul[data-testid=event-types] > li a" ) . first ( ) . click ( ) ;
5762 // We wait for the page to load
58- await page . locator ( ".primary-navigation >> text=Advanced " ) . click ( ) ;
63+ await page . locator ( "[data-testid=vertical-tab-event_advanced_tab_title] " ) . click ( ) ;
5964
60- const hashedLinkCheck2 = await page . locator ( '[data-testid="multiplePrivateLinksCheck"]' ) ;
61- await hashedLinkCheck2 . click ( ) ;
62-
63- // we wait for the hashedLink setting to load
64- const $newUrl = await page . locator ( '//*[@data-testid="generated-hash-url-0"]' ) . inputValue ( ) ;
65- expect ( $url !== $newUrl ) . toBeTruthy ( ) ;
65+ // After booking with a usage-based private link, the link should be expired
66+ await expect ( page . locator ( '[data-testid="private-link-description"]' ) ) . toContainText (
67+ "Usage limit reached"
68+ ) ;
6669
6770 // Ensure that private URL is enabled after modifying the event type.
6871 // Additionally, if the slug is changed, ensure that the private URL is updated accordingly.
6972 await page . getByTestId ( "vertical-tab-event_setup_tab_title" ) . click ( ) ;
7073 await page . locator ( "[data-testid=event-title]" ) . first ( ) . fill ( "somethingrandom" ) ;
7174 await page . locator ( "[data-testid=event-slug]" ) . first ( ) . fill ( "somethingrandom" ) ;
75+ await expect ( page . locator ( '[data-testid="event-slug"]' ) . first ( ) ) . toHaveValue ( "somethingrandom" ) ;
76+
7277 await submitAndWaitForResponse ( page , "/api/trpc/eventTypes/update?batch=1" , {
7378 action : ( ) => page . locator ( "[data-testid=update-eventtype]" ) . click ( ) ,
7479 } ) ;
75- await page . locator ( ".primary-navigation >> text=Advanced" ) . click ( ) ;
76- const $url2 = await page . locator ( '//*[@data-testid="generated-hash-url-0"]' ) . inputValue ( ) ;
80+ await page . locator ( "[data-testid=vertical-tab-event_advanced_tab_title]" ) . click ( ) ;
81+
82+ // Wait for the private link URL input to be visible and get its value
83+ const $url2 = await page . locator ( '[data-testid="private-link-url"]' ) . inputValue ( ) ;
7784 expect ( $url2 . includes ( "somethingrandom" ) ) . toBeTruthy ( ) ;
7885 } ) ;
86+
87+ test ( "generate private link with future expiration date and make a booking with it" , async ( { page } ) => {
88+ await page . goto ( "/event-types" ) ;
89+ // We wait until loading is finished
90+ await Promise . all ( [
91+ page . waitForURL ( "**/event-types" ) ,
92+ page . getByTestId ( "event-types" ) . locator ( "li a" ) . first ( ) . click ( ) ,
93+ ] ) ;
94+
95+ await expect ( page . locator ( "[data-testid=event-title]" ) ) . toBeVisible ( ) ;
96+
97+ // We wait for the page to load
98+ await page . locator ( "[data-testid=vertical-tab-event_advanced_tab_title]" ) . click ( ) ;
99+
100+ const privateLinkCheck = page . locator ( '[data-testid="multiplePrivateLinksCheck"]' ) ;
101+ await expect ( privateLinkCheck ) . toBeVisible ( ) ;
102+
103+ // ignore if it is already checked, and click if unchecked
104+ if ( ! ( await privateLinkCheck . isChecked ( ) ) ) {
105+ await privateLinkCheck . click ( ) ;
106+ }
107+
108+ // Wait for the private link URL input to be visible and get its value
109+ const $url = await page . locator ( '[data-testid="private-link-url"]' ) . inputValue ( ) ;
110+ await page . locator ( '[data-testid="private-link-settings"]' ) . click ( ) ;
111+ await expect ( page . locator ( '[data-testid="private-link-radio-group"]' ) ) . toBeVisible ( ) ;
112+ await page . locator ( '[data-testid="private-link-time"]' ) . click ( ) ;
113+ await page . locator ( '[data-testid="private-link-expiration-settings-save"]' ) . click ( ) ;
114+ await page . waitForLoadState ( "networkidle" ) ;
115+ // click update
116+ await submitAndWaitForResponse ( page , "/api/trpc/eventTypes/update?batch=1" , {
117+ action : ( ) => page . locator ( "[data-testid=update-eventtype]" ) . click ( ) ,
118+ } ) ;
119+ // book using generated url hash
120+ await page . goto ( $url ) ;
121+ await selectFirstAvailableTimeSlotNextMonth ( page ) ;
122+ await bookTimeSlot ( page ) ;
123+ // Make sure we're navigated to the success page
124+ await expect ( page . getByTestId ( "success-page" ) ) . toBeVisible ( ) ;
125+
126+ // hash regenerates after successful booking (only for usage-based links)
127+ await page . goto ( "/event-types" ) ;
128+ await page . waitForSelector ( '[data-testid="event-types"]' ) ;
129+ await page . reload ( ) ; // ensure fresh state
130+
131+ await page . locator ( "ul[data-testid=event-types] > li a" ) . first ( ) . click ( ) ;
132+ // We wait for the page to load
133+ await page . locator ( "[data-testid=vertical-tab-event_advanced_tab_title]" ) . click ( ) ;
134+
135+ // After booking with a expiration date based private link, the link should still be valid
136+ await expect ( page . locator ( '[data-testid="private-link-expired"]' ) ) . toBeHidden ( ) ;
137+ } ) ;
138+ test ( "generate private link with 2 usages and make 2 bookings with it" , async ( { page } ) => {
139+ await page . goto ( "/event-types" ) ;
140+ // We wait until loading is finished
141+ await Promise . all ( [
142+ page . waitForURL ( "**/event-types" ) ,
143+ page . getByTestId ( "event-types" ) . locator ( "li a" ) . first ( ) . click ( ) ,
144+ ] ) ;
145+
146+ await expect ( page . locator ( "[data-testid=event-title]" ) ) . toBeVisible ( ) ;
147+
148+ // We wait for the page to load
149+ await page . locator ( "[data-testid=vertical-tab-event_advanced_tab_title]" ) . click ( ) ;
150+
151+ const privateLinkCheck = page . locator ( '[data-testid="multiplePrivateLinksCheck"]' ) ;
152+ await expect ( privateLinkCheck ) . toBeVisible ( ) ;
153+
154+ // ignore if it is already checked, and click if unchecked
155+ if ( ! ( await privateLinkCheck . isChecked ( ) ) ) {
156+ await privateLinkCheck . click ( ) ;
157+ }
158+
159+ // Wait for the private link URL input to be visible and get its value
160+ const $url = await page . locator ( '[data-testid="private-link-url"]' ) . inputValue ( ) ;
161+ await page . locator ( '[data-testid="private-link-settings"]' ) . click ( ) ;
162+ await expect ( page . locator ( '[data-testid="private-link-radio-group"]' ) ) . toBeVisible ( ) ;
163+ await page . locator ( '[data-testid="private-link-usage-count"]' ) . fill ( "2" ) ;
164+ await page . locator ( '[data-testid="private-link-expiration-settings-save"]' ) . click ( ) ;
165+ await page . waitForLoadState ( "networkidle" ) ;
166+ // click update
167+ await submitAndWaitForResponse ( page , "/api/trpc/eventTypes/update?batch=1" , {
168+ action : ( ) => page . locator ( "[data-testid=update-eventtype]" ) . click ( ) ,
169+ } ) ;
170+ // book using generated url hash
171+ await page . goto ( $url ) ;
172+ await selectFirstAvailableTimeSlotNextMonth ( page ) ;
173+ await bookTimeSlot ( page ) ;
174+ // Make sure we're navigated to the success page
175+ await expect ( page . getByTestId ( "success-page" ) ) . toBeVisible ( ) ;
176+
177+ // book again using generated url hash
178+ await page . goto ( $url ) ;
179+ await selectFirstAvailableTimeSlotNextMonth ( page ) ;
180+ await bookTimeSlot ( page ) ;
181+ // Make sure we're navigated to the success page
182+ await expect ( page . getByTestId ( "success-page" ) ) . toBeVisible ( ) ;
183+
184+ await page . goto ( "/event-types" ) ;
185+ await page . waitForSelector ( '[data-testid="event-types"]' ) ;
186+ await page . reload ( ) ; // ensure fresh state
187+
188+ await page . locator ( "ul[data-testid=event-types] > li a" ) . first ( ) . click ( ) ;
189+ // We wait for the page to load
190+ await page . locator ( "[data-testid=vertical-tab-event_advanced_tab_title]" ) . click ( ) ;
191+
192+ // After booking twice with a 2 usages based private link, the link should be expired
193+ await expect ( page . locator ( '[data-testid="private-link-description"]' ) ) . toContainText (
194+ "Usage limit reached"
195+ ) ;
196+ } ) ;
79197} ) ;
0 commit comments