1+ import { ConstantHelper , NotificationConstantHelper , test } from '@umbraco/playwright-testhelpers' ;
2+ import { expect } from "@playwright/test" ;
3+
4+ const contentName = 'TestContent' ;
5+ const documentTypeName = 'TestDocumentTypeForContent' ;
6+ const customDataTypeName = 'Test RTE Tiptap' ;
7+ let customDataTypeId = null ;
8+
9+ test . beforeEach ( async ( { umbracoApi} ) => {
10+ customDataTypeId = await umbracoApi . dataType . createDefaultTiptapDataType ( customDataTypeName ) ;
11+ await umbracoApi . documentType . ensureNameNotExists ( documentTypeName ) ;
12+ await umbracoApi . document . ensureNameNotExists ( contentName ) ;
13+ } ) ;
14+
15+ test . afterEach ( async ( { umbracoApi} ) => {
16+ await umbracoApi . document . ensureNameNotExists ( contentName ) ;
17+ await umbracoApi . documentType . ensureNameNotExists ( documentTypeName ) ;
18+ await umbracoApi . dataType . ensureNameNotExists ( customDataTypeName ) ;
19+ } ) ;
20+
21+ test ( 'can create content with empty RTE Tiptap property editor' , async ( { umbracoApi, umbracoUi} ) => {
22+ // Arrange
23+ const expectedState = 'Draft' ;
24+ await umbracoApi . documentType . createDocumentTypeWithPropertyEditor ( documentTypeName , customDataTypeName , customDataTypeId ) ;
25+ await umbracoUi . goToBackOffice ( ) ;
26+ await umbracoUi . content . goToSection ( ConstantHelper . sections . content ) ;
27+
28+ // Act
29+ await umbracoUi . content . clickActionsMenuAtRoot ( ) ;
30+ await umbracoUi . content . clickCreateButton ( ) ;
31+ await umbracoUi . content . chooseDocumentType ( documentTypeName ) ;
32+ await umbracoUi . content . enterContentName ( contentName ) ;
33+ await umbracoUi . content . clickSaveButton ( ) ;
34+
35+ // Assert
36+ await umbracoUi . content . doesSuccessNotificationHaveText ( NotificationConstantHelper . success . created ) ;
37+ expect ( await umbracoApi . document . doesNameExist ( contentName ) ) . toBeTruthy ( ) ;
38+ const contentData = await umbracoApi . document . getByName ( contentName ) ;
39+ expect ( contentData . variants [ 0 ] . state ) . toBe ( expectedState ) ;
40+ expect ( contentData . values ) . toEqual ( [ ] ) ;
41+ } ) ;
42+
43+ test ( 'can create content with non-empty RTE Tiptap property editor' , async ( { umbracoApi, umbracoUi} ) => {
44+ // Arrange
45+ const expectedState = 'Draft' ;
46+ const inputText = 'Test Tiptap here' ;
47+ await umbracoApi . documentType . createDocumentTypeWithPropertyEditor ( documentTypeName , customDataTypeName , customDataTypeId ) ;
48+ await umbracoUi . goToBackOffice ( ) ;
49+ await umbracoUi . content . goToSection ( ConstantHelper . sections . content ) ;
50+
51+ // Act
52+ await umbracoUi . content . clickActionsMenuAtRoot ( ) ;
53+ await umbracoUi . content . clickCreateButton ( ) ;
54+ await umbracoUi . content . chooseDocumentType ( documentTypeName ) ;
55+ await umbracoUi . content . enterContentName ( contentName ) ;
56+ await umbracoUi . content . enterRTETipTapEditor ( inputText ) ;
57+ await umbracoUi . content . clickSaveButton ( ) ;
58+
59+ // Assert
60+ await umbracoUi . content . doesSuccessNotificationHaveText ( NotificationConstantHelper . success . created ) ;
61+ expect ( await umbracoApi . document . doesNameExist ( contentName ) ) . toBeTruthy ( ) ;
62+ const contentData = await umbracoApi . document . getByName ( contentName ) ;
63+ expect ( contentData . variants [ 0 ] . state ) . toBe ( expectedState ) ;
64+ expect ( contentData . values [ 0 ] . value . markup ) . toEqual ( '<p>' + inputText + '</p>' ) ;
65+ } ) ;
66+
67+ test ( 'can publish content with RTE Tiptap property editor' , async ( { umbracoApi, umbracoUi} ) => {
68+ // Arrange
69+ const expectedState = 'Published' ;
70+ const inputText = 'Test Tiptap here' ;
71+ const documentTypeId = await umbracoApi . documentType . createDocumentTypeWithPropertyEditor ( documentTypeName , customDataTypeName , customDataTypeId ) ;
72+ await umbracoApi . document . createDefaultDocument ( contentName , documentTypeId ) ;
73+ await umbracoUi . goToBackOffice ( ) ;
74+ await umbracoUi . content . goToSection ( ConstantHelper . sections . content ) ;
75+
76+ // Act
77+ await umbracoUi . content . goToContentWithName ( contentName ) ;
78+ await umbracoUi . content . enterRTETipTapEditor ( inputText ) ;
79+ await umbracoUi . content . clickSaveAndPublishButton ( ) ;
80+
81+ // Assert
82+ await umbracoUi . content . doesSuccessNotificationsHaveCount ( 2 ) ;
83+ expect ( await umbracoApi . document . doesNameExist ( contentName ) ) . toBeTruthy ( ) ;
84+ const contentData = await umbracoApi . document . getByName ( contentName ) ;
85+ expect ( contentData . variants [ 0 ] . state ) . toBe ( expectedState ) ;
86+ expect ( contentData . values [ 0 ] . value . markup ) . toEqual ( '<p>' + inputText + '</p>' ) ;
87+ } ) ;
88+
89+ test ( 'can add a media in RTE Tiptap property editor' , async ( { umbracoApi, umbracoUi} ) => {
90+ // Arrange
91+ const iconTitle = 'Media picker' ;
92+ const imageName = 'Test Image For Content' ;
93+ await umbracoApi . media . ensureNameNotExists ( imageName ) ;
94+ await umbracoApi . media . createDefaultMediaWithImage ( imageName ) ;
95+ const documentTypeId = await umbracoApi . documentType . createDocumentTypeWithPropertyEditor ( documentTypeName , customDataTypeName , customDataTypeId ) ;
96+ await umbracoApi . document . createDefaultDocument ( contentName , documentTypeId ) ;
97+ await umbracoUi . goToBackOffice ( ) ;
98+ await umbracoUi . content . goToSection ( ConstantHelper . sections . content ) ;
99+
100+ // Act
101+ await umbracoUi . content . goToContentWithName ( contentName ) ;
102+ await umbracoUi . content . clickTipTapToolbarIconWithTitle ( iconTitle ) ;
103+ await umbracoUi . content . selectMediaWithName ( imageName ) ;
104+ await umbracoUi . content . clickSubmitButton ( ) ;
105+ await umbracoUi . content . clickMediaCaptionAltTextModalSubmitButton ( ) ;
106+ await umbracoUi . content . clickSaveButton ( ) ;
107+
108+ // Assert
109+ await umbracoUi . content . doesSuccessNotificationHaveText ( NotificationConstantHelper . success . saved ) ;
110+ expect ( await umbracoApi . document . doesNameExist ( contentName ) ) . toBeTruthy ( ) ;
111+ const contentData = await umbracoApi . document . getByName ( contentName ) ;
112+ expect ( contentData . values [ 0 ] . value . markup ) . toContain ( '<img' ) ;
113+ expect ( contentData . values [ 0 ] . value . markup ) . toContain ( imageName ) ;
114+
115+ // Clean
116+ await umbracoApi . media . ensureNameNotExists ( imageName ) ;
117+ } ) ;
118+
119+ test ( 'can add a video in RTE Tiptap property editor' , async ( { umbracoApi, umbracoUi} ) => {
120+ // Arrange
121+ const iconTitle = 'Embed' ;
122+ const videoURL = 'https://www.youtube.com/watch?v=Yu29dE-0OoI' ;
123+ const documentTypeId = await umbracoApi . documentType . createDocumentTypeWithPropertyEditor ( documentTypeName , customDataTypeName , customDataTypeId ) ;
124+ await umbracoApi . document . createDefaultDocument ( contentName , documentTypeId ) ;
125+ await umbracoUi . goToBackOffice ( ) ;
126+ await umbracoUi . content . goToSection ( ConstantHelper . sections . content ) ;
127+
128+ // Act
129+ await umbracoUi . content . goToContentWithName ( contentName ) ;
130+ await umbracoUi . content . clickTipTapToolbarIconWithTitle ( iconTitle ) ;
131+ await umbracoUi . content . enterEmbeddedURL ( videoURL ) ;
132+ await umbracoUi . content . clickEmbeddedRetrieveButton ( ) ;
133+ await umbracoUi . content . waitForEmbeddedPreviewVisible ( ) ;
134+ await umbracoUi . content . clickEmbeddedMediaModalConfirmButton ( ) ;
135+ await umbracoUi . content . clickSaveButton ( ) ;
136+
137+ // Assert
138+ await umbracoUi . content . doesSuccessNotificationHaveText ( NotificationConstantHelper . success . saved ) ;
139+ expect ( await umbracoApi . document . doesNameExist ( contentName ) ) . toBeTruthy ( ) ;
140+ const contentData = await umbracoApi . document . getByName ( contentName ) ;
141+ expect ( contentData . values [ 0 ] . value . markup ) . toContain ( 'data-embed-url' ) ;
142+ expect ( contentData . values [ 0 ] . value . markup ) . toContain ( videoURL ) ;
143+ } ) ;
0 commit comments