b34b0dd7d6
Validators (Pushes and Pull Requests) / UI & Storage Validation (pull_request) Failing after 12s
Validators (Pushes and Pull Requests) / Database & Schema Validation (pull_request) Successful in 13s
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (pull_request) Failing after 28s
Validators (Pushes and Pull Requests) / WBS & Audit Validations (pull_request) Has been skipped
Validators (Pushes and Pull Requests) / .NET Contracts (pull_request) Has been skipped
Validators (Pushes and Pull Requests) / Calibration & Performance (pull_request) Has been skipped
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (pull_request) Has been skipped
Validators (Pushes and Pull Requests) / CI Workflow Lint (pull_request) Failing after 10s
Validators (Pushes and Pull Requests) / Security & Secrets (pull_request) Successful in 12s
Validators (Pushes and Pull Requests) / Notify PR Results (pull_request) Successful in 2s
Frontend CI Pipeline / ci-frontend-8-steps (pull_request) Failing after 2m50s
388 lines
12 KiB
TypeScript
388 lines
12 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest'
|
|
import { mount } from '@vue/test-utils'
|
|
import WarehouseField from './WarehouseField.vue'
|
|
|
|
describe('WarehouseField (Domain Field)', () => {
|
|
const defaultProps = {
|
|
modelValue: null
|
|
}
|
|
|
|
describe('Rendering', () => {
|
|
it('renders warehouse select dropdown', () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
const select = wrapper.find('select')
|
|
expect(select.exists()).toBe(true)
|
|
})
|
|
|
|
it('loads warehouse options on mount', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
// Wait for mock API call
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.warehouseOptions.length).toBeGreaterThan(0)
|
|
})
|
|
|
|
it('displays warehouse details panel when selected', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
// Wait for options to load
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
// Wait for warehouse details to load
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.find('.card').exists()).toBe(true)
|
|
expect(wrapper.text()).toContain('Seoul Central')
|
|
})
|
|
})
|
|
|
|
describe('Warehouse Selection', () => {
|
|
it('loads selected warehouse details', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.selectedWarehouse).not.toBeNull()
|
|
expect(wrapper.vm.selectedWarehouse?.name).toBe('Seoul Central')
|
|
})
|
|
|
|
it('emits update:modelValue when warehouse selected', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-BUSAN')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const emitted = wrapper.emitted('update:modelValue')
|
|
expect(emitted).toBeDefined()
|
|
expect(emitted?.[0]?.[0]).toBe('WH-BUSAN')
|
|
})
|
|
|
|
it('emits select event with warehouse data', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const emitted = wrapper.emitted('select')
|
|
expect(emitted).toBeDefined()
|
|
expect((emitted?.[0]?.[0] as any).name).toBe('Seoul Central')
|
|
})
|
|
|
|
it('clears selection when empty value selected', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.selectedWarehouse).not.toBeNull()
|
|
|
|
await select.setValue('')
|
|
|
|
expect(wrapper.vm.selectedWarehouse).toBeNull()
|
|
})
|
|
})
|
|
|
|
describe('Capacity Calculation', () => {
|
|
it('calculates capacity percentage correctly', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
// Seoul: 7500 / 10000 = 75%
|
|
expect(wrapper.vm.capacityPercent).toBe(75)
|
|
})
|
|
|
|
it('shows different capacity percentages for different warehouses', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
|
|
// Test Seoul (75%)
|
|
await select.setValue('WH-SEOUL')
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
expect(wrapper.vm.capacityPercent).toBe(75)
|
|
|
|
// Test Busan (20%)
|
|
await select.setValue('WH-BUSAN')
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
expect(wrapper.vm.capacityPercent).toBe(20)
|
|
|
|
// Test Daegu (99%)
|
|
await select.setValue('WH-DAEGU')
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
expect(wrapper.vm.capacityPercent).toBe(99)
|
|
})
|
|
})
|
|
|
|
describe('Capacity Warnings', () => {
|
|
it('shows warning alert when capacity > 75%', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL') // 75%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityAlert).toBe(true)
|
|
})
|
|
|
|
it('does not show warning alert when capacity <= 75%', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-BUSAN') // 20%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityAlert).toBe(false)
|
|
})
|
|
|
|
it('shows critical alert for > 90% capacity', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-DAEGU') // 99%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityAlertClass).toContain('alert-danger')
|
|
})
|
|
|
|
it('shows warning alert for 75-90% capacity', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL') // 75%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityAlertClass).toContain('alert-warning')
|
|
})
|
|
|
|
it('shows success alert for < 75% capacity', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-BUSAN') // 20%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityAlertClass).toContain('alert-success')
|
|
})
|
|
})
|
|
|
|
describe('Status Display', () => {
|
|
it('shows correct status badge for ACTIVE warehouse', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.statusClass).toContain('bg-success')
|
|
})
|
|
|
|
it('shows correct status badge for MAINTENANCE warehouse', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-DAEGU')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.statusClass).toContain('bg-warning')
|
|
})
|
|
})
|
|
|
|
describe('Sections Display', () => {
|
|
it('displays warehouse sections when available', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.text()).toContain('Section A')
|
|
expect(wrapper.text()).toContain('Section B')
|
|
expect(wrapper.text()).toContain('Section C')
|
|
})
|
|
|
|
it('shows section availability slots', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
// Seoul Section A: 30 / 100 slots
|
|
expect(wrapper.text()).toContain('30 / 100 slots')
|
|
})
|
|
})
|
|
|
|
describe('Capacity Bar Styling', () => {
|
|
it('shows success color for low capacity', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-BUSAN') // 20%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityBarClass).toContain('bg-success')
|
|
})
|
|
|
|
it('shows danger color for critical capacity', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-DAEGU') // 99%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityBarClass).toContain('bg-danger')
|
|
})
|
|
|
|
it('shows warning color for high capacity', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL') // 75%
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.capacityBarClass).toContain('bg-warning')
|
|
})
|
|
})
|
|
|
|
describe('Clear Functionality', () => {
|
|
it('clears selection when clear button clicked', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.selectedWarehouse).not.toBeNull()
|
|
|
|
const clearBtn = wrapper.find('.btn-outline-secondary')
|
|
await clearBtn.trigger('click')
|
|
|
|
expect(wrapper.vm.selectedWarehouse).toBeNull()
|
|
expect(wrapper.vm.warehouseId).toBe('')
|
|
})
|
|
})
|
|
|
|
describe('Props Updates', () => {
|
|
it('loads warehouse when modelValue prop is set', async () => {
|
|
const wrapper = mount(WarehouseField, {
|
|
props: { modelValue: 'WH-SEOUL' }
|
|
})
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 800))
|
|
|
|
expect(wrapper.vm.selectedWarehouse).not.toBeNull()
|
|
expect(wrapper.vm.selectedWarehouse?.warehouseId).toBe('WH-SEOUL')
|
|
})
|
|
})
|
|
|
|
describe('Loading State', () => {
|
|
it('shows loading indicator while fetching warehouses', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
expect(wrapper.vm.isLoading).toBe(true)
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
expect(wrapper.vm.isLoading).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('Accessibility', () => {
|
|
it('has proper label', () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
expect(wrapper.text()).toContain('Warehouse')
|
|
})
|
|
|
|
it('shows required indicator', () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
expect(wrapper.text()).toContain('*')
|
|
})
|
|
|
|
it('has aria attributes on progress bar', async () => {
|
|
const wrapper = mount(WarehouseField, { props: defaultProps })
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const select = wrapper.find('select')
|
|
await select.setValue('WH-SEOUL')
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 400))
|
|
|
|
const progressBar = wrapper.find('[role="progressbar"]')
|
|
expect(progressBar.exists()).toBe(true)
|
|
expect(progressBar.attributes('aria-valuenow')).toBeDefined()
|
|
})
|
|
})
|
|
})
|