1+ import { expect } from "@playwright/test" ;
2+ import { test } from '@umbraco/playwright-testhelpers' ;
3+
4+ const webhookName = 'Test Webhook' ;
5+ let webhookSiteToken = '' ;
6+
7+ test . beforeEach ( async ( { umbracoUi, umbracoApi} ) => {
8+ await umbracoApi . webhook . ensureNameNotExists ( webhookName ) ;
9+ await umbracoUi . goToBackOffice ( ) ;
10+ webhookSiteToken = await umbracoApi . webhook . generateWebhookSiteToken ( ) ;
11+ } ) ;
12+
13+ test . afterEach ( async ( { umbracoApi} ) => {
14+ await umbracoApi . webhook . ensureNameNotExists ( webhookName ) ;
15+ } ) ;
16+
17+ test ( 'can create a webhook' , async ( { umbracoApi, umbracoUi} ) => {
18+ // Arrange
19+ const event = 'Content Deleted' ;
20+ const webhookSiteUrl = umbracoApi . webhook . webhookSiteUrl + webhookSiteToken ;
21+ await umbracoUi . webhook . goToWebhooks ( ) ;
22+
23+ // Act
24+ await umbracoUi . webhook . clickWebhookCreateButton ( ) ;
25+ await umbracoUi . webhook . enterWebhookName ( webhookName ) ;
26+ await umbracoUi . webhook . enterUrl ( webhookSiteUrl ) ;
27+ await umbracoUi . webhook . clickChooseEventButton ( ) ;
28+ await umbracoUi . webhook . clickTextButtonWithName ( event ) ;
29+ await umbracoUi . webhook . clickSubmitButton ( ) ;
30+ await umbracoUi . webhook . clickSaveButton ( ) ;
31+
32+ // Assert
33+ await umbracoUi . webhook . isSuccessStateVisibleForSaveButton ( ) ;
34+ expect ( await umbracoApi . webhook . doesNameExist ( webhookName ) ) . toBeTruthy ( ) ;
35+ expect ( await umbracoApi . webhook . doesWebhookHaveUrl ( webhookName , webhookSiteUrl ) ) . toBeTruthy ( ) ;
36+ expect ( await umbracoApi . webhook . doesWebhookHaveEvent ( webhookName , event ) ) . toBeTruthy ( ) ;
37+ await umbracoApi . webhook . isWebhookEnabled ( webhookName ) ;
38+ } ) ;
39+
40+ test ( 'can update webhook name' , async ( { umbracoApi, umbracoUi} ) => {
41+ // Arrange
42+ const updatedName = 'Updated Webhook' ;
43+ await umbracoApi . webhook . createDefaultWebhook ( webhookName , webhookSiteToken ) ;
44+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
45+
46+ // Act
47+ await umbracoUi . webhook . enterWebhookName ( updatedName ) ;
48+ await umbracoUi . webhook . clickSaveButton ( ) ;
49+
50+ // Assert
51+ await umbracoUi . webhook . isSuccessStateVisibleForSaveButton ( ) ;
52+ expect ( await umbracoApi . webhook . doesNameExist ( updatedName ) ) . toBeTruthy ( ) ;
53+ expect ( await umbracoApi . webhook . doesNameExist ( webhookName ) ) . toBeFalsy ( ) ;
54+ } ) ;
55+
56+ test ( 'can delete a webhook' , async ( { umbracoApi, umbracoUi} ) => {
57+ // Arrange
58+ await umbracoApi . webhook . createDefaultWebhook ( webhookName , webhookSiteToken ) ;
59+ await umbracoUi . webhook . goToWebhooks ( ) ;
60+
61+ // Act
62+ await umbracoUi . webhook . clickDeleteWebhookWithName ( webhookName ) ;
63+ await umbracoUi . webhook . clickConfirmToDeleteButton ( ) ;
64+
65+ // Assert
66+ expect ( await umbracoApi . webhook . doesNameExist ( webhookName ) ) . toBeFalsy ( ) ;
67+ } ) ;
68+
69+ test ( 'can add content type for a webhook' , async ( { umbracoApi, umbracoUi} ) => {
70+ // Arrange
71+ const contentTypeName = 'Test Document Type For Webhook' ;
72+ const documentTypeId = await umbracoApi . documentType . createDefaultDocumentType ( contentTypeName ) ;
73+ await umbracoApi . webhook . createDefaultWebhook ( webhookName , webhookSiteToken ) ;
74+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
75+
76+ // Act
77+ await umbracoUi . webhook . clickChooseContentTypeButton ( ) ;
78+ await umbracoUi . webhook . clickModalMenuItemWithName ( contentTypeName ) ;
79+ await umbracoUi . webhook . clickChooseModalButton ( ) ;
80+ await umbracoUi . webhook . clickSaveButton ( ) ;
81+
82+ // Assert
83+ await umbracoUi . webhook . isSuccessStateVisibleForSaveButton ( ) ;
84+ expect ( await umbracoApi . webhook . doesNameExist ( webhookName ) ) . toBeTruthy ( ) ;
85+ expect ( await umbracoApi . webhook . doesWebhookHaveContentTypeId ( webhookName , documentTypeId ) ) . toBeTruthy ( ) ;
86+
87+ // Clean
88+ await umbracoApi . documentType . ensureNameNotExists ( contentTypeName ) ;
89+ } ) ;
90+
91+ test ( 'can add header for a webhook' , async ( { umbracoApi, umbracoUi} ) => {
92+ // Arrange
93+ const headerName = 'test-header-name' ;
94+ const headerValue = 'test-header-value' ;
95+ await umbracoApi . webhook . createDefaultWebhook ( webhookName , webhookSiteToken ) ;
96+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
97+
98+ // Act
99+ await umbracoUi . webhook . clickAddHeadersButton ( ) ;
100+ await umbracoUi . webhook . enterHeaderName ( headerName ) ;
101+ await umbracoUi . webhook . enterHeaderValue ( headerValue ) ;
102+ await umbracoUi . webhook . clickSaveButton ( ) ;
103+
104+ // Assert
105+ await umbracoUi . webhook . isSuccessStateVisibleForSaveButton ( ) ;
106+ expect ( await umbracoApi . webhook . doesNameExist ( webhookName ) ) . toBeTruthy ( ) ;
107+ expect ( await umbracoApi . webhook . doesWebhookHaveHeader ( webhookName , headerName , headerValue ) ) . toBeTruthy ( ) ;
108+ } ) ;
109+
110+ test ( 'can disable a webhook' , async ( { umbracoApi, umbracoUi} ) => {
111+ // Arrange
112+ await umbracoApi . webhook . createDefaultWebhook ( webhookName , webhookSiteToken ) ;
113+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
114+
115+ // Act
116+ await umbracoUi . webhook . clickEnabledToggleButton ( ) ;
117+ await umbracoUi . webhook . clickSaveButton ( ) ;
118+
119+ // Assert
120+ await umbracoUi . webhook . isSuccessStateVisibleForSaveButton ( ) ;
121+ expect ( await umbracoApi . webhook . doesNameExist ( webhookName ) ) . toBeTruthy ( ) ;
122+ await umbracoApi . webhook . isWebhookEnabled ( webhookName , false ) ;
123+ } ) ;
124+
125+ test ( 'cannot remove all events from a webhook' , async ( { umbracoApi, umbracoUi} ) => {
126+ // Arrange
127+ const event = 'Content Deleted' ;
128+ await umbracoApi . webhook . createDefaultWebhook ( webhookName , webhookSiteToken , event ) ;
129+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
130+
131+ // Act
132+ await umbracoUi . webhook . clickRemoveButtonForName ( event ) ;
133+ await umbracoUi . webhook . clickSaveButton ( ) ;
134+
135+ // Assert
136+ await umbracoUi . content . isErrorNotificationVisible ( ) ;
137+ } ) ;
138+
139+ test ( 'can remove a content type from a webhook' , async ( { umbracoApi, umbracoUi} ) => {
140+ // Arrange
141+ const event = 'Media Saved' ;
142+ const mediaTypeName = 'Audio' ;
143+ const mediaTypeData = await umbracoApi . mediaType . getByName ( mediaTypeName ) ;
144+ await umbracoApi . webhook . createWebhookForSpecificContentType ( webhookName , webhookSiteToken , event , mediaTypeName ) ;
145+ expect ( await umbracoApi . webhook . doesWebhookHaveContentTypeId ( webhookName , mediaTypeData . id ) ) . toBeTruthy ( ) ;
146+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
147+
148+ // Act
149+ await umbracoUi . webhook . clickRemoveButtonForName ( mediaTypeName ) ;
150+ await umbracoUi . webhook . clickConfirmRemoveButton ( ) ;
151+ await umbracoUi . webhook . clickSaveButton ( ) ;
152+
153+ // Assert
154+ await umbracoUi . webhook . isSuccessStateVisibleForSaveButton ( ) ;
155+ expect ( await umbracoApi . webhook . doesWebhookHaveContentTypeId ( webhookName , mediaTypeData . id ) ) . toBeFalsy ( ) ;
156+ } ) ;
157+
158+ test ( 'can remove a header from a webhook' , async ( { umbracoApi, umbracoUi} ) => {
159+ // Arrange
160+ const event = 'Content Published' ;
161+ const headerName = 'test-header-name' ;
162+ const headerValue = 'automation-test' ;
163+ await umbracoApi . webhook . createWebhookWithHeader ( webhookName , webhookSiteToken , event , headerName , headerValue ) ;
164+ expect ( await umbracoApi . webhook . doesWebhookHaveHeader ( webhookName , headerName , headerValue ) ) . toBeTruthy ( ) ;
165+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
166+
167+ // Act
168+ await umbracoUi . webhook . clickHeaderRemoveButton ( ) ;
169+ await umbracoUi . webhook . clickSaveButton ( ) ;
170+
171+ // Assert
172+ await umbracoUi . webhook . isSuccessStateVisibleForSaveButton ( ) ;
173+ expect ( await umbracoApi . webhook . doesWebhookHaveHeader ( webhookName , headerName , headerValue ) ) . toBeFalsy ( ) ;
174+ } ) ;
175+
176+ test ( 'cannot add both content event and media event for a webhook' , async ( { umbracoApi, umbracoUi} ) => {
177+ // Arrange
178+ const event = 'Content Published' ;
179+ await umbracoApi . webhook . createDefaultWebhook ( webhookName , webhookSiteToken , event ) ;
180+ await umbracoUi . webhook . goToWebhookWithName ( webhookName ) ;
181+
182+ // Act
183+ await umbracoUi . webhook . clickChooseEventButton ( ) ;
184+
185+ // Assert
186+ await umbracoUi . webhook . isModalMenuItemWithNameDisabled ( 'Media Saved' ) ;
187+ await umbracoUi . webhook . isModalMenuItemWithNameDisabled ( 'Media Deleted' ) ;
188+ } ) ;
0 commit comments