{"version":3,"names":["test","expect","describe","page","goto","waitForLoadState","body","locator","toBeVisible","errors","on","msg","type","push","text","waitForTimeout","criticalErrors","filter","e","includes","length","toBe","first","request","response","get","toContain","status","isOnLogin","url","hasAccessDenied","isVisible","catch","toBeTruthy","loginLink","timeout","click","waitForURL"],"sources":["smoke.spec.js"],"sourcesContent":["import { test, expect } from '@playwright/test'\n\n/**\n * E2E Test: Smoke Tests\n * Quick verification that key pages load without errors\n */\n\ntest.describe('Smoke Tests', () => {\n\n  test('homepage should load', async ({ page }) => {\n    await page.goto('/')\n    await page.waitForLoadState('networkidle')\n\n    // Check page has content\n    const body = page.locator('body')\n    await expect(body).toBeVisible()\n\n    // Should not have console errors at Error level\n    const errors = []\n    page.on('console', msg => {\n      if (msg.type() === 'error') {\n        errors.push(msg.text())\n      }\n    })\n\n    await page.waitForTimeout(1000)\n\n    // Filter out known non-critical errors\n    const criticalErrors = errors.filter(e =>\n      !e.includes('favicon') &&\n      !e.includes('404') &&\n      !e.includes('manifest')\n    )\n\n    expect(criticalErrors.length).toBe(0)\n  })\n\n  test('login page should load', async ({ page }) => {\n    await page.goto('/login')\n    await page.waitForLoadState('networkidle')\n\n    // Check login page title\n    await expect(page.locator('text=📦 FETCH CHINA')).toBeVisible()\n\n    // Check login form elements\n    await expect(page.locator('input[type=\"email\"], input[type=\"text\"]').first()).toBeVisible()\n    await expect(page.locator('input[type=\"password\"]')).toBeVisible()\n  })\n\n  test('API health check', async ({ request }) => {\n    // Test API endpoints directly\n    // Note: /api/v1/auth/me is deprecated, use /api/v1/user/me instead\n    const response = await request.get('/api/v1/user/me')\n\n    // Should either return 200/401/403 (authenticated/not), or 429 (rate limited)\n    expect([200, 401, 403, 429]).toContain(response.status())\n  })\n\n  test('partner orders endpoint should be accessible', async ({ request }) => {\n    // This should return 401 without auth, or 429 if rate limited\n    const response = await request.get('/api/v1/partner/orders')\n    expect([200, 401, 403, 429]).toContain(response.status())\n  })\n\n  test('admin page should require auth', async ({ page }) => {\n    await page.goto('/admin')\n    await page.waitForLoadState('networkidle')\n\n    // Without login, should redirect to login or show access denied\n    await page.waitForTimeout(2000)\n\n    const isOnLogin = page.url().includes('login')\n    const hasAccessDenied = await page.locator('text=/403|Forbidden|Access Denied/i').isVisible().catch(() => false)\n\n    expect(isOnLogin || hasAccessDenied).toBeTruthy()\n  })\n})\n\ntest.describe('Navigation', () => {\n\n  test('should navigate from homepage to login', async ({ page }) => {\n    await page.goto('/')\n    await page.waitForLoadState('networkidle')\n\n    // Look for login link/button\n    const loginLink = page.locator('a[href*=\"login\"], button:has-text(\"Sign In\"), button:has-text(\"Login\")')\n\n    if (await loginLink.isVisible({ timeout: 3000 }).catch(() => false)) {\n      await loginLink.first().click()\n      await page.waitForURL('**/login**')\n      expect(page.url()).toContain('login')\n    }\n  })\n})\n"],"mappings":"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","ignoreList":[]}