You are reviewing an automated UI test suite. Decide whether the test suite checks one acceptance criterion. ## Rubric Answer with exactly one verdict: - **covered**: a test performs the action the criterion describes and asserts the outcome the criterion names. When the criterion describes a single example ("a product", "an item"), one example is enough. A test that reaches the same result by a different route or with a different style of assertion still counts. - **partial**: a test asserts only part of the named outcome, or covers only some of the cases the criterion names. - **missing**: no test that runs asserts the named outcome, or the only assertion would pass whether or not the outcome happened. Judge only what the code checks, not whether the site behaves correctly, whether the test is fast, or whether the criterion itself is well written. Assume the tests run against https://www.saucedemo.com with its usual `data-test` attributes. ## Feature Feature: Checkout Information As a customer with an item in my cart, I want to enter my shipping details at checkout, So that my order can be delivered. Acceptance Criteria: - From the cart, clicking Checkout opens the "Checkout: Your Information" step - Continuing with no first name shows "Error: First Name is required" - Continuing with a first name but no last name shows "Error: Last Name is required" - Continuing with first and last name but no postal code shows "Error: Postal Code is required" - Continuing with all three fields filled opens the "Checkout: Overview" step - Clicking Cancel returns to the cart page ## Criterion Continuing with first and last name but no postal code shows "Error: Postal Code is required" ## Test suite ```js import { test, expect } from '@playwright/test'; const BASE_URL = 'https://www.saucedemo.com'; test.describe('Checkout Information', () => { test.beforeEach(async ({ page }) => { await page.goto(BASE_URL); await page.fill('[data-test="username"]', 'standard_user'); await page.fill('[data-test="password"]', 'secret_sauce'); await page.click('[data-test="login-button"]'); await page.click('[data-test="add-to-cart-sauce-labs-backpack"]'); await page.click('[data-test="shopping-cart-link"]'); await page.click('[data-test="checkout"]'); }); test('checkout opens the Your Information step @smoke', async ({ page }) => { await expect(page.locator('[data-test="title"]')).toHaveText('Checkout: Your Information'); }); test('missing first name shows an error @regression', async ({ page }) => { await page.click('[data-test="continue"]'); await expect(page.locator('[data-test="error"]')).toHaveText('Error: First Name is required'); }); test('missing last name shows an error @regression', async ({ page }) => { await page.fill('[data-test="firstName"]', 'Ana'); await page.click('[data-test="continue"]'); await expect(page.locator('[data-test="error"]')).toHaveText('Error: Last Name is required'); }); test('missing postal code shows an error @regression', async ({ page }) => { await page.fill('[data-test="firstName"]', 'Ana'); await page.fill('[data-test="lastName"]', 'Silva'); await page.click('[data-test="continue"]'); await expect(page.locator('[data-test="error"]')).toHaveText('Error: Postal Code is required'); }); test('all fields filled continues to the overview @regression', async ({ page }) => { await page.fill('[data-test="firstName"]', 'Ana'); await page.fill('[data-test="lastName"]', 'Silva'); await page.fill('[data-test="postalCode"]', 'L1S 2A1'); await page.click('[data-test="continue"]'); await expect(page.locator('[data-test="title"]')).toHaveText('Checkout: Overview'); }); test('cancel returns to the cart @regression', async ({ page }) => { await page.click('[data-test="cancel"]'); await expect(page).toHaveURL(/cart\.html/); }); }); ``` ## Answer Reply with one line of JSON and nothing else: {"verdict": "covered" | "partial" | "missing", "test": "", "reason": "<one sentence>"}