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: User Login As a registered user of the saucedemo online store, I want to be able to log in with my username and password, So that I can access my account and browse products. Acceptance Criteria: - Logging in with valid credentials redirects to the products page - Logging in with an incorrect password shows an error message containing "Username and password do not match" - Logging in as a locked-out user shows a message containing "Sorry, this user has been locked out" - Submitting the login form without entering any credentials shows "Username is required" - The products page should display at least one product after successful login ## Criterion The products page should display at least one product after successful login ## Test suite ```js import { test, expect } from '@playwright/test'; const BASE_URL = 'https://www.saucedemo.com'; test.describe('User Login', () => { test.beforeEach(async ({ page }) => { await page.goto(BASE_URL); }); test('valid credentials redirect to the products page @smoke', async ({ page }) => { await page.fill('[data-test="username"]', 'standard_user'); await page.fill('[data-test="password"]', 'secret_sauce'); await page.click('[data-test="login-button"]'); await expect(page).toHaveURL(/inventory\.html/); }); test('incorrect password shows a credential mismatch error @regression', async ({ page }) => { await page.fill('[data-test="username"]', 'standard_user'); await page.fill('[data-test="password"]', 'wrong_password'); await page.click('[data-test="login-button"]'); await expect(page.locator('[data-test="error"]')).toContainText('Username and password do not match'); }); test('locked-out user sees a locked-out message @regression', async ({ page }) => { await page.fill('[data-test="username"]', 'locked_out_user'); await page.fill('[data-test="password"]', 'secret_sauce'); await page.click('[data-test="login-button"]'); await expect(page.locator('[data-test="error"]')).toContainText('Sorry, this user has been locked out'); }); test('submitting an empty form shows username required @regression', async ({ page }) => { await page.click('[data-test="login-button"]'); await expect(page.locator('[data-test="error"]')).toContainText('Username is required'); }); test('products page displays at least one product after login @regression', async ({ page }) => { await page.fill('[data-test="username"]', 'standard_user'); await page.fill('[data-test="password"]', 'secret_sauce'); await page.click('[data-test="login-button"]'); await expect(page.locator('[data-test="inventory-item"]').first()).toBeVisible(); }); }); ``` ## Answer Reply with one line of JSON and nothing else: {"verdict": "covered" | "partial" | "missing", "test": "