feat: site languages, setup and site URL settings
This commit is contained in:
1 parent
0806733d5c
commit
d9158025d4
106 files changed
+10184
-56
No files matched your search
@@ -0,0 +1,62 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { createMemoryHistory } from 'vue-router'
|
||||
import { createAppRouter, resolveAuthRedirect } from '@/router'
|
||||
import { isRouteAllowed } from '@/lib/routeAccess'
|
||||
import { accessFor } from '@/test/access'
|
||||
import { createPinia, setActivePinia } from 'pinia'
|
||||
import { useSessionStore } from '@/stores/session'
|
||||
|
||||
const router = createAppRouter(createMemoryHistory())
|
||||
|
||||
function meta(path: string) {
|
||||
return router.resolve(path).meta
|
||||
}
|
||||
|
||||
describe('Localization routes', () => {
|
||||
it.each([
|
||||
['/settings/sites/journal/languages'],
|
||||
['/settings/sites/journal/public-url'],
|
||||
['/settings/sites/journal/languages/setup'],
|
||||
])('%s needs a verified session', (path) => {
|
||||
expect(meta(path).auth).toBe('verified')
|
||||
})
|
||||
|
||||
it.each([['/settings/sites/journal/languages'], ['/settings/sites/journal/public-url']])(
|
||||
'%s is open to every verified user',
|
||||
(path) => {
|
||||
expect(meta(path).access).toBeUndefined()
|
||||
},
|
||||
)
|
||||
|
||||
it('keeps the setup page for the permission to manage sites', () => {
|
||||
const access = meta('/settings/sites/journal/languages/setup').access as { key: string }
|
||||
expect(access.key).toBe('settings.manage_sites')
|
||||
const owner = new Set(accessFor('owner')!.permissions.map((grant) => grant.key))
|
||||
const reader = new Set(accessFor('viewer')!.permissions.map((grant) => grant.key))
|
||||
expect(isRouteAllowed(access, {}, (key) => owner.has(key))).toBe(true)
|
||||
expect(isRouteAllowed(access, {}, (key) => reader.has(key))).toBe(false)
|
||||
})
|
||||
|
||||
it('passes the site key as a route parameter', () => {
|
||||
expect(router.resolve('/settings/sites/archive/languages').params.key).toBe('archive')
|
||||
expect(router.resolve('/settings/sites/archive/languages/setup').params.key).toBe('archive')
|
||||
expect(router.resolve('/settings/sites/archive/public-url').params.key).toBe('archive')
|
||||
})
|
||||
|
||||
it.each([
|
||||
['/settings/sites/journal/languages'],
|
||||
['/settings/sites/journal/public-url'],
|
||||
['/settings/sites/journal/languages/setup'],
|
||||
])('redirects an anonymous visitor of %s to the login page', (path) => {
|
||||
setActivePinia(createPinia())
|
||||
const session = useSessionStore()
|
||||
session.status = 'ready'
|
||||
session.session = null
|
||||
const destination = resolveAuthRedirect(router.resolve(path), session)
|
||||
|
||||
expect(destination).toEqual({
|
||||
path: '/login',
|
||||
query: { redirect: path, reason: 'expired' },
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -227,6 +227,24 @@ const routes: RouteRecordRaw[] = [
|
||||
component: gated('@/views/SitesView.vue', () => import('@/views/SitesView.vue')),
|
||||
meta: { auth: 'verified', title: 'Settings', access: { key: 'settings.manage_sites' } },
|
||||
},
|
||||
{
|
||||
path: '/settings/sites/:key/languages',
|
||||
component: () => import('@/views/SiteLanguagesView.vue'),
|
||||
meta: { auth: 'verified', title: 'Settings' },
|
||||
},
|
||||
{
|
||||
path: '/settings/sites/:key/languages/setup',
|
||||
component: gated(
|
||||
'@/views/LanguageSetupView.vue',
|
||||
() => import('@/views/LanguageSetupView.vue'),
|
||||
),
|
||||
meta: { auth: 'verified', title: 'Settings', access: { key: 'settings.manage_sites' } },
|
||||
},
|
||||
{
|
||||
path: '/settings/sites/:key/public-url',
|
||||
component: () => import('@/views/PublicUrlView.vue'),
|
||||
meta: { auth: 'verified', title: 'Settings' },
|
||||
},
|
||||
{
|
||||
path: '/settings/permissions',
|
||||
redirect: '/settings/roles',
|
||||
|
||||
Reference in new issue
Block a user