describe('Visual Check', () => { let adminToken before(() => { cy.getAdminToken().then(token => { adminToken = token }) }) it('homepage loads with recipes', () => { cy.visit('/', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.recipe-card', { timeout: 10000 }).should('have.length.gte', 1) }) it('oil reference loads with chips', () => { cy.visit('/oils', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.oil-chip', { timeout: 10000 }).should('have.length.gte', 1) }) it('manage recipes page loads', () => { cy.visit('/manage', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.recipe-manager', { timeout: 10000 }).should('exist') }) it('inventory page loads', () => { cy.visit('/inventory', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.inventory-page', { timeout: 10000 }).should('exist') }) it('recipe cards show price > 0', () => { cy.visit('/', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.recipe-card', { timeout: 10000 }).should('have.length.gte', 1) cy.get('.recipe-card').first().invoke('text').then(text => { const priceMatch = text.match(/¥\s*(\d+\.?\d*)/) if (priceMatch) { expect(parseFloat(priceMatch[1])).to.be.gt(0) } }) }) it('recipe detail overlay opens', () => { cy.visit('/', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.recipe-card', { timeout: 10000 }).first().click() cy.get('.detail-overlay', { timeout: 10000 }).should('exist') }) })