/
githubmirror
/
photoprism
Обзор
Документация
Войти
/
githubmirror
/
photoprism
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
frontend/tests/vitest/setup.js
162 строки
4 KB
Michael Mayer
Frontend: Gate sidebar visibility on ACL grants, not a static role list
14 май 2026, 17:52
14 май 2026, 17:52
1d6698d
Код
Авторство
О чём код?
// MUST be the first import: filters jsdom's known false-positive // "Could not parse CSS stylesheet" warnings on Vuetify-flavored // stylesheets before any subsequent import injects CSS. import "./helpers/jsdom-quiet"; import { afterEach, vi } from "vitest"; import "@testing-library/jest-dom"; import { config } from "@vue/test-utils"; import { createVuetify } from "vuetify"; import * as components from "vuetify/components"; import * as directives from "vuetify/directives"; import { VFileUpload } from "vuetify/labs/VFileUpload"; import "vuetify/styles"; import clientConfig from "./config"; import { $config } from "app/session"; import { mockGettext, mockPgettext } from "./helpers/gettext"; $config.setValues(clientConfig); // Make config available in browser environment window.__CONFIG__ = clientConfig; // Create a proper Vuetify instance with all components and styles const vuetify = createVuetify({ components: { ...components, VFileUpload }, directives, theme: { defaultTheme: "light", }, }); // Polyfill ResizeObserver in jsdom environment for Vuetify components if (typeof global.ResizeObserver === "undefined") { global.ResizeObserver = class ResizeObserver { constructor(callback) { this.callback = callback; } observe() {} unobserve() {} disconnect() {} }; } // jsdom does not implement window.visualViewport, which Vuetify's VOverlay // location strategies read eagerly via `watch(..., { immediate: true })` — // any overlay-backed component (v-combobox, v-menu, v-dialog...) throws // ReferenceError without this shim. if (!window.visualViewport) { Object.defineProperty(window, "visualViewport", { configurable: true, value: { width: 1024, height: 768, offsetLeft: 0, offsetTop: 0, pageLeft: 0, pageTop: 0, scale: 1, addEventListener() {}, removeEventListener() {}, dispatchEvent() { return true; }, }, }); } // Configure Vue Test Utils global configuration config.global.mocks = { $gettext: mockGettext, $pgettext: mockPgettext, $isRtl: false, $config: { feature: () => true, get: () => false, getSettings: () => ({ features: { edit: true, favorites: true, download: true, archive: true } }), allow: () => true, deny: () => false, featExperimental: () => false, featDevelop: () => false, values: {}, dir: () => "ltr", }, $event: { subscribe: () => "sub-id", subscribeOnce: () => "sub-id-once", unsubscribe: () => {}, publish: () => {}, }, $view: { enter: () => {}, leave: () => {}, isActive: () => true, }, $notify: { success: vi.fn(), error: vi.fn(), warn: vi.fn(), info: vi.fn() }, $fullscreen: { isSupported: () => true, isEnabled: () => false, request: () => Promise.resolve(), exit: () => Promise.resolve(), }, $clipboard: { selection: [], has: () => false, toggle: () => {} }, $util: { hasTouch: () => false, encodeHTML: (s) => s, sanitizeHtml: (s) => s, formatSeconds: (n) => String(n), formatRemainingSeconds: () => "0", formatCamera: (camera, id, make, model) => [make, model].filter(Boolean).join(" "), normalizeTitle: (s) => (s || "").toLowerCase().trim(), typeName: (type, defaultValue) => (type ? String(type) : defaultValue !== undefined ? defaultValue : ""), videoFormat: () => "avc", videoFormatUrl: () => "/v.mp4", thumb: () => ({ src: "/t.jpg", w: 100, h: 100 }), }, $api: { post: vi.fn(), delete: vi.fn(), get: vi.fn() }, $session: {}, }; config.global.plugins = [vuetify]; config.global.stubs = { transition: false, }; config.global.directives = { tooltip: { mounted(el, binding) { el.setAttribute("data-tooltip", binding.value); }, }, }; const originalMount = config.global.mount; config.global.mount = function (component, options = {}) { options.global = options.global || {}; options.global.config = options.global.config || {}; options.global.config.globalProperties = options.global.config.globalProperties || {}; options.global.config.globalProperties.$emit = vi.fn(); // Add vuetify to all mount calls if (!options.global.plugins) { options.global.plugins = [vuetify]; } else if (Array.isArray(options.global.plugins)) { options.global.plugins.push(vuetify); } return originalMount(component, options); }; // Clean up after each test afterEach(() => { vi.resetAllMocks(); }); // Export shared configuration export { clientConfig }; export default { vuetify, };