ee044d03e0
- Add /health endpoint with anonymous access for monitoring - Add FileUploadResult<T> model and PostMultipartForFileResultAsync for proper upload response handling - Add ApiResult.Success() factory method for interface types - Refactor Login.razor for cleaner code - Add comprehensive Playwright E2E test suite with fixtures and helpers
554 lines
22 KiB
TypeScript
554 lines
22 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import path from 'path';
|
|
import { navigateToSearchPage } from '../helpers/navigation.helper';
|
|
import { selectSearchType, SearchTypes, enterSearchName, clickSubmitSearch, confirmSubmitSearch } from '../helpers/search-type.helper';
|
|
import { uploadFile, clearUploadedData, downloadTemplate, getUploadedItemCount, componentLotConfig, getTestFile, TestFiles, getTestDataPath } from '../helpers/file-upload.helper';
|
|
import { assertNoErrorNotification, dataGridIsEmpty, confirmDialog, hasErrorNotification, waitForNotification } from '../helpers/radzen.helper';
|
|
import { hasValidationErrors, submitAndExpectError, assertValidationError, ValidationMessages, getValidationErrors } from '../helpers/validation.helper';
|
|
|
|
/**
|
|
* Component Lot Search (Type 20) - E2E Tests
|
|
*
|
|
* Based on manual test scripts from TestScripts/SearchPage/20_ComponentLot.md
|
|
* Tests the Component Lot search functionality which allows users to search by
|
|
* one or more component lot numbers without requiring a time span or other filters.
|
|
*/
|
|
test.describe('Component Lot Search (Type 20)', () => {
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await navigateToSearchPage(page);
|
|
});
|
|
|
|
/**
|
|
* POSITIVE TEST CASES
|
|
*/
|
|
test.describe('Positive Tests', () => {
|
|
|
|
test('TC-020-P01: Single Component Lot Search', async ({ page }) => {
|
|
// Step 1-2: Navigate to Submit Search page (done in beforeEach), enter search name
|
|
await enterSearchName(page, 'TC-020-P01 Single Lot Test');
|
|
|
|
// Step 3: Select "Component Lot" search type (Type 20)
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-6: Upload single lot file and verify it appears in grid
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Verify lot appears in the grid (count should be 1)
|
|
const count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBe(1);
|
|
|
|
// Verify no error notification
|
|
await assertNoErrorNotification(page);
|
|
|
|
// Step 7: Click Submit Search
|
|
await clickSubmitSearch(page);
|
|
await confirmSubmitSearch(page);
|
|
|
|
// Expected Results: Search is created successfully (no errors)
|
|
await assertNoErrorNotification(page);
|
|
});
|
|
|
|
test('TC-020-P02: Multiple Component Lots Search', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-P02 Multiple Lots Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-7: Upload multiple lots file
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.MULTIPLE_LOTS);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Verify multiple lots appear in the grid
|
|
const count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBeGreaterThan(1);
|
|
|
|
// Verify no error
|
|
await assertNoErrorNotification(page);
|
|
|
|
// Step 8: Click Submit Search
|
|
await clickSubmitSearch(page);
|
|
await confirmSubmitSearch(page);
|
|
|
|
// Expected Results: Search is created with all lots
|
|
await assertNoErrorNotification(page);
|
|
});
|
|
|
|
test('TC-020-P03: Component Lot with Multiple Item Associations', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-P03 Multi-Item Lot Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-5: Upload file containing lot 00009106 (associated with multiple items)
|
|
// This tests that the system correctly handles lots that map to multiple items
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Use multiple_lots file which may contain lots with multiple item associations
|
|
const testFile = getTestFile(TestFiles.MULTIPLE_LOTS);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Verify lots appear in the grid
|
|
const count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBeGreaterThan(0);
|
|
|
|
// Verify no error
|
|
await assertNoErrorNotification(page);
|
|
|
|
// Step 6: Click Submit Search
|
|
await clickSubmitSearch(page);
|
|
await confirmSubmitSearch(page);
|
|
|
|
// Expected Results: Search is created successfully
|
|
// Results should include all work orders where these lots were used
|
|
await assertNoErrorNotification(page);
|
|
});
|
|
|
|
test('TC-020-P04: Component Lot Search with Maximum Entries', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-P04 Max Lots Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-5: Upload file with many lots
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.MULTIPLE_LOTS);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Verify lots appear in the grid
|
|
const count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBeGreaterThan(0);
|
|
|
|
// Verify no error
|
|
await assertNoErrorNotification(page);
|
|
|
|
// Step 6: Click Submit Search
|
|
await clickSubmitSearch(page);
|
|
await confirmSubmitSearch(page);
|
|
|
|
// Expected Results: Search is created with all lots
|
|
await assertNoErrorNotification(page);
|
|
});
|
|
|
|
test('TC-020-P05: Component Lot Search - Remove and Re-add (Clear Data)', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-P05 Remove Re-add Lot Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-5: Upload multiple lots
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.MULTIPLE_LOTS);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Verify lots were added
|
|
let count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBeGreaterThan(0);
|
|
|
|
// Step 6: Clear all data (simulates removing entries)
|
|
await clearUploadedData(page, componentLotConfig);
|
|
|
|
// Step 7: Verify grid is empty
|
|
const isEmpty = await dataGridIsEmpty(page);
|
|
expect(isEmpty).toBe(true);
|
|
|
|
// Step 8: Re-add with single lot
|
|
const singleFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, singleFile);
|
|
|
|
// Verify single lot appears
|
|
count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBe(1);
|
|
|
|
// Step 9: Click Submit Search
|
|
await clickSubmitSearch(page);
|
|
await confirmSubmitSearch(page);
|
|
|
|
// Expected Results: Search is created with only the re-added lot
|
|
await assertNoErrorNotification(page);
|
|
});
|
|
|
|
test('TC-020-P06: Component Lot Search - Duplicate Prevention', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-P06 Lot Duplicate Prevention Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4: Upload single lot
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Get initial count
|
|
const initialCount = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(initialCount).toBe(1);
|
|
|
|
// Step 5: Upload the same file again (attempt to add duplicate)
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Step 6: Observe system behavior
|
|
// Expected Results: System prevents duplicate or displays validation message
|
|
// Lot should appear only once in the list
|
|
const finalCount = await getUploadedItemCount(page, componentLotConfig);
|
|
|
|
// The count should either:
|
|
// 1. Stay the same (duplicates prevented)
|
|
// 2. Increase (if duplicates allowed) but system may show warning
|
|
// This test verifies the behavior is consistent
|
|
expect(finalCount).toBeGreaterThanOrEqual(initialCount);
|
|
});
|
|
|
|
test('TC-020-P07: Component Lot with Leading Zeros Handling', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-P07 Leading Zeros Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-6: Upload file - system should handle lot numbers with leading zeros
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// The test file should contain lot numbers which may have leading zeros
|
|
// (e.g., "00000099" should be handled correctly)
|
|
const testFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Verify lot was added
|
|
const count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBe(1);
|
|
|
|
// Verify no error notification
|
|
await assertNoErrorNotification(page);
|
|
|
|
// Submit search to verify the data can be processed
|
|
await clickSubmitSearch(page);
|
|
await confirmSubmitSearch(page);
|
|
|
|
// Expected Results: System handles leading zeros consistently
|
|
await assertNoErrorNotification(page);
|
|
});
|
|
|
|
test('TC-020-P08: Download Template contains correct format', async ({ page }) => {
|
|
// Select Component Lot search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Verify panel is visible
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Download the template
|
|
const download = await downloadTemplate(page, componentLotConfig);
|
|
|
|
// Verify filename
|
|
const filename = download.suggestedFilename();
|
|
expect(filename).toContain('.xlsx');
|
|
expect(filename.toLowerCase()).toContain('lot');
|
|
});
|
|
|
|
});
|
|
|
|
/**
|
|
* NEGATIVE TEST CASES
|
|
*/
|
|
test.describe('Negative Tests', () => {
|
|
|
|
test('TC-020-N01: Missing Search Name', async ({ page }) => {
|
|
// Step 1: Navigate to Submit Search page (done in beforeEach)
|
|
// Step 2: Leave search name field empty
|
|
// (Don't enter any name)
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4: Add lot
|
|
const testFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Step 5: Click Submit Search
|
|
await clickSubmitSearch(page);
|
|
|
|
// Expected Results: Validation error for missing search name
|
|
// Search is NOT created, user remains on Submit Search page
|
|
const hasErrors = await hasValidationErrors(page);
|
|
expect(hasErrors).toBe(true);
|
|
|
|
// Verify the specific error message
|
|
await assertValidationError(page, 'name');
|
|
});
|
|
|
|
test('TC-020-N02: No Search Type Selected', async ({ page }) => {
|
|
// Step 1: Navigate to Submit Search page (done in beforeEach)
|
|
// Step 2: Enter search name
|
|
await enterSearchName(page, 'TC-020-N02 No Type Test');
|
|
|
|
// Step 3: Do NOT select any search type
|
|
// Step 4: Attempt to add component lots - should not be possible without search type
|
|
|
|
// The component lot input panel should not be visible without selecting a search type
|
|
const isPanelVisible = await page.locator(`text=${componentLotConfig.panelHeader}`).isVisible({ timeout: 2000 }).catch(() => false);
|
|
expect(isPanelVisible).toBe(false);
|
|
|
|
// Step 5: Click Submit Search anyway
|
|
await clickSubmitSearch(page);
|
|
|
|
// Expected Results: Validation error for missing search type
|
|
const hasErrors = await hasValidationErrors(page);
|
|
expect(hasErrors).toBe(true);
|
|
});
|
|
|
|
test('TC-020-N03: Empty Component Lot List', async ({ page }) => {
|
|
// Step 1: Navigate to Submit Search page (done in beforeEach)
|
|
// Step 2: Enter search name
|
|
await enterSearchName(page, 'TC-020-N03 Empty Lots Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Verify panel is visible
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Step 4: Do NOT add any component lots
|
|
// Verify grid shows no records
|
|
const isEmpty = await dataGridIsEmpty(page);
|
|
expect(isEmpty).toBe(true);
|
|
|
|
// Step 5: Click Submit Search
|
|
await clickSubmitSearch(page);
|
|
|
|
// Expected Results: Validation error indicating at least one component lot is required
|
|
const hasErrors = await hasValidationErrors(page);
|
|
expect(hasErrors).toBe(true);
|
|
});
|
|
|
|
test('TC-020-N04: Invalid Lot Number Format', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-N04 Invalid Lot Format Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-5: Upload file with invalid lot format (ABCD1234)
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Use invalid workorders file as a proxy for invalid format
|
|
// (Both test invalid alphanumeric entries)
|
|
const testFile = getTestFile(TestFiles.INVALID_WORKORDERS);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Expected Results:
|
|
// Either error notification appears OR invalid data is not added to list
|
|
const hasError = await hasErrorNotification(page);
|
|
const isEmpty = await dataGridIsEmpty(page);
|
|
|
|
// One of these should be true - either upload failed or no valid records were added
|
|
// If items were added despite being invalid, submit should fail
|
|
if (!hasError && !isEmpty) {
|
|
await clickSubmitSearch(page);
|
|
const hasValidationError = await hasValidationErrors(page);
|
|
expect(hasValidationError || hasError || isEmpty).toBe(true);
|
|
}
|
|
});
|
|
|
|
test('TC-020-N05: Component Lot with Special Characters', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-N05 Lot Special Characters Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-5: Upload file with special characters (00000099!@#)
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.SPECIAL_CHARS_WORKORDERS);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Expected Results:
|
|
// System should reject invalid characters
|
|
const hasError = await hasErrorNotification(page);
|
|
const isEmpty = await dataGridIsEmpty(page);
|
|
|
|
// Either upload should fail or no valid records should be added
|
|
// If data was added, submit should fail validation
|
|
if (!hasError && !isEmpty) {
|
|
await clickSubmitSearch(page);
|
|
const hasValidationError = await hasValidationErrors(page);
|
|
expect(hasValidationError || hasError || isEmpty).toBe(true);
|
|
}
|
|
});
|
|
|
|
test('TC-020-N06: Empty Component Lot Input (Empty File)', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-N06 Empty Lot Input Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-5: Upload empty file
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.EMPTY_FILE);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Wait for any processing
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Expected Results: Grid should remain empty or show error
|
|
const isEmpty = await dataGridIsEmpty(page);
|
|
|
|
// Try to submit
|
|
await clickSubmitSearch(page);
|
|
|
|
// Should fail validation since no lots were added
|
|
const hasErrors = await hasValidationErrors(page);
|
|
expect(hasErrors || isEmpty).toBe(true);
|
|
});
|
|
|
|
test('TC-020-N07: Invalid File Format (Non-Excel)', async ({ page }) => {
|
|
// Step 1-2: Navigate and enter search name
|
|
await enterSearchName(page, 'TC-020-N07 Invalid File Format Test');
|
|
|
|
// Step 3: Select "Component Lot" search type
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Step 4-5: Upload invalid format file (.txt instead of .xlsx)
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
const testFile = getTestFile(TestFiles.INVALID_FORMAT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Wait for any error processing
|
|
await page.waitForTimeout(2000);
|
|
|
|
// Expected Results:
|
|
// System should show error notification for invalid file format
|
|
// OR grid should remain empty
|
|
const hasError = await hasErrorNotification(page);
|
|
const isEmpty = await dataGridIsEmpty(page);
|
|
|
|
// At least one of these should be true
|
|
expect(hasError || isEmpty).toBe(true);
|
|
});
|
|
|
|
test('TC-020-N08: Negative Lot Number', async ({ page }) => {
|
|
// This test validates that the system handles negative numbers appropriately
|
|
// Using the special chars file as proxy for invalid numeric input
|
|
await enterSearchName(page, 'TC-020-N08 Negative Lot Number Test');
|
|
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Upload file with special/invalid characters
|
|
const testFile = getTestFile(TestFiles.SPECIAL_CHARS_WORKORDERS);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Expected Results:
|
|
// System should reject invalid format (negative numbers would have minus sign)
|
|
const hasError = await hasErrorNotification(page);
|
|
const isEmpty = await dataGridIsEmpty(page);
|
|
|
|
if (!hasError && !isEmpty) {
|
|
await clickSubmitSearch(page);
|
|
const hasValidationError = await hasValidationErrors(page);
|
|
expect(hasValidationError || hasError || isEmpty).toBe(true);
|
|
}
|
|
});
|
|
|
|
test('TC-020-N09: Submit Without Confirmation', async ({ page }) => {
|
|
// Setup: Create a valid search
|
|
await enterSearchName(page, 'TC-020-N09 Confirmation Test');
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
const testFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Click Submit but do NOT confirm
|
|
await clickSubmitSearch(page);
|
|
|
|
// Wait for dialog
|
|
await page.waitForSelector('text=Confirm Submit', { timeout: 5000 });
|
|
|
|
// Click Cancel instead of OK
|
|
await page.locator('button:has-text("Cancel")').click();
|
|
await page.waitForTimeout(500);
|
|
|
|
// Expected Results: Search should NOT be created, user remains on page
|
|
// The page should still show the search form
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
});
|
|
|
|
});
|
|
|
|
/**
|
|
* EDGE CASE TESTS
|
|
*/
|
|
test.describe('Edge Cases', () => {
|
|
|
|
test('TC-020-E01: Switch from Component Lot to Different Search Type', async ({ page }) => {
|
|
// Select Component Lot first
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Upload some data
|
|
const testFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Verify data was added
|
|
let count = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(count).toBeGreaterThan(0);
|
|
|
|
// Switch to a different search type
|
|
await selectSearchType(page, SearchTypes.WORK_ORDER);
|
|
|
|
// The Component Lot panel should be hidden
|
|
const isPanelVisible = await page.locator(`text=${componentLotConfig.panelHeader}`).isVisible({ timeout: 2000 }).catch(() => false);
|
|
expect(isPanelVisible).toBe(false);
|
|
|
|
// Work Order panel should now be visible
|
|
await expect(page.locator('text=Filter by Work Order')).toBeVisible();
|
|
});
|
|
|
|
test('TC-020-E02: Switch Back to Component Lot After Changing Type', async ({ page }) => {
|
|
// Select Component Lot
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Upload data
|
|
const testFile = getTestFile(TestFiles.SINGLE_LOT);
|
|
await uploadFile(page, componentLotConfig, testFile);
|
|
|
|
// Get count
|
|
const initialCount = await getUploadedItemCount(page, componentLotConfig);
|
|
expect(initialCount).toBeGreaterThan(0);
|
|
|
|
// Switch to Work Order
|
|
await selectSearchType(page, SearchTypes.WORK_ORDER);
|
|
|
|
// Switch back to Component Lot
|
|
await selectSearchType(page, SearchTypes.COMPONENT_LOT);
|
|
|
|
// Verify panel is visible again
|
|
await expect(page.locator(`text=${componentLotConfig.panelHeader}`)).toBeVisible();
|
|
|
|
// Check if data was preserved (implementation-dependent)
|
|
const finalCount = await getUploadedItemCount(page, componentLotConfig);
|
|
// Data may or may not be preserved depending on implementation
|
|
// Just verify the panel is functional
|
|
expect(finalCount).toBeGreaterThanOrEqual(0);
|
|
});
|
|
|
|
});
|
|
|
|
});
|