describe('Admin Flow', () => { let adminToken before(() => { cy.getAdminToken().then(token => { adminToken = token }) }) beforeEach(() => { cy.visit('/', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.nav-tab', { timeout: 10000 }).should('have.length.gte', 3) }) it('shows standard tabs for logged-in users', () => { cy.get('.nav-tab').contains('配方查询').should('be.visible') cy.get('.nav-tab').contains('管理配方').should('be.visible') cy.get('.nav-tab').contains('精油价目').should('be.visible') }) it('admin pages accessible via URL (audit log)', () => { cy.visit('/audit', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.contains('操作日志', { timeout: 10000 }).should('be.visible') }) it('admin pages accessible via URL (user management)', () => { cy.visit('/users', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.contains('用户管理', { timeout: 10000 }).should('be.visible') }) it('admin pages accessible via URL (bug tracker)', () => { cy.visit('/bugs', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.contains('Bug', { timeout: 10000 }).should('be.visible') }) it('can access manage recipes page via tab', () => { cy.get('.nav-tab').contains('管理配方').click() cy.url().should('include', '/manage') }) it('user menu shows admin links', () => { // Open user menu by clicking username cy.get('.user-name').click() cy.get('.usermenu-card', { timeout: 5000 }).should('be.visible') cy.get('.usermenu-btn').contains('操作日志').should('be.visible') cy.get('.usermenu-btn').contains('用户管理').should('be.visible') }) })