mirror of
https://github.com/hcengineering/platform.git
synced 2025-03-15 02:23:12 +00:00
UBERF-9537: Fix Invalid navigate to guest not authorised (#8121)
Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
This commit is contained in:
parent
c5c0ab9808
commit
a6b8d6cd09
@ -743,7 +743,14 @@ export function isCollabAttr (hierarchy: Hierarchy, key: KeyedAttribute): boolea
|
|||||||
*/
|
*/
|
||||||
export function decodeTokenPayload (token: string): any {
|
export function decodeTokenPayload (token: string): any {
|
||||||
try {
|
try {
|
||||||
return JSON.parse(atob(token.split('.')[1]))
|
if (token === '') {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
const tsplit = token.split('.')
|
||||||
|
if (tsplit.length < 2) {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
return JSON.parse(atob(tsplit[1]))
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
return {}
|
return {}
|
||||||
|
@ -234,6 +234,10 @@ export const setTreeCollapsed = (_id: any, collapsed: boolean, prefix?: string):
|
|||||||
collapsed ? localStorage.setItem(key, COLLAPSED) : localStorage.removeItem(key)
|
collapsed ? localStorage.setItem(key, COLLAPSED) : localStorage.removeItem(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isSameSegments (a: PlatformLocation, b: PlatformLocation, len = 2): boolean {
|
||||||
|
return a.path.slice(0, len).every((segment, index) => segment === b.path[index])
|
||||||
|
}
|
||||||
|
|
||||||
export function restoreLocation (loc: PlatformLocation, app: Plugin): void {
|
export function restoreLocation (loc: PlatformLocation, app: Plugin): void {
|
||||||
const last = localStorage.getItem(`${locationStorageKeyId}_${app}`)
|
const last = localStorage.getItem(`${locationStorageKeyId}_${app}`)
|
||||||
|
|
||||||
|
@ -26,25 +26,22 @@
|
|||||||
Popup,
|
Popup,
|
||||||
PopupAlignment,
|
PopupAlignment,
|
||||||
ResolvedLocation,
|
ResolvedLocation,
|
||||||
Separator,
|
|
||||||
TooltipInstance,
|
TooltipInstance,
|
||||||
areLocationsEqual,
|
areLocationsEqual,
|
||||||
closePanel,
|
closePanel,
|
||||||
getCurrentLocation,
|
|
||||||
getLocation,
|
|
||||||
navigate,
|
|
||||||
showPanel,
|
|
||||||
defineSeparators,
|
defineSeparators,
|
||||||
|
deviceOptionsStore as deviceInfo,
|
||||||
|
getCurrentLocation,
|
||||||
setResolvedLocation,
|
setResolvedLocation,
|
||||||
deviceOptionsStore as deviceInfo
|
showPanel
|
||||||
} from '@hcengineering/ui'
|
} from '@hcengineering/ui'
|
||||||
import view from '@hcengineering/view'
|
import view from '@hcengineering/view'
|
||||||
import { ListSelectionProvider, parseLinkId, restrictionStore, updateFocus } from '@hcengineering/view-resources'
|
import { ListSelectionProvider, parseLinkId, restrictionStore, updateFocus } from '@hcengineering/view-resources'
|
||||||
import workbench, { Application, NavigatorModel, SpecialNavModel, ViewConfiguration } from '@hcengineering/workbench'
|
import workbench, { Application, NavigatorModel, SpecialNavModel, ViewConfiguration } from '@hcengineering/workbench'
|
||||||
import { SpaceView, buildNavModel } from '@hcengineering/workbench-resources'
|
import { SpaceView, buildNavModel } from '@hcengineering/workbench-resources'
|
||||||
|
import { workbenchGuestSeparators } from '..'
|
||||||
import guest from '../plugin'
|
import guest from '../plugin'
|
||||||
import { checkAccess } from '../utils'
|
import { checkAccess } from '../utils'
|
||||||
import { workbenchGuestSeparators } from '..'
|
|
||||||
|
|
||||||
const excludedApps = getMetadata(workbench.metadata.ExcludedApplications) ?? []
|
const excludedApps = getMetadata(workbench.metadata.ExcludedApplications) ?? []
|
||||||
$deviceInfo.navigator.visible = false
|
$deviceInfo.navigator.visible = false
|
||||||
|
@ -16,18 +16,24 @@
|
|||||||
import { getMetadata } from '@hcengineering/platform'
|
import { getMetadata } from '@hcengineering/platform'
|
||||||
import { Label, Loading, Notifications, location } from '@hcengineering/ui'
|
import { Label, Loading, Notifications, location } from '@hcengineering/ui'
|
||||||
import { upgradeDownloadProgress } from '@hcengineering/presentation'
|
import { upgradeDownloadProgress } from '@hcengineering/presentation'
|
||||||
import { connect, versionError } from '../connect'
|
import { connect, versionError, invalidError } from '../connect'
|
||||||
|
|
||||||
import { guestId } from '@hcengineering/guest'
|
import { guestId } from '@hcengineering/guest'
|
||||||
import workbench from '@hcengineering/workbench'
|
import workbench from '@hcengineering/workbench'
|
||||||
import Guest from './Guest.svelte'
|
import Guest from './Guest.svelte'
|
||||||
|
import plugin from '../plugin'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if $location.path[0] === guestId}
|
{#if $location.path[0] === guestId}
|
||||||
{#await connect(getMetadata(workbench.metadata.PlatformTitle) ?? 'Platform')}
|
{#await connect(getMetadata(workbench.metadata.PlatformTitle) ?? 'Platform')}
|
||||||
<Loading />
|
<Loading />
|
||||||
{:then client}
|
{:then client}
|
||||||
{#if $versionError}
|
{#if $invalidError}
|
||||||
|
{invalidError}
|
||||||
|
<div class="version-wrapper">
|
||||||
|
<h1><Label label={plugin.string.LinkWasRevoked} /></h1>
|
||||||
|
</div>
|
||||||
|
{:else if $versionError}
|
||||||
<div class="version-wrapper">
|
<div class="version-wrapper">
|
||||||
<div class="antiPopup version-popup">
|
<div class="antiPopup version-popup">
|
||||||
<h1><Label label={workbench.string.ServerUnderMaintenance} /></h1>
|
<h1><Label label={workbench.string.ServerUnderMaintenance} /></h1>
|
||||||
@ -52,14 +58,19 @@
|
|||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.version-wrapper {
|
.version-wrapper {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
.please-update {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
.version-popup {
|
.version-popup {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -26,6 +26,8 @@ import { logOut } from '@hcengineering/workbench'
|
|||||||
import { writable, get } from 'svelte/store'
|
import { writable, get } from 'svelte/store'
|
||||||
|
|
||||||
export const versionError = writable<string | undefined>(undefined)
|
export const versionError = writable<string | undefined>(undefined)
|
||||||
|
|
||||||
|
export const invalidError = writable<boolean>(false)
|
||||||
const versionStorageKey = 'last_server_version'
|
const versionStorageKey = 'last_server_version'
|
||||||
|
|
||||||
let _token: string | undefined
|
let _token: string | undefined
|
||||||
@ -37,9 +39,7 @@ export async function connect (title: string): Promise<Client | undefined> {
|
|||||||
const token = loc.query?.token
|
const token = loc.query?.token
|
||||||
const wsUrl = loc.path[1]
|
const wsUrl = loc.path[1]
|
||||||
if (wsUrl === undefined || token == null) {
|
if (wsUrl === undefined || token == null) {
|
||||||
navigate({
|
invalidError.set(true)
|
||||||
path: [loginId]
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ export async function connect (title: string): Promise<Client | undefined> {
|
|||||||
)
|
)
|
||||||
// something went wrong with selecting workspace with the selected token
|
// something went wrong with selecting workspace with the selected token
|
||||||
await logOut()
|
await logOut()
|
||||||
navigate({ path: [loginId] })
|
invalidError.set(true)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,10 +118,7 @@ export async function connect (title: string): Promise<Client | undefined> {
|
|||||||
},
|
},
|
||||||
onUnauthorized: () => {
|
onUnauthorized: () => {
|
||||||
void logOut().then(() => {
|
void logOut().then(() => {
|
||||||
navigate({
|
invalidError.set(true)
|
||||||
path: [loginId],
|
|
||||||
query: {}
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// We need to refresh all active live queries and clear old queries.
|
// We need to refresh all active live queries and clear old queries.
|
||||||
@ -224,6 +221,7 @@ export async function connect (title: string): Promise<Client | undefined> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
invalidError.set(false)
|
||||||
versionError.set(undefined)
|
versionError.set(undefined)
|
||||||
// Update window title
|
// Update window title
|
||||||
document.title = [wsUrl, title].filter((it) => it).join(' - ')
|
document.title = [wsUrl, title].filter((it) => it).join(' - ')
|
||||||
|
@ -132,8 +132,6 @@
|
|||||||
throw err
|
throw err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$: isAdmin = isAdminUser()
|
|
||||||
|
|
||||||
let search: string = ''
|
let search: string = ''
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -151,7 +149,7 @@
|
|||||||
<div class="status">
|
<div class="status">
|
||||||
<StatusControl {status} />
|
<StatusControl {status} />
|
||||||
</div>
|
</div>
|
||||||
{#if isAdmin}
|
{#if workspaces.length > 10}
|
||||||
<div class="ml-2 mr-2 mb-2 flex-grow">
|
<div class="ml-2 mr-2 mb-2 flex-grow">
|
||||||
<SearchEdit bind:value={search} width={'100%'} />
|
<SearchEdit bind:value={search} width={'100%'} />
|
||||||
</div>
|
</div>
|
||||||
@ -188,24 +186,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-xs flex-row-center flex-center">
|
<span class="text-xs flex-row-center flex-center">
|
||||||
{#if isAdmin}
|
|
||||||
{workspace.url}
|
|
||||||
{#if workspace.region !== undefined}
|
|
||||||
at ({workspace.region})
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
||||||
<div class="text-sm">
|
<div class="text-sm">
|
||||||
{#if isAdmin}
|
|
||||||
{#if workspace.backupInfo != null}
|
|
||||||
{@const sz = workspace.backupInfo.dataSize + workspace.backupInfo.blobsSize}
|
|
||||||
{@const szGb = Math.round((sz * 100) / 1024) / 100}
|
|
||||||
{#if szGb > 0}
|
|
||||||
- {Math.round((sz * 100) / 1024) / 100}Gb -
|
|
||||||
{:else}
|
|
||||||
- {Math.round(sz)}Mb -
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
||||||
({lastUsageDays} days)
|
({lastUsageDays} days)
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
|
@ -41,6 +41,7 @@ import platform, {
|
|||||||
import presentation from '@hcengineering/presentation'
|
import presentation from '@hcengineering/presentation'
|
||||||
import {
|
import {
|
||||||
getCurrentLocation,
|
getCurrentLocation,
|
||||||
|
isSameSegments,
|
||||||
locationStorageKeyId,
|
locationStorageKeyId,
|
||||||
locationToUrl,
|
locationToUrl,
|
||||||
navigate,
|
navigate,
|
||||||
@ -297,6 +298,21 @@ export async function getAccount (doNavigate: boolean = true): Promise<LoginInfo
|
|||||||
if (err instanceof PlatformError) {
|
if (err instanceof PlatformError) {
|
||||||
await handleStatusError('Get account error', err.status)
|
await handleStatusError('Get account error', err.status)
|
||||||
|
|
||||||
|
if (err.status.code === platform.status.Unauthorized) {
|
||||||
|
setMetadata(presentation.metadata.Token, null)
|
||||||
|
setMetadata(presentation.metadata.Workspace, null)
|
||||||
|
setMetadata(presentation.metadata.WorkspaceId, null)
|
||||||
|
setMetadataLocalStorage(login.metadata.LastToken, null)
|
||||||
|
setMetadataLocalStorage(login.metadata.LoginEndpoint, null)
|
||||||
|
setMetadataLocalStorage(login.metadata.LoginEmail, null)
|
||||||
|
|
||||||
|
const loc = getCurrentLocation()
|
||||||
|
loc.path[1] = 'login'
|
||||||
|
loc.path.length = 2
|
||||||
|
navigate(loc)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
} else {
|
} else {
|
||||||
Analytics.handleError(err)
|
Analytics.handleError(err)
|
||||||
@ -454,11 +470,18 @@ export function navigateToWorkspace (
|
|||||||
// Json parse error could be ignored
|
// Json parse error could be ignored
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const last = localStorage.getItem(`${locationStorageKeyId}_${workspaceUrl}`)
|
const newLoc: Location = { path: [workbenchId, workspaceUrl] }
|
||||||
if (last !== null) {
|
let last: Location | undefined
|
||||||
navigate(JSON.parse(last), replace)
|
try {
|
||||||
|
last = JSON.parse(localStorage.getItem(`${locationStorageKeyId}_${workspace}`) ?? '')
|
||||||
|
} catch (err: any) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
if (last != null && isSameSegments(last, newLoc, 2)) {
|
||||||
|
// If last location in our workspace path, use it.
|
||||||
|
navigate(last, replace)
|
||||||
} else {
|
} else {
|
||||||
navigate({ path: [workbenchId, workspaceUrl] }, replace)
|
navigate(newLoc, replace)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
closePopup,
|
closePopup,
|
||||||
fetchMetadataLocalStorage,
|
fetchMetadataLocalStorage,
|
||||||
getCurrentLocation,
|
getCurrentLocation,
|
||||||
|
isSameSegments,
|
||||||
locationStorageKeyId,
|
locationStorageKeyId,
|
||||||
locationToUrl,
|
locationToUrl,
|
||||||
navigate,
|
navigate,
|
||||||
@ -58,11 +59,19 @@
|
|||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
closePopup()
|
closePopup()
|
||||||
closePopup()
|
closePopup()
|
||||||
if (wsUrl !== getCurrentLocation().path[1]) {
|
const current = getCurrentLocation()
|
||||||
const last = localStorage.getItem(`${locationStorageKeyId}_${wsUrl}`)
|
if (wsUrl !== current.path[1]) {
|
||||||
if (last !== null) {
|
let last: Location | undefined
|
||||||
navigate(JSON.parse(last))
|
try {
|
||||||
} else navigate({ path: [workbenchId, wsUrl] })
|
last = JSON.parse(localStorage.getItem(`${locationStorageKeyId}_${wsUrl}`) ?? '')
|
||||||
|
} catch (err: any) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
if (last != null && isSameSegments(last, current, 2)) {
|
||||||
|
navigate(last)
|
||||||
|
} else {
|
||||||
|
navigate({ path: [workbenchId, wsUrl] })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,7 +157,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="p-2 ml-2 mb-4 select-text flex-col bordered">
|
<div class="p-2 ml-2 mb-4 select-text flex-col bordered">
|
||||||
{decodeTokenPayload(getMetadata(presentation.metadata.Token) ?? '').workspace}
|
{decodeTokenPayload(getMetadata(presentation.metadata.Token) ?? '').workspace ?? ''}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
<div class="ap-scroll">
|
<div class="ap-scroll">
|
||||||
|
@ -78,7 +78,8 @@
|
|||||||
showPopup,
|
showPopup,
|
||||||
TooltipInstance,
|
TooltipInstance,
|
||||||
workbenchSeparators,
|
workbenchSeparators,
|
||||||
resizeObserver
|
resizeObserver,
|
||||||
|
isSameSegments
|
||||||
} from '@hcengineering/ui'
|
} from '@hcengineering/ui'
|
||||||
import view from '@hcengineering/view'
|
import view from '@hcengineering/view'
|
||||||
import {
|
import {
|
||||||
@ -429,9 +430,12 @@
|
|||||||
const last = localStorage.getItem(`${locationStorageKeyId}_${loc.path[1]}`)
|
const last = localStorage.getItem(`${locationStorageKeyId}_${loc.path[1]}`)
|
||||||
if (last != null) {
|
if (last != null) {
|
||||||
const lastValue = JSON.parse(last)
|
const lastValue = JSON.parse(last)
|
||||||
navigateDone = navigate(lastValue)
|
|
||||||
if (navigateDone) {
|
if (isSameSegments(lastValue, loc, 2)) {
|
||||||
return
|
navigateDone = navigate(lastValue)
|
||||||
|
if (navigateDone) {
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (app === undefined && !navigateDone) {
|
if (app === undefined && !navigateDone) {
|
||||||
|
40
server/account/src/__tests__/token.test.ts
Normal file
40
server/account/src/__tests__/token.test.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
//
|
||||||
|
// Copyright © 2020, 2021 Anticrm Platform Contributors.
|
||||||
|
// Copyright © 2021 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
import { generateToken } from '@hcengineering/server-token'
|
||||||
|
|
||||||
|
export function decodeTokenPayload (token: string): any {
|
||||||
|
try {
|
||||||
|
return JSON.parse(atob(token.split('.')[1]))
|
||||||
|
} catch (err: any) {
|
||||||
|
console.error(err)
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
describe('generate-tokens', () => {
|
||||||
|
it('should generate tokens', async () => {
|
||||||
|
const extra: Record<string, any> = { confirmed: 'true' }
|
||||||
|
const token = generateToken('mike@some.host', { name: '' }, extra, 'secret')
|
||||||
|
console.log(token)
|
||||||
|
const decodedPayload = decodeTokenPayload(token)
|
||||||
|
expect(decodedPayload).toEqual({
|
||||||
|
confirmed: 'true',
|
||||||
|
email: 'mike@some.host',
|
||||||
|
workspace: ''
|
||||||
|
})
|
||||||
|
expect(decodedPayload.admin).not.toBe('true')
|
||||||
|
})
|
||||||
|
})
|
@ -32,11 +32,12 @@ const getSecret = (): string => {
|
|||||||
export function generateToken (
|
export function generateToken (
|
||||||
accountUuid: PersonUuid,
|
accountUuid: PersonUuid,
|
||||||
workspaceUuid?: WorkspaceUuid,
|
workspaceUuid?: WorkspaceUuid,
|
||||||
extra?: Record<string, string>
|
extra?: Record<string, string>,
|
||||||
|
secret?: string
|
||||||
): string {
|
): string {
|
||||||
return encode(
|
return encode(
|
||||||
{ ...(extra !== undefined ? { extra } : {}), account: accountUuid, workspace: workspaceUuid },
|
{ ...(extra !== undefined ? { extra } : {}), account: accountUuid, workspace: workspaceUuid },
|
||||||
getSecret()
|
secret ?? getSecret()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,9 @@ export class IssuesPage extends CommonTrackerPage {
|
|||||||
appleseedJohnButton = (): Locator => this.page.locator('button.menu-item:has-text("Appleseed John")')
|
appleseedJohnButton = (): Locator => this.page.locator('button.menu-item:has-text("Appleseed John")')
|
||||||
estimationEditor = (): Locator => this.page.locator('#estimation-editor')
|
estimationEditor = (): Locator => this.page.locator('#estimation-editor')
|
||||||
dueDateButton = (): Locator => this.page.locator('button:has-text("Due date")')
|
dueDateButton = (): Locator => this.page.locator('button:has-text("Due date")')
|
||||||
specificDay = (day: string): Locator => this.page.locator(`.date-popup-container div.day >> text=${day}`).first()
|
specificDay = (day: string): Locator =>
|
||||||
|
this.page.locator(`.date-popup-container div.day:not(.wrongMonth) >> text=${day}`).first()
|
||||||
|
|
||||||
inputTextPlaceholder = (): Locator => this.page.getByPlaceholder('Type text...')
|
inputTextPlaceholder = (): Locator => this.page.getByPlaceholder('Type text...')
|
||||||
confirmInput = (): Locator => this.page.locator('.selectPopup button')
|
confirmInput = (): Locator => this.page.locator('.selectPopup button')
|
||||||
|
|
||||||
|
@ -27,16 +27,16 @@ test.describe('Workspace Archive tests', () => {
|
|||||||
|
|
||||||
test('New workspace with date, archive, unarchive', async ({ page, browser, request }) => {
|
test('New workspace with date, archive, unarchive', async ({ page, browser, request }) => {
|
||||||
const api: ApiEndpoint = new ApiEndpoint(request)
|
const api: ApiEndpoint = new ApiEndpoint(request)
|
||||||
const workspaceName = generateId()
|
const wsId = generateId(5)
|
||||||
const workspaceInfo = await api.createWorkspaceWithLogin(workspaceName, 'user1', '1234')
|
const workspaceInfo = await api.createWorkspaceWithLogin(wsId, 'user1', '1234')
|
||||||
|
|
||||||
const newIssue: NewIssue = {
|
const newIssue: NewIssue = {
|
||||||
title: `Issue with all parameters and attachments-${generateId()}`,
|
title: `Issue with all parameters and attachments-${wsId}`,
|
||||||
description: 'Created issue with all parameters and attachments description',
|
description: 'Created issue with all parameters and attachments description',
|
||||||
status: 'In Progress',
|
status: 'In Progress',
|
||||||
priority: 'Urgent',
|
priority: 'Urgent',
|
||||||
createLabel: true,
|
createLabel: true,
|
||||||
labels: `CREATE-ISSUE-${generateId()}`,
|
labels: `CREATE-ISSUE-${wsId}`,
|
||||||
component: 'No component',
|
component: 'No component',
|
||||||
estimation: '2',
|
estimation: '2',
|
||||||
milestone: 'No Milestone',
|
milestone: 'No Milestone',
|
||||||
@ -46,7 +46,7 @@ test.describe('Workspace Archive tests', () => {
|
|||||||
await loginPage.goto()
|
await loginPage.goto()
|
||||||
await loginPage.login('user1', '1234')
|
await loginPage.login('user1', '1234')
|
||||||
|
|
||||||
await selectWorkspacePage.selectWorkspace(workspaceName)
|
await selectWorkspacePage.selectWorkspace(wsId)
|
||||||
|
|
||||||
await trackerNavigationMenuPage.openIssuesForProject('Default')
|
await trackerNavigationMenuPage.openIssuesForProject('Default')
|
||||||
await issuesPage.clickModelSelectorAll()
|
await issuesPage.clickModelSelectorAll()
|
||||||
@ -98,9 +98,11 @@ test.describe('Workspace Archive tests', () => {
|
|||||||
await test.step('Check workspace is active again', async () => {
|
await test.step('Check workspace is active again', async () => {
|
||||||
await page.reload()
|
await page.reload()
|
||||||
|
|
||||||
await selectWorkspacePage.selectWorkspace(workspaceName)
|
await selectWorkspacePage.selectWorkspace(wsId)
|
||||||
|
|
||||||
const issuesDetailsPage = new IssuesDetailsPage(page)
|
const issuesDetailsPage = new IssuesDetailsPage(page)
|
||||||
|
// Should be restored from previos remembered location.
|
||||||
|
// await issuesPage.openIssueByName(newIssue.title)
|
||||||
await issuesDetailsPage.checkIssue(newIssue)
|
await issuesDetailsPage.checkIssue(newIssue)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user