Skip to content

Commit c3ee1a7

Browse files
[3.12] gh-122255: Add black box tests in test_warnings (GH-122227) (GH-122819)
They are similar to white box tests for gh-86298 in test_importlib. (cherry picked from commit fe13c9b) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent ecf9971 commit c3ee1a7

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

Lib/test/test_warnings/__init__.py

+92
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import re
77
import sys
88
import textwrap
9+
import types
910
import unittest
1011
from test import support
1112
from test.support import import_helper
@@ -611,6 +612,97 @@ class NonWarningSubclass:
611612
self.module.warn('good warning category', MyWarningClass)
612613
self.assertIsInstance(cm.warning, Warning)
613614

615+
def check_module_globals(self, module_globals):
616+
with original_warnings.catch_warnings(module=self.module, record=True) as w:
617+
self.module.filterwarnings('default')
618+
self.module.warn_explicit(
619+
'eggs', UserWarning, 'bar', 1,
620+
module_globals=module_globals)
621+
self.assertEqual(len(w), 1)
622+
self.assertEqual(w[0].category, UserWarning)
623+
self.assertEqual(str(w[0].message), 'eggs')
624+
625+
def check_module_globals_error(self, module_globals, errmsg, errtype=ValueError):
626+
if self.module is py_warnings:
627+
self.check_module_globals(module_globals)
628+
return
629+
with original_warnings.catch_warnings(module=self.module, record=True) as w:
630+
self.module.filterwarnings('always')
631+
with self.assertRaisesRegex(errtype, re.escape(errmsg)):
632+
self.module.warn_explicit(
633+
'eggs', UserWarning, 'bar', 1,
634+
module_globals=module_globals)
635+
self.assertEqual(len(w), 0)
636+
637+
def check_module_globals_deprecated(self, module_globals, msg):
638+
if self.module is py_warnings:
639+
self.check_module_globals(module_globals)
640+
return
641+
with original_warnings.catch_warnings(module=self.module, record=True) as w:
642+
self.module.filterwarnings('always')
643+
self.module.warn_explicit(
644+
'eggs', UserWarning, 'bar', 1,
645+
module_globals=module_globals)
646+
self.assertEqual(len(w), 2)
647+
self.assertEqual(w[0].category, DeprecationWarning)
648+
self.assertEqual(str(w[0].message), msg)
649+
self.assertEqual(w[1].category, UserWarning)
650+
self.assertEqual(str(w[1].message), 'eggs')
651+
652+
def test_gh86298_no_loader_and_no_spec(self):
653+
self.check_module_globals({'__name__': 'bar'})
654+
655+
def test_gh86298_loader_is_none_and_no_spec(self):
656+
self.check_module_globals({'__name__': 'bar', '__loader__': None})
657+
658+
def test_gh86298_no_loader_and_spec_is_none(self):
659+
self.check_module_globals_error(
660+
{'__name__': 'bar', '__spec__': None},
661+
'Module globals is missing a __spec__.loader')
662+
663+
def test_gh86298_loader_is_none_and_spec_is_none(self):
664+
self.check_module_globals_error(
665+
{'__name__': 'bar', '__loader__': None, '__spec__': None},
666+
'Module globals is missing a __spec__.loader')
667+
668+
def test_gh86298_loader_is_none_and_spec_loader_is_none(self):
669+
self.check_module_globals_error(
670+
{'__name__': 'bar', '__loader__': None,
671+
'__spec__': types.SimpleNamespace(loader=None)},
672+
'Module globals is missing a __spec__.loader')
673+
674+
def test_gh86298_no_spec(self):
675+
self.check_module_globals_deprecated(
676+
{'__name__': 'bar', '__loader__': object()},
677+
'Module globals is missing a __spec__.loader')
678+
679+
def test_gh86298_spec_is_none(self):
680+
self.check_module_globals_deprecated(
681+
{'__name__': 'bar', '__loader__': object(), '__spec__': None},
682+
'Module globals is missing a __spec__.loader')
683+
684+
def test_gh86298_no_spec_loader(self):
685+
self.check_module_globals_deprecated(
686+
{'__name__': 'bar', '__loader__': object(),
687+
'__spec__': types.SimpleNamespace()},
688+
'Module globals is missing a __spec__.loader')
689+
690+
def test_gh86298_loader_and_spec_loader_disagree(self):
691+
self.check_module_globals_deprecated(
692+
{'__name__': 'bar', '__loader__': object(),
693+
'__spec__': types.SimpleNamespace(loader=object())},
694+
'Module globals; __loader__ != __spec__.loader')
695+
696+
def test_gh86298_no_loader_and_no_spec_loader(self):
697+
self.check_module_globals_error(
698+
{'__name__': 'bar', '__spec__': types.SimpleNamespace()},
699+
'Module globals is missing a __spec__.loader', AttributeError)
700+
701+
def test_gh86298_no_loader_with_spec_loader_okay(self):
702+
self.check_module_globals(
703+
{'__name__': 'bar',
704+
'__spec__': types.SimpleNamespace(loader=object())})
705+
614706
class CWarnTests(WarnTests, unittest.TestCase):
615707
module = c_warnings
616708

0 commit comments

Comments
 (0)