@@ -1527,4 +1527,152 @@ describe('Reports', () => {
15271527 } )
15281528 } )
15291529 } )
1530+
1531+ describe ( 'URL parameter validation' , ( ) => {
1532+ it ( 'should accept valid URL parameters' , async ( ) => {
1533+ const store = mockStore ( initialState )
1534+ const { getByLabelText } = render (
1535+ < Provider store = { store } >
1536+ < MemoryRouter initialEntries = { [ '/?fy=2023&q=Q1&type=tanf' ] } >
1537+ < Reports />
1538+ </ MemoryRouter >
1539+ </ Provider >
1540+ )
1541+
1542+ await waitFor ( ( ) => {
1543+ const yearSelect = getByLabelText ( 'Fiscal Year (October - September)*' )
1544+ const quarterSelect = getByLabelText ( 'Fiscal Quarter*' )
1545+ expect ( yearSelect . value ) . toBe ( '2023' )
1546+ expect ( quarterSelect . value ) . toBe ( 'Q1' )
1547+ } )
1548+ } )
1549+
1550+ it ( 'should clear only fiscal year when it is invalid' , async ( ) => {
1551+ const store = mockStore ( initialState )
1552+ const { getByLabelText } = render (
1553+ < Provider store = { store } >
1554+ < MemoryRouter initialEntries = { [ '/?fy=2019&q=Q1&type=tanf' ] } >
1555+ < Reports />
1556+ </ MemoryRouter >
1557+ </ Provider >
1558+ )
1559+
1560+ await waitFor ( ( ) => {
1561+ const yearSelect = getByLabelText ( 'Fiscal Year (October - September)*' )
1562+ const quarterSelect = getByLabelText ( 'Fiscal Quarter*' )
1563+ // Only fy should be cleared, other valid params kept
1564+ expect ( yearSelect . value ) . toBe ( '' )
1565+ expect ( quarterSelect . value ) . toBe ( 'Q1' )
1566+ } )
1567+ } )
1568+
1569+ it ( 'should clear only quarter when it is invalid' , async ( ) => {
1570+ const store = mockStore ( initialState )
1571+ const { getByLabelText } = render (
1572+ < Provider store = { store } >
1573+ < MemoryRouter initialEntries = { [ '/?fy=2023&q=Q5&type=tanf' ] } >
1574+ < Reports />
1575+ </ MemoryRouter >
1576+ </ Provider >
1577+ )
1578+
1579+ await waitFor ( ( ) => {
1580+ const yearSelect = getByLabelText ( 'Fiscal Year (October - September)*' )
1581+ const quarterSelect = getByLabelText ( 'Fiscal Quarter*' )
1582+ // Only quarter should be cleared, other valid params kept
1583+ expect ( yearSelect . value ) . toBe ( '2023' )
1584+ expect ( quarterSelect . value ) . toBe ( '' )
1585+ } )
1586+ } )
1587+
1588+ it ( 'should reset file type to default when it is invalid' , async ( ) => {
1589+ const store = mockStore ( initialState )
1590+ const { getByLabelText } = render (
1591+ < Provider store = { store } >
1592+ < MemoryRouter initialEntries = { [ '/?fy=2023&q=Q1&type=invalid-type' ] } >
1593+ < Reports />
1594+ </ MemoryRouter >
1595+ </ Provider >
1596+ )
1597+
1598+ await waitFor ( ( ) => {
1599+ const yearSelect = getByLabelText ( 'Fiscal Year (October - September)*' )
1600+ const quarterSelect = getByLabelText ( 'Fiscal Quarter*' )
1601+ // Year and quarter should be kept, type resets to default (tanf)
1602+ expect ( yearSelect . value ) . toBe ( '2023' )
1603+ expect ( quarterSelect . value ) . toBe ( 'Q1' )
1604+ // TANF radio should be selected (default) - check by label text
1605+ const tanfRadio = getByLabelText ( 'TANF' )
1606+ expect ( tanfRadio . checked ) . toBe ( true )
1607+ } )
1608+ } )
1609+
1610+ it ( 'should clear only STT when it is invalid' , async ( ) => {
1611+ const store = mockStore ( initialState )
1612+ const { getByLabelText } = render (
1613+ < Provider store = { store } >
1614+ < MemoryRouter
1615+ initialEntries = { [ '/?fy=2023&q=Q1&type=tanf&stt=NonExistentSTT' ] }
1616+ >
1617+ < Reports />
1618+ </ MemoryRouter >
1619+ </ Provider >
1620+ )
1621+
1622+ await waitFor ( ( ) => {
1623+ const yearSelect = getByLabelText ( 'Fiscal Year (October - September)*' )
1624+ const quarterSelect = getByLabelText ( 'Fiscal Quarter*' )
1625+ const sttInput = getByLabelText ( 'State, Tribe, or Territory*' , {
1626+ selector : 'input' ,
1627+ } )
1628+ // Only STT should be cleared, other valid params kept
1629+ expect ( yearSelect . value ) . toBe ( '2023' )
1630+ expect ( quarterSelect . value ) . toBe ( 'Q1' )
1631+ expect ( sttInput . value ) . toBe ( '' )
1632+ } )
1633+ } )
1634+
1635+ it ( 'should accept valid STT' , async ( ) => {
1636+ const store = mockStore ( initialState )
1637+ const { getByLabelText } = render (
1638+ < Provider store = { store } >
1639+ < MemoryRouter
1640+ initialEntries = { [ '/?fy=2023&q=Q1&type=tanf&stt=California' ] }
1641+ >
1642+ < Reports />
1643+ </ MemoryRouter >
1644+ </ Provider >
1645+ )
1646+
1647+ await waitFor ( ( ) => {
1648+ const yearSelect = getByLabelText ( 'Fiscal Year (October - September)*' )
1649+ const quarterSelect = getByLabelText ( 'Fiscal Quarter*' )
1650+ const sttInput = getByLabelText ( 'State, Tribe, or Territory*' , {
1651+ selector : 'input' ,
1652+ } )
1653+ expect ( yearSelect . value ) . toBe ( '2023' )
1654+ expect ( quarterSelect . value ) . toBe ( 'Q1' )
1655+ expect ( sttInput . value ) . toBe ( 'California' )
1656+ } )
1657+ } )
1658+
1659+ it ( 'should clear only fiscal year when it is non-numeric' , async ( ) => {
1660+ const store = mockStore ( initialState )
1661+ const { getByLabelText } = render (
1662+ < Provider store = { store } >
1663+ < MemoryRouter initialEntries = { [ '/?fy=abc&q=Q1&type=tanf' ] } >
1664+ < Reports />
1665+ </ MemoryRouter >
1666+ </ Provider >
1667+ )
1668+
1669+ await waitFor ( ( ) => {
1670+ const yearSelect = getByLabelText ( 'Fiscal Year (October - September)*' )
1671+ const quarterSelect = getByLabelText ( 'Fiscal Quarter*' )
1672+ // Only fy should be cleared, other valid params kept
1673+ expect ( yearSelect . value ) . toBe ( '' )
1674+ expect ( quarterSelect . value ) . toBe ( 'Q1' )
1675+ } )
1676+ } )
1677+ } )
15301678} )
0 commit comments