describe('Navigation & Routing', () => { let adminToken before(() => { cy.getAdminToken().then(token => { adminToken = token }) }) it('direct URL /oils loads oil reference page', () => { cy.visit('/oils') cy.contains('精油价目').should('be.visible') }) it('direct URL / loads search page', () => { cy.visit('/') cy.get('input[placeholder*="搜索"]', { timeout: 8000 }).should('be.visible') }) it('unknown route still renders the app', () => { cy.visit('/nonexistent-page') cy.get('.app-header').should('be.visible') cy.get('.nav-tabs').should('be.visible') }) it('back button works between tabs', () => { cy.visit('/') cy.get('.nav-tab').contains('精油价目').click() cy.url().should('include', '/oils') cy.go('back') cy.url().should('not.include', '/oils') }) it('tab active state tracks after click', () => { cy.visit('/') cy.get('.nav-tab').contains('精油价目').click() cy.get('.nav-tab').contains('精油价目').should('have.class', 'active') cy.get('.nav-tab').contains('配方查询').should('not.have.class', 'active') }) it('admin-only pages not accessible as tabs for anonymous users', () => { cy.visit('/') // The nav tabs should only show public tabs cy.get('.nav-tab').should('have.length.lte', 5) // No admin menu links visible cy.get('.usermenu-card').should('not.exist') }) it('admin pages accessible via direct URL when logged in', () => { cy.visit('/audit', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.contains('操作日志', { timeout: 10000 }).should('be.visible') }) it('all tab pages are navigable', () => { cy.visit('/', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) const pages = [ { tab: '管理配方', url: '/manage' }, { tab: '个人库存', url: '/inventory' }, { tab: '精油价目', url: '/oils' }, ] pages.forEach(({ tab, url }) => { cy.get('.nav-tab').contains(tab).click() cy.url().should('include', url) }) }) it('admin pages accessible via user menu', () => { cy.visit('/', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) // Open user menu cy.get('.user-name', { timeout: 10000 }).click() cy.get('.usermenu-card').should('be.visible') cy.get('.usermenu-btn').contains('操作日志').click() cy.url().should('include', '/audit') }) })