@@ -1590,3 +1590,213 @@ def test_user_email_delete_not_found(self, db_request):
1590
1590
assert db_request .session .flash .calls == [
1591
1591
pretend .call ("Email not found" , queue = "error" )
1592
1592
]
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