diff --git a/e2e/picklist.spec.ts b/e2e/picklist.spec.ts index 945c423..c30cf4c 100644 --- a/e2e/picklist.spec.ts +++ b/e2e/picklist.spec.ts @@ -1,25 +1,19 @@ import { expect, test } from '@playwright/test'; const areaName = 'Drinks'; -const chocolateProduct = 'Mars Bar'; -const chipsProduct = 'Smiths Salt n Vinegar 90g'; const additionalProduct = 'Pump 750'; test.describe('Active pick list', () => { - test('creates a pick list with category-prefilled items and adds more products', async ({ page }) => { + test('creates a pick list and adds products from the search bar', async ({ page }) => { await page.goto('/'); await expect(page.getByRole('heading', { name: 'StockFill' })).toBeVisible(); await page.getByRole('link', { name: 'Create Pick List' }).click(); await page.getByLabel('Area').click(); await page.getByRole('option', { name: areaName }).first().click(); - await page.getByRole('checkbox', { name: 'Chocolates' }).click(); - await page.getByRole('checkbox', { name: 'Chips' }).click(); await page.getByRole('button', { name: 'Save Pick List' }).click(); await expect(page.getByRole('heading', { name: `${areaName} List` })).toBeVisible(); - await expect(page.getByText(chocolateProduct).first()).toBeVisible(); - await expect(page.getByText(chipsProduct).first()).toBeVisible(); const searchInput = page.getByPlaceholder('Search products'); await searchInput.click(); @@ -32,4 +26,31 @@ test.describe('Active pick list', () => { await expect(page.getByText(additionalProduct).first()).toBeVisible(); await expect(page.getByRole('button', { name: 'Save and Return' })).toBeEnabled(); }); + + test('allows adding and editing products from the manage products screen', async ({ page }) => { + await page.goto('/'); + + await page.getByRole('link', { name: 'Manage Products' }).click(); + + await page.getByLabel('Name').click(); + await page.getByLabel('Name').fill('Playwright Cola'); + await page.getByLabel('Category').click(); + await page.getByRole('option', { name: 'Drinks' }).click(); + await page.getByRole('button', { name: 'Save Product' }).click(); + + await expect(page.getByText('Product added.')).toBeVisible(); + await expect(page.getByText('Playwright Cola')).toBeVisible(); + + await page.getByRole('button', { name: 'Edit Playwright Cola' }).click(); + + const editNameField = page.getByLabel('Name').nth(1); + await expect(editNameField).toBeVisible(); + await editNameField.fill('Playwright Cola Zero'); + + const saveButton = page.locator('[aria-label="Save product"]'); + await expect(saveButton).toBeEnabled(); + await saveButton.click(); + + await expect(page.getByText('Playwright Cola Zero')).toBeVisible(); + }); }); diff --git a/src/modules/openFoodFacts.test.ts b/src/modules/openFoodFacts.test.ts index af5d92e..33adb49 100644 --- a/src/modules/openFoodFacts.test.ts +++ b/src/modules/openFoodFacts.test.ts @@ -76,5 +76,28 @@ describe('fetchProductFromOFF', () => { expect(result).toBeNull(); }); + + it('returns null immediately when the barcode is empty', async () => { + const result = await fetchProductFromOFF(''); + + expect(result).toBeNull(); + }); + + it('returns null when the browser is offline', async () => { + const originalNavigator = navigator; + Object.defineProperty(globalThis, 'navigator', { + value: { onLine: false }, + configurable: true, + }); + + const result = await fetchProductFromOFF('123456'); + + expect(result).toBeNull(); + + Object.defineProperty(globalThis, 'navigator', { + value: originalNavigator, + configurable: true, + }); + }); }); diff --git a/src/screens/ManageProductsScreen.test.tsx b/src/screens/ManageProductsScreen.test.tsx index fa3554c..575dde9 100644 --- a/src/screens/ManageProductsScreen.test.tsx +++ b/src/screens/ManageProductsScreen.test.tsx @@ -165,6 +165,33 @@ describe('ManageProductsScreen barcode lookup', () => { expect(mockDb.products.add).not.toHaveBeenCalled(); }); + it('informs the user when barcode lookup happens offline', async () => { + const originalNavigator = navigator; + Object.defineProperty(globalThis, 'navigator', { + value: { onLine: false }, + configurable: true, + }); + + try { + const user = userEvent.setup(); + render( + + + , + ); + + await user.click(screen.getByRole('button', { name: /scan barcode/i })); + await user.click(screen.getByRole('button', { name: /mock scan/i })); + + expect(await screen.findByText(/you are offline\. enter details manually\./i)).toBeVisible(); + } finally { + Object.defineProperty(globalThis, 'navigator', { + value: originalNavigator, + configurable: true, + }); + } + }); + it('prevents updating a product to use an existing barcode', async () => { mockUseProducts.mockReturnValue([ {