@@ -1590,3 +1590,213 @@ def test_user_email_delete_not_found(self, db_request):
15901590 assert db_request .session .flash .calls == [
15911591 pretend .call ("Email not found" , queue = "error" )
15921592 ]
1593+
1594+
1595+ class TestUserQuarantineProjects :
1596+ def test_quarantines_user_projects (self , db_request ):
1597+ user = UserFactory .create ()
1598+ project1 = ProjectFactory .create ()
1599+ project2 = ProjectFactory .create ()
1600+ RoleFactory (project = project1 , user = user , role_name = "Owner" )
1601+ RoleFactory (project = project2 , user = user , role_name = "Maintainer" )
1602+
1603+ db_request .matchdict ["username" ] = str (user .username )
1604+ db_request .params = {"username" : user .username }
1605+ db_request .route_path = pretend .call_recorder (lambda * a , ** kw : "/foobar" )
1606+ db_request .session = pretend .stub (
1607+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1608+ )
1609+ db_request .user = UserFactory .create ()
1610+
1611+ result = views .user_quarantine_projects (user , db_request )
1612+
1613+ assert isinstance (result , HTTPSeeOther )
1614+ assert result .headers ["Location" ] == "/foobar"
1615+ assert db_request .session .flash .calls == [
1616+ pretend .call (
1617+ f"Quarantined 2 project(s) for user { user .username !r} " ,
1618+ queue = "success" ,
1619+ )
1620+ ]
1621+ assert project1 .lifecycle_status == "quarantine-enter"
1622+ assert project2 .lifecycle_status == "quarantine-enter"
1623+
1624+ def test_quarantines_user_projects_skips_already_quarantined (self , db_request ):
1625+ user = UserFactory .create ()
1626+ project1 = ProjectFactory .create (lifecycle_status = "quarantine-enter" )
1627+ project2 = ProjectFactory .create ()
1628+ RoleFactory (project = project1 , user = user , role_name = "Owner" )
1629+ RoleFactory (project = project2 , user = user , role_name = "Maintainer" )
1630+
1631+ db_request .matchdict ["username" ] = str (user .username )
1632+ db_request .params = {"username" : user .username }
1633+ db_request .route_path = pretend .call_recorder (lambda * a , ** kw : "/foobar" )
1634+ db_request .session = pretend .stub (
1635+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1636+ )
1637+ db_request .user = UserFactory .create ()
1638+
1639+ result = views .user_quarantine_projects (user , db_request )
1640+
1641+ assert isinstance (result , HTTPSeeOther )
1642+ assert result .headers ["Location" ] == "/foobar"
1643+ assert db_request .session .flash .calls == [
1644+ pretend .call (
1645+ f"Quarantined 1 project(s) for user { user .username !r} " ,
1646+ queue = "success" ,
1647+ )
1648+ ]
1649+ assert project1 .lifecycle_status == "quarantine-enter"
1650+ assert project2 .lifecycle_status == "quarantine-enter"
1651+
1652+ def test_quarantines_user_projects_no_projects_to_quarantine (self , db_request ):
1653+ user = UserFactory .create ()
1654+ project1 = ProjectFactory .create (lifecycle_status = "quarantine-enter" )
1655+ project2 = ProjectFactory .create (lifecycle_status = "quarantine-enter" )
1656+ RoleFactory (project = project1 , user = user , role_name = "Owner" )
1657+ RoleFactory (project = project2 , user = user , role_name = "Maintainer" )
1658+
1659+ db_request .matchdict ["username" ] = str (user .username )
1660+ db_request .params = {"username" : user .username }
1661+ db_request .route_path = pretend .call_recorder (lambda * a , ** kw : "/foobar" )
1662+ db_request .session = pretend .stub (
1663+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1664+ )
1665+ db_request .user = UserFactory .create ()
1666+
1667+ result = views .user_quarantine_projects (user , db_request )
1668+
1669+ assert isinstance (result , HTTPSeeOther )
1670+ assert result .headers ["Location" ] == "/foobar"
1671+ assert db_request .session .flash .calls == [
1672+ pretend .call (
1673+ f"No projects needed quarantining for user { user .username !r} " ,
1674+ queue = "info" ,
1675+ )
1676+ ]
1677+
1678+ def test_quarantine_user_projects_bad_confirm (self , db_request ):
1679+ user = UserFactory .create ()
1680+ project = ProjectFactory .create ()
1681+ RoleFactory (project = project , user = user , role_name = "Owner" )
1682+
1683+ db_request .matchdict ["username" ] = str (user .username )
1684+ db_request .params = {"username" : "wrong" }
1685+ db_request .route_path = pretend .call_recorder (lambda a , ** k : "/foobar" )
1686+ db_request .session = pretend .stub (
1687+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1688+ )
1689+
1690+ result = views .user_quarantine_projects (user , db_request )
1691+
1692+ assert isinstance (result , HTTPSeeOther )
1693+ assert result .headers ["Location" ] == "/foobar"
1694+ assert db_request .session .flash .calls == [
1695+ pretend .call ("Wrong confirmation input" , queue = "error" )
1696+ ]
1697+ assert project .lifecycle_status is None
1698+
1699+
1700+ class TestUserClearQuarantineProjects :
1701+ def test_clears_quarantine_user_projects (self , db_request ):
1702+ user = UserFactory .create ()
1703+ project1 = ProjectFactory .create (lifecycle_status = "quarantine-enter" )
1704+ project2 = ProjectFactory .create (lifecycle_status = "quarantine-enter" )
1705+ RoleFactory (project = project1 , user = user , role_name = "Owner" )
1706+ RoleFactory (project = project2 , user = user , role_name = "Maintain" )
1707+
1708+ db_request .matchdict ["username" ] = str (user .username )
1709+ db_request .params = {"username" : user .username }
1710+ db_request .route_path = pretend .call_recorder (lambda * a , ** kw : "/foobar" )
1711+ db_request .session = pretend .stub (
1712+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1713+ )
1714+ db_request .user = UserFactory .create ()
1715+
1716+ result = views .user_clear_quarantine_projects (user , db_request )
1717+
1718+ assert isinstance (result , HTTPSeeOther )
1719+ assert result .headers ["Location" ] == "/foobar"
1720+ assert db_request .session .flash .calls == [
1721+ pretend .call (
1722+ f"Cleared quarantine for 2 project(s) for { user .username !r} " ,
1723+ queue = "success" ,
1724+ )
1725+ ]
1726+ assert project1 .lifecycle_status == "quarantine-exit"
1727+ assert project2 .lifecycle_status == "quarantine-exit"
1728+
1729+ def test_clears_quarantine_user_projects_skips_non_quarantined (self , db_request ):
1730+ user = UserFactory .create ()
1731+ project1 = ProjectFactory .create () # Not quarantined
1732+ project2 = ProjectFactory .create (lifecycle_status = "quarantine-enter" )
1733+ RoleFactory (project = project1 , user = user , role_name = "Owner" )
1734+ RoleFactory (project = project2 , user = user , role_name = "Maintainer" )
1735+
1736+ db_request .matchdict ["username" ] = str (user .username )
1737+ db_request .params = {"username" : user .username }
1738+ db_request .route_path = pretend .call_recorder (lambda * a , ** kw : "/foobar" )
1739+ db_request .session = pretend .stub (
1740+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1741+ )
1742+ db_request .user = UserFactory .create ()
1743+
1744+ result = views .user_clear_quarantine_projects (user , db_request )
1745+
1746+ assert isinstance (result , HTTPSeeOther )
1747+ assert result .headers ["Location" ] == "/foobar"
1748+ assert db_request .session .flash .calls == [
1749+ pretend .call (
1750+ f"Cleared quarantine for 1 project(s) for { user .username !r} " ,
1751+ queue = "success" ,
1752+ )
1753+ ]
1754+ assert project1 .lifecycle_status is None
1755+ assert project2 .lifecycle_status == "quarantine-exit"
1756+
1757+ def test_clears_quarantine_user_projects_no_quarantined_projects (self , db_request ):
1758+ user = UserFactory .create ()
1759+ project1 = ProjectFactory .create ()
1760+ project2 = ProjectFactory .create ()
1761+ RoleFactory (project = project1 , user = user , role_name = "Owner" )
1762+ RoleFactory (project = project2 , user = user , role_name = "Maintainer" )
1763+
1764+ db_request .matchdict ["username" ] = str (user .username )
1765+ db_request .params = {"username" : user .username }
1766+ db_request .route_path = pretend .call_recorder (lambda * a , ** kw : "/foobar" )
1767+ db_request .session = pretend .stub (
1768+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1769+ )
1770+ db_request .user = UserFactory .create ()
1771+
1772+ result = views .user_clear_quarantine_projects (user , db_request )
1773+
1774+ assert isinstance (result , HTTPSeeOther )
1775+ assert result .headers ["Location" ] == "/foobar"
1776+ assert db_request .session .flash .calls == [
1777+ pretend .call (
1778+ f"No quarantined projects found for user { user .username !r} " ,
1779+ queue = "info" ,
1780+ )
1781+ ]
1782+
1783+ def test_clear_quarantine_user_projects_bad_confirm (self , db_request ):
1784+ user = UserFactory .create ()
1785+ project = ProjectFactory .create (lifecycle_status = "quarantine-enter" )
1786+ RoleFactory (project = project , user = user , role_name = "Owner" )
1787+
1788+ db_request .matchdict ["username" ] = str (user .username )
1789+ db_request .params = {"username" : "wrong" }
1790+ db_request .route_path = pretend .call_recorder (lambda a , ** k : "/foobar" )
1791+ db_request .session = pretend .stub (
1792+ flash = pretend .call_recorder (lambda * a , ** kw : None )
1793+ )
1794+
1795+ result = views .user_clear_quarantine_projects (user , db_request )
1796+
1797+ assert isinstance (result , HTTPSeeOther )
1798+ assert result .headers ["Location" ] == "/foobar"
1799+ assert db_request .session .flash .calls == [
1800+ pretend .call ("Wrong confirmation input" , queue = "error" )
1801+ ]
1802+ assert project .lifecycle_status == "quarantine-enter"
0 commit comments