@@ -27,6 +27,12 @@ const editSpacesDescription = '.oc-files-actions-edit-readme-content-trigger:vis
2727const spacesDescriptionInputArea = '.text-editor-provider .ProseMirror'
2828const spacesDescriptionSaveTextFileInEditorButton = '#app-save-action:visible'
2929const spaceHeaderSelector = '.space-header'
30+ const spaceHeaderNameSelector = '.space-header h2'
31+ const encryptSpaceSwitch = '[data-testid="create-space-encrypt"] [data-testid="oc-switch-btn"]'
32+ const vaultSetupPassphraseInput = '#vault-setup-passphrase'
33+ const vaultPassphraseInput = '#vault-passphrase'
34+ const vaultUnlockButton = '#vault-unlock-submit'
35+ const vaultNameSelector = '[data-testid="vault-name"]'
3036const activitySidebarPanel = 'sidebar-panel-activities'
3137const activitySidebarPanelBodyContent = '#sidebar-panel-activities .sidebar-panel__body-content'
3238
@@ -50,32 +56,84 @@ export const openActivitiesPanel = async (page: Page): Promise<void> => {
5056export interface createSpaceArgs {
5157 name : string
5258 page : Page
59+ password ?: string
5360}
5461
5562export const createSpace = async ( args : createSpaceArgs ) : Promise < string > => {
56- const { page, name } = args
63+ const { page, name, password } = args
5764
5865 await page . locator ( newSpaceMenuButton ) . click ( )
5966 await page . locator ( spaceNameInputField ) . fill ( name )
6067
68+ // An encrypted space skips the default template, so the server never creates
69+ // a `.space` folder for it.
70+ const template = password ? 'none' : 'default'
6171 const postResponsePromise = page . waitForResponse (
6272 ( postResp ) =>
6373 postResp . status ( ) === 201 &&
6474 postResp . request ( ) . method ( ) === 'POST' &&
65- postResp . url ( ) . endsWith ( ' drives?template=default' )
75+ postResp . url ( ) . endsWith ( ` drives?template=${ template } ` )
6676 )
6777
78+ if ( ! password ) {
79+ const [ responses ] = await Promise . all ( [
80+ postResponsePromise ,
81+ page . locator ( actionConfirmButton ) . click ( )
82+ ] )
83+ const { id } = await responses . json ( )
84+ return id
85+ }
86+
87+ await page . locator ( encryptSpaceSwitch ) . click ( )
88+ await page . locator ( actionConfirmButton ) . click ( )
89+ await page . locator ( vaultSetupPassphraseInput ) . fill ( password )
90+
91+ // Committing the password writes the integrity token onto the new space root.
92+ const proppatchPromise = page . waitForResponse ( ( resp ) => resp . request ( ) . method ( ) === 'PROPPATCH' )
6893 const [ responses ] = await Promise . all ( [
6994 postResponsePromise ,
7095 page . locator ( actionConfirmButton ) . click ( )
7196 ] )
97+ await proppatchPromise
7298
7399 const { id } = await responses . json ( )
74100 return id
75101}
76102
77103/**/
78104
105+ export const unlockVaultSpace = async ( args : { page : Page ; passphrase : string } ) : Promise < void > => {
106+ const { page, passphrase } = args
107+ const unlockButton = page . locator ( vaultUnlockButton )
108+ await expect ( unlockButton ) . toBeDisabled ( )
109+ await page . locator ( vaultPassphraseInput ) . fill ( passphrase )
110+ await unlockButton . click ( )
111+ }
112+
113+ export const openVaultSpace = async ( args : {
114+ page : Page
115+ id : string
116+ passphrase : string
117+ } ) : Promise < void > => {
118+ const { page, id, passphrase } = args
119+ await page . locator ( util . format ( spaceIdSelector , id ) ) . click ( )
120+ await unlockVaultSpace ( { page, passphrase } )
121+ await page . locator ( spaceHeaderSelector ) . waitFor ( )
122+ }
123+
124+ export const expectSpaceOpen = async ( args : { page : Page ; name : string } ) : Promise < void > => {
125+ const { page, name } = args
126+ await expect ( page . locator ( spaceHeaderNameSelector ) ) . toHaveText ( name )
127+ }
128+
129+ export const expectVaultSpaceLocked = async ( args : { page : Page ; name : string } ) : Promise < void > => {
130+ const { page, name } = args
131+ await expect ( page . locator ( vaultPassphraseInput ) ) . toBeVisible ( )
132+ await expect ( page . locator ( vaultNameSelector ) ) . toHaveText ( name )
133+ }
134+
135+ /**/
136+
79137export interface openSpaceArgs {
80138 id : string
81139 page : Page
0 commit comments