Coverage for tests/test_000_frigid/test_400_modules.py: 100%

77 statements  

« prev     ^ index     » next       coverage.py v7.6.8, created at 2024-12-05 01:36 +0000

1# vim: set filetype=python fileencoding=utf-8: 

2# -*- coding: utf-8 -*- 

3 

4#============================================================================# 

5# # 

6# Licensed under the Apache License, Version 2.0 (the "License"); # 

7# you may not use this file except in compliance with the License. # 

8# You may obtain a copy of the License at # 

9# # 

10# http://www.apache.org/licenses/LICENSE-2.0 # 

11# # 

12# Unless required by applicable law or agreed to in writing, software # 

13# distributed under the License is distributed on an "AS IS" BASIS, # 

14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # 

15# See the License for the specific language governing permissions and # 

16# limitations under the License. # 

17# # 

18#============================================================================# 

19 

20 

21''' Assert correct function of modules. ''' 

22 

23# mypy: ignore-errors 

24# pylint: disable=attribute-defined-outside-init 

25# pylint: disable=invalid-name,magic-value-comparison,protected-access 

26 

27 

28import pytest 

29 

30from itertools import product 

31 

32from . import ( 

33 MODULES_QNAMES, 

34 PACKAGE_NAME, 

35 cache_import_module, 

36) 

37 

38 

39THESE_MODULE_QNAMES = tuple( 

40 name for name in MODULES_QNAMES if name.endswith( '.modules' ) ) 

41THESE_CLASSES_NAMES = ( 'Module', ) 

42 

43base = cache_import_module( f"{PACKAGE_NAME}.__" ) 

44exceptions = cache_import_module( f"{PACKAGE_NAME}.exceptions" ) 

45 

46 

47@pytest.mark.parametrize( 

48 'module_qname, class_name', 

49 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES ) 

50) 

51def test_100_instantiation( module_qname, class_name ): 

52 ''' Class instantiates with name. ''' 

53 module = cache_import_module( module_qname ) 

54 Module = getattr( module, class_name ) 

55 obj = Module( 'foo' ) 

56 assert isinstance( obj, Module ) 

57 assert 'foo' == obj.__name__ 

58 

59 

60@pytest.mark.parametrize( 

61 'module_qname, class_name', 

62 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES ) 

63) 

64def test_101_immutability( module_qname, class_name ): 

65 ''' Module prevents attribute modification. ''' 

66 module = cache_import_module( module_qname ) 

67 Module = getattr( module, class_name ) 

68 obj = Module( 'foo' ) 

69 with pytest.raises( exceptions.AttributeImmutabilityError ): 

70 obj.attr = 42 

71 with pytest.raises( exceptions.AttributeImmutabilityError ): 

72 obj.__name__ = 'bar' 

73 assert 'foo' == obj.__name__ 

74 with pytest.raises( exceptions.AttributeImmutabilityError ): 

75 del obj.__name__ 

76 

77 

78@pytest.mark.parametrize( 

79 'module_qname, class_name', 

80 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES ) 

81) 

82def test_500_module_reclassification( module_qname, class_name ): 

83 ''' Modules are correctly reclassified as immutable. ''' 

84 module = cache_import_module( module_qname ) 

85 Module = getattr( module, class_name ) 

86 from types import ModuleType as Module_ 

87 m1 = Module_( 'm1' ) 

88 m2 = Module_( 'm2' ) 

89 m3 = Module( 'm3' ) 

90 attrs = { 'bar': 42, 'orb': True, 'm1': m1, 'm2': m2, 'm3': m3 } 

91 assert not isinstance( m1, Module ) 

92 assert not isinstance( m2, Module ) 

93 assert isinstance( m3, Module ) 

94 module.reclassify_modules( attrs ) 

95 assert isinstance( m1, Module ) 

96 assert isinstance( m2, Module ) 

97 assert isinstance( m3, Module ) 

98 with pytest.raises( exceptions.AttributeImmutabilityError ): 

99 m1.new_attr = 42 

100 with pytest.raises( exceptions.AttributeImmutabilityError ): 

101 m2.new_attr = 42 

102 

103 

104@pytest.mark.parametrize( 

105 'module_qname, class_name', 

106 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES ) 

107) 

108def test_501_module_reclassification_with_custom_type( 

109 module_qname, class_name 

110): 

111 ''' Modules can be reclassified to custom module type. ''' 

112 module = cache_import_module( module_qname ) 

113 Module = getattr( module, class_name ) 

114 from types import ModuleType as Module_ 

115 

116 class CustomModule( Module ): 

117 ''' foo ''' 

118 

119 m1 = Module_( 'm1' ) 

120 attrs = { 'm1': m1 } 

121 module.reclassify_modules( attrs, to_class = CustomModule ) 

122 assert isinstance( m1, CustomModule ) 

123 with pytest.raises( exceptions.AttributeImmutabilityError ): 

124 m1.new_attr = 42 

125 

126 

127@pytest.mark.parametrize( 

128 'module_qname, class_name', 

129 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES ) 

130) 

131def test_900_docstring_sanity( module_qname, class_name ): 

132 ''' Class has valid docstring. ''' 

133 module = cache_import_module( module_qname ) 

134 Object = getattr( module, class_name ) 

135 assert hasattr( Object, '__doc__' ) 

136 assert isinstance( Object.__doc__, str ) 

137 assert Object.__doc__ 

138 

139 

140@pytest.mark.parametrize( 

141 'module_qname, class_name', 

142 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES ) 

143) 

144def test_901_docstring_describes_module( module_qname, class_name ): 

145 ''' Class docstring describes module. ''' 

146 module = cache_import_module( module_qname ) 

147 Object = getattr( module, class_name ) 

148 fragment = base.generate_docstring( 'description of module' ) 

149 assert fragment in Object.__doc__ 

150 

151 

152@pytest.mark.parametrize( 

153 'module_qname, class_name', 

154 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES ) 

155) 

156def test_902_docstring_mentions_immutability( module_qname, class_name ): 

157 ''' Class docstring mentions immutability. ''' 

158 module = cache_import_module( module_qname ) 

159 Object = getattr( module, class_name ) 

160 fragment = base.generate_docstring( 'module attributes immutability' ) 

161 assert fragment in Object.__doc__