diff --git a/apps/files/src/views/Navigation.cy.ts b/apps/files/src/views/Navigation.cy.ts index 65964832e8a..8678465841a 100644 --- a/apps/files/src/views/Navigation.cy.ts +++ b/apps/files/src/views/Navigation.cy.ts @@ -1,5 +1,3 @@ -import * as InitialState from '@nextcloud/initial-state' -import * as L10n from '@nextcloud/l10n' import FolderSvg from '@mdi/svg/svg/folder.svg' import ShareSvg from '@mdi/svg/svg/share-variant.svg' import { createTestingPinia } from '@pinia/testing' @@ -13,13 +11,14 @@ describe('Navigation renders', () => { const Navigation = new NavigationService() as NavigationService before(() => { - cy.stub(InitialState, 'loadState') - .returns({ - used: 1000 * 1000 * 1000, - quota: -1, - }) + cy.mockInitialState('files', 'storageStats', { + used: 1000 * 1000 * 1000, + quota: -1, + }) }) + after(() => cy.unmockInitialState()) + it('renders', () => { cy.mount(NavigationView, { propsData: { @@ -157,22 +156,9 @@ describe('Navigation API', () => { describe('Quota rendering', () => { const Navigation = new NavigationService() - beforeEach(() => { - // TODO: remove when @nextcloud/l10n 2.0 is released - // https://github.com/nextcloud/nextcloud-l10n/pull/542 - cy.stub(L10n, 'translate', (app, text, vars = {}, number) => { - cy.log({ app, text, vars, number }) - return text.replace(/%n/g, '' + number).replace(/{([^{}]*)}/g, (match, key) => { - return vars[key] - }) - }) - }) + afterEach(() => cy.unmockInitialState()) it('Unknown quota', () => { - cy.stub(InitialState, 'loadState') - .as('loadStateStats') - .returns(undefined) - cy.mount(NavigationView, { propsData: { Navigation, @@ -188,12 +174,10 @@ describe('Quota rendering', () => { }) it('Unlimited quota', () => { - cy.stub(InitialState, 'loadState') - .as('loadStateStats') - .returns({ - used: 1000 * 1000 * 1000, - quota: -1, - }) + cy.mockInitialState('files', 'storageStats', { + used: 1000 * 1000 * 1000, + quota: -1, + }) cy.mount(NavigationView, { propsData: { @@ -212,13 +196,11 @@ describe('Quota rendering', () => { }) it('Non-reached quota', () => { - cy.stub(InitialState, 'loadState') - .as('loadStateStats') - .returns({ - used: 1000 * 1000 * 1000, - quota: 5 * 1000 * 1000 * 1000, - relative: 20, // percent - }) + cy.mockInitialState('files', 'storageStats', { + used: 1000 * 1000 * 1000, + quota: 5 * 1000 * 1000 * 1000, + relative: 20, // percent + }) cy.mount(NavigationView, { propsData: { @@ -238,13 +220,11 @@ describe('Quota rendering', () => { }) it('Reached quota', () => { - cy.stub(InitialState, 'loadState') - .as('loadStateStats') - .returns({ - used: 5 * 1000 * 1000 * 1000, - quota: 1000 * 1000 * 1000, - relative: 500, // percent - }) + cy.mockInitialState('files', 'storageStats', { + used: 5 * 1000 * 1000 * 1000, + quota: 1000 * 1000 * 1000, + relative: 500, // percent + }) cy.mount(NavigationView, { propsData: { diff --git a/cypress.d.ts b/cypress.d.ts index 7283e5819ab..7dc9a3bde23 100644 --- a/cypress.d.ts +++ b/cypress.d.ts @@ -29,6 +29,21 @@ declare global { namespace Cypress { interface Chainable { mount: typeof mount; + /** + * Mock an initial state for component testing + * + * @param app App name of the initial state + * @param key Key of the initial state + * @param value The mocked value of the initial state + */ + mockInitialState: (app: string, key: string, value: any) => void + /** + * Unmock all initial states or one defined by app and key + * + * @param app app name of the inital state + * @param key the key of the the initial state + */ + unmockInitialState: (app?: string, key?: string) => void } } } diff --git a/cypress/support/component.ts b/cypress/support/component.ts index 3769caed46b..b1e0a1b2c0f 100644 --- a/cypress/support/component.ts +++ b/cypress/support/component.ts @@ -43,3 +43,20 @@ Cypress.Commands.add('mount', (component, optionsOrProps) => { return cy.wrap(instance).as('component') }) }) + +Cypress.Commands.add('mockInitialState', (app: string, key: string, value: any) => { + cy.document().then(($document) => { + const input = $document.createElement('input') + input.setAttribute('type', 'hidden') + input.setAttribute('id', `initial-state-${app}-${key}`) + input.setAttribute('value', btoa(JSON.stringify(value))) + $document.body.appendChild(input) + }) +}) + +Cypress.Commands.add('unmockInitialState', (app?: string, key?: string) => { + cy.document().then(($document) => { + $document.querySelectorAll('body > input[type="hidden"]' + (app ? `[id="initial-state-${app}-${key}"]` : '')) + .forEach((node) => $document.body.removeChild(node)) + }) +}) \ No newline at end of file