| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | # -*- coding: utf-8; -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | from unittest import TestCase | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | from unittest.mock import MagicMock, patch | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | from wuttjamaican.conf import WuttaConfig | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from pyramid import testing | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  | from pyramid.security import remember | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | from wuttaweb import subscribers | 
					
						
							|  |  |  | from wuttaweb import helpers | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  | from wuttaweb.auth import WuttaSecurityPolicy | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestNewRequest(TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.config = WuttaConfig() | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         self.request = self.make_request() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.pyramid_config = testing.setUp( | 
					
						
							|  |  |  |             request=self.request, | 
					
						
							|  |  |  |             settings={ | 
					
						
							|  |  |  |                 "wutta_config": self.config, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         testing.tearDown() | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def make_request(self): | 
					
						
							|  |  |  |         request = testing.DummyRequest() | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         # request.registry.settings = {'wutta_config': self.config} | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  |         return request | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_wutta_config(self): | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         event = MagicMock(request=self.request) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # request gets a new attr | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "wutta_config")) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  |         subscribers.new_request(event) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertTrue(hasattr(self.request, "wutta_config")) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         self.assertIs(self.request.wutta_config, self.config) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_use_oruga_default(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # request gets a new attr, false by default | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "use_oruga")) | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  |         event = MagicMock(request=self.request) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  |         subscribers.new_request(event) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         self.assertFalse(self.request.use_oruga) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  |         # nb. using 'butterfly' theme should cause the 'use_oruga' | 
					
						
							|  |  |  |         # flag to be turned on by default | 
					
						
							|  |  |  |         self.request = self.make_request() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.registry.settings["wuttaweb.theme"] = "butterfly" | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  |         subscribers.new_request(event) | 
					
						
							|  |  |  |         self.assertTrue(self.request.use_oruga) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  |     def test_use_oruga_custom(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault( | 
					
						
							|  |  |  |             "wuttaweb.oruga_detector.spec", | 
					
						
							|  |  |  |             "tests.test_subscribers:custom_oruga_detector", | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         event = MagicMock(request=self.request) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # request gets a new attr, which should be true | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "use_oruga")) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  |         subscribers.new_request(event) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         self.assertTrue(self.request.use_oruga) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  |     def test_register_component(self): | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  |         subscribers.new_request(event) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # component tracking dict is missing at first | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:22 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "wuttaweb_registered_components")) | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # registering a component | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.register_component("foo-example", "FooExample") | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:22 -05:00
										 |  |  |         self.assertTrue(hasattr(self.request, "wuttaweb_registered_components")) | 
					
						
							|  |  |  |         self.assertEqual(len(self.request.wuttaweb_registered_components), 1) | 
					
						
							|  |  |  |         self.assertIn("foo-example", self.request.wuttaweb_registered_components) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual( | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:22 -05:00
										 |  |  |             self.request.wuttaweb_registered_components["foo-example"], "FooExample" | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # re-registering same name | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.register_component("foo-example", "FooExample") | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:22 -05:00
										 |  |  |         self.assertEqual(len(self.request.wuttaweb_registered_components), 1) | 
					
						
							|  |  |  |         self.assertIn("foo-example", self.request.wuttaweb_registered_components) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual( | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:22 -05:00
										 |  |  |             self.request.wuttaweb_registered_components["foo-example"], "FooExample" | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |     def test_get_referrer(self): | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def home(request): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.pyramid_config.add_route("home", "/") | 
					
						
							|  |  |  |         self.pyramid_config.add_view(home, route_name="home") | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "get_referrer")) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         subscribers.new_request(event) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertTrue(hasattr(self.request, "get_referrer")) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # default if no referrer, is home route | 
					
						
							|  |  |  |         url = self.request.get_referrer() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual(url, self.request.route_url("home")) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # can specify another default | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         url = self.request.get_referrer(default="https://wuttaproject.org") | 
					
						
							|  |  |  |         self.assertEqual(url, "https://wuttaproject.org") | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # or referrer can come from user session | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.session["referrer"] = "https://rattailproject.org" | 
					
						
							|  |  |  |         self.assertIn("referrer", self.request.session) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         url = self.request.get_referrer() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual(url, "https://rattailproject.org") | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         # nb. referrer should also have been removed from user session | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertNotIn("referrer", self.request.session) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # or referrer can come from request params | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.params["referrer"] = "https://kernel.org" | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         url = self.request.get_referrer() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual(url, "https://kernel.org") | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def custom_oruga_detector(request): | 
					
						
							|  |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  | class TestNewRequestSetUser(TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config = WuttaConfig( | 
					
						
							|  |  |  |             defaults={ | 
					
						
							|  |  |  |                 "wutta.db.default.url": "sqlite://", | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-05 15:06:55 -05:00
										 |  |  |         self.request = testing.DummyRequest(wutta_config=self.config) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.pyramid_config = testing.setUp( | 
					
						
							|  |  |  |             request=self.request, | 
					
						
							|  |  |  |             settings={ | 
					
						
							|  |  |  |                 "wutta_config": self.config, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.app = self.config.get_app() | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							|  |  |  |         model.Base.metadata.create_all(bind=self.config.appdb_engine) | 
					
						
							|  |  |  |         self.session = self.app.make_session() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.user = model.User(username="barney") | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  |         self.session.add(self.user) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.pyramid_config.set_security_policy( | 
					
						
							|  |  |  |             WuttaSecurityPolicy(db_session=self.session) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         testing.tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_anonymous(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "user")) | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event) | 
					
						
							|  |  |  |         self.assertIsNone(self.request.user) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_authenticated(self): | 
					
						
							|  |  |  |         uuid = self.user.uuid | 
					
						
							|  |  |  |         self.assertIsNotNone(uuid) | 
					
						
							|  |  |  |         remember(self.request, uuid) | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertIs(self.request.user, self.user) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |     def test_is_admin(self): | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # anonymous user | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "user")) | 
					
						
							|  |  |  |         self.assertFalse(hasattr(self.request, "is_admin")) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertIsNone(self.request.user) | 
					
						
							|  |  |  |         self.assertFalse(self.request.is_admin) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.is_admin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # authenticated user, but still not an admin | 
					
						
							|  |  |  |         self.request.user = self.user | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertIs(self.request.user, self.user) | 
					
						
							|  |  |  |         self.assertFalse(self.request.is_admin) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.is_admin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # but if we make them an admin, it changes | 
					
						
							|  |  |  |         auth = self.app.get_auth_handler() | 
					
						
							|  |  |  |         admin = auth.get_role_administrator(self.session) | 
					
						
							|  |  |  |         self.user.roles.append(admin) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertIs(self.request.user, self.user) | 
					
						
							|  |  |  |         self.assertTrue(self.request.is_admin) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_is_root(self): | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # anonymous user | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "user")) | 
					
						
							|  |  |  |         self.assertFalse(hasattr(self.request, "is_root")) | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertIsNone(self.request.user) | 
					
						
							|  |  |  |         self.assertFalse(self.request.is_root) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.is_admin | 
					
						
							|  |  |  |         del self.request.is_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # authenticated user, but still not an admin | 
					
						
							|  |  |  |         self.request.user = self.user | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertIs(self.request.user, self.user) | 
					
						
							|  |  |  |         self.assertFalse(self.request.is_root) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.is_admin | 
					
						
							|  |  |  |         del self.request.is_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # even if we make them an admin, still not yet root | 
					
						
							|  |  |  |         auth = self.app.get_auth_handler() | 
					
						
							|  |  |  |         admin = auth.get_role_administrator(self.session) | 
					
						
							|  |  |  |         self.user.roles.append(admin) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertIs(self.request.user, self.user) | 
					
						
							|  |  |  |         self.assertTrue(self.request.is_admin) | 
					
						
							|  |  |  |         self.assertFalse(self.request.is_root) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.is_admin | 
					
						
							|  |  |  |         del self.request.is_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # root status flag lives in user session | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.session["is_root"] = True | 
					
						
							| 
									
										
										
										
											2024-08-05 14:21:54 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertTrue(self.request.is_admin) | 
					
						
							|  |  |  |         self.assertTrue(self.request.is_root) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |     def test_user_permissions(self): | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							|  |  |  |         auth = self.app.get_auth_handler() | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # anonymous user | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "user_permissions")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							|  |  |  |         self.assertEqual(self.request.user_permissions, set()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.user_permissions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # add user to role with perms | 
					
						
							|  |  |  |         blokes = model.Role(name="Blokes") | 
					
						
							|  |  |  |         self.session.add(blokes) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         auth.grant_permission(blokes, "appinfo.list") | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         self.user.roles.append(blokes) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # authenticated user, with perms | 
					
						
							|  |  |  |         self.request.user = self.user | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual(self.request.user_permissions, {"appinfo.list"}) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_has_perm(self): | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							|  |  |  |         auth = self.app.get_auth_handler() | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # anonymous user | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "has_perm")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(self.request.has_perm("appinfo.list")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.user_permissions | 
					
						
							|  |  |  |         del self.request.has_perm | 
					
						
							|  |  |  |         del self.request.has_any_perm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # add user to role with perms | 
					
						
							|  |  |  |         blokes = model.Role(name="Blokes") | 
					
						
							|  |  |  |         self.session.add(blokes) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         auth.grant_permission(blokes, "appinfo.list") | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         self.user.roles.append(blokes) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # authenticated user, with perms | 
					
						
							|  |  |  |         self.request.user = self.user | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertTrue(self.request.has_perm("appinfo.list")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.user_permissions | 
					
						
							|  |  |  |         del self.request.has_perm | 
					
						
							|  |  |  |         del self.request.has_any_perm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # drop user from role, no more perms | 
					
						
							|  |  |  |         self.user.roles.remove(blokes) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(self.request.has_perm("appinfo.list")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.user_permissions | 
					
						
							|  |  |  |         del self.request.has_perm | 
					
						
							|  |  |  |         del self.request.has_any_perm | 
					
						
							|  |  |  |         del self.request.is_admin | 
					
						
							|  |  |  |         del self.request.is_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # root user always has perms | 
					
						
							|  |  |  |         admin = auth.get_role_administrator(self.session) | 
					
						
							|  |  |  |         self.user.roles.append(admin) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.session["is_root"] = True | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertTrue(self.request.has_perm("appinfo.list")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_has_any_perm(self): | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							|  |  |  |         auth = self.app.get_auth_handler() | 
					
						
							|  |  |  |         event = MagicMock(request=self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # anonymous user | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(hasattr(self.request, "has_any_perm")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(self.request.has_any_perm("appinfo.list")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.user_permissions | 
					
						
							|  |  |  |         del self.request.has_perm | 
					
						
							|  |  |  |         del self.request.has_any_perm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # add user to role with perms | 
					
						
							|  |  |  |         blokes = model.Role(name="Blokes") | 
					
						
							|  |  |  |         self.session.add(blokes) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         auth.grant_permission(blokes, "appinfo.list") | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         self.user.roles.append(blokes) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # authenticated user, with perms | 
					
						
							|  |  |  |         self.request.user = self.user | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertTrue(self.request.has_any_perm("appinfo.list", "appinfo.view")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.user_permissions | 
					
						
							|  |  |  |         del self.request.has_perm | 
					
						
							|  |  |  |         del self.request.has_any_perm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # drop user from role, no more perms | 
					
						
							|  |  |  |         self.user.roles.remove(blokes) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertFalse(self.request.has_any_perm("appinfo.list")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # reset | 
					
						
							|  |  |  |         del self.request.user_permissions | 
					
						
							|  |  |  |         del self.request.has_perm | 
					
						
							|  |  |  |         del self.request.has_any_perm | 
					
						
							|  |  |  |         del self.request.is_admin | 
					
						
							|  |  |  |         del self.request.is_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # root user always has perms | 
					
						
							|  |  |  |         admin = auth.get_role_administrator(self.session) | 
					
						
							|  |  |  |         self.user.roles.append(admin) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.request.session["is_root"] = True | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  |         subscribers.new_request_set_user(event, db_session=self.session) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertTrue(self.request.has_any_perm("appinfo.list")) | 
					
						
							| 
									
										
										
										
											2024-08-14 21:20:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-04 23:09:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | class TestBeforeRender(TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config = WuttaConfig( | 
					
						
							|  |  |  |             defaults={ | 
					
						
							|  |  |  |                 "wutta.web.menus.handler.spec": "tests.util:NullMenuHandler", | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def make_request(self): | 
					
						
							| 
									
										
										
										
											2024-08-05 21:49:18 -05:00
										 |  |  |         request = testing.DummyRequest(use_oruga=False) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         request.registry.settings = {"wutta_config": self.config} | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  |         request.wutta_config = self.config | 
					
						
							|  |  |  |         return request | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_basic(self): | 
					
						
							|  |  |  |         request = self.make_request() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         event = {"request": request} | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # event dict will get populated with more context | 
					
						
							|  |  |  |         subscribers.before_render(event) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIn("config", event) | 
					
						
							|  |  |  |         self.assertIs(event["config"], self.config) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIn("app", event) | 
					
						
							|  |  |  |         self.assertIs(event["app"], self.config.get_app()) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIn("h", event) | 
					
						
							|  |  |  |         self.assertIs(event["h"], helpers) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIn("url", event) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  |         # TODO: not sure how to test this? | 
					
						
							|  |  |  |         # self.assertIs(event['url'], request.route_url) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIn("json", event) | 
					
						
							|  |  |  |         self.assertIs(event["json"], json) | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  |         # current theme should be 'default' and picker not exposed | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual(event["theme"], "default") | 
					
						
							|  |  |  |         self.assertFalse(event["expose_theme_picker"]) | 
					
						
							|  |  |  |         self.assertNotIn("available_themes", event) | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_custom_theme(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wuttaweb.themes.expose_picker", "true") | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  |         request = self.make_request() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         request.registry.settings["wuttaweb.theme"] = "butterfly" | 
					
						
							|  |  |  |         event = {"request": request} | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # event dict will get populated with more context | 
					
						
							|  |  |  |         subscribers.before_render(event) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual(event["theme"], "butterfly") | 
					
						
							|  |  |  |         self.assertTrue(event["expose_theme_picker"]) | 
					
						
							|  |  |  |         self.assertIn("available_themes", event) | 
					
						
							|  |  |  |         self.assertEqual(event["available_themes"], ["default", "butterfly"]) | 
					
						
							| 
									
										
										
										
											2025-06-29 09:16:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-12 00:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TestIncludeMe(TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_basic(self): | 
					
						
							|  |  |  |         with testing.testConfig() as pyramid_config: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # just ensure no error happens when included.. | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             pyramid_config.include("wuttaweb.subscribers") |