Coverage for ckanext/udc/tests/test_cli_udc.py: 100%

49 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2026-03-30 22:15 +0000

1from types import SimpleNamespace 

2 

3from ckanext.udc.cli import udc as udc_cli 

4 

5 

6def test_get_number_field_names_uses_config_order(): 

7 fields = udc_cli._get_number_field_names( 

8 { 

9 "maturity_model": [ 

10 { 

11 "fields": [ 

12 {"name": "title", "type": "text"}, 

13 {"name": "number_of_rows", "type": "number"}, 

14 ] 

15 }, 

16 { 

17 "fields": [ 

18 {"name": "number_of_cells", "type": "number"}, 

19 {"name": "number_of_rows", "type": "number"}, 

20 ] 

21 }, 

22 ] 

23 } 

24 ) 

25 

26 assert fields == ["number_of_rows", "number_of_cells"] 

27 

28 

29def test_inspect_number_field_value_detects_fixable_localized_json(): 

30 inspection = udc_cli._inspect_number_field_value('{"en": "351", "fr": "351"}') 

31 

32 assert inspection == { 

33 "status": "fixable_localized", 

34 "normalized": "351", 

35 } 

36 

37 

38def test_inspect_number_field_value_accepts_thousands_separators(): 

39 inspection = udc_cli._inspect_number_field_value("10,740") 

40 

41 assert inspection == { 

42 "status": "fixable_scalar", 

43 "normalized": "10740", 

44 } 

45 

46 

47def test_inspect_number_field_value_detects_fixable_localized_json_with_thousands_separators(): 

48 inspection = udc_cli._inspect_number_field_value('{"en": "10,740", "fr": "10,740"}') 

49 

50 assert inspection == { 

51 "status": "fixable_localized", 

52 "normalized": "10740", 

53 } 

54 

55 

56def test_inspect_number_field_value_rejects_malformed_thousands_separators(): 

57 inspection = udc_cli._inspect_number_field_value("10,74") 

58 

59 assert inspection == { 

60 "status": "invalid", 

61 "normalized": None, 

62 } 

63 

64 

65def test_inspect_number_field_value_flags_conflicting_localized_json(): 

66 inspection = udc_cli._inspect_number_field_value('{"en": "351", "fr": "352"}') 

67 

68 assert inspection == { 

69 "status": "invalid_localized", 

70 "normalized": None, 

71 } 

72 

73 

74def test_process_number_field_migration_dry_run_reports_without_mutating(): 

75 package = SimpleNamespace( 

76 id="pkg-1", 

77 name="housing-data", 

78 extras={"number_of_cells": '{"en": "351"}'}, 

79 ) 

80 messages = [] 

81 

82 stats = udc_cli._process_number_field_migration( 

83 [package], 

84 ["number_of_cells"], 

85 fix=False, 

86 echo=messages.append, 

87 ) 

88 

89 assert package.extras["number_of_cells"] == '{"en": "351"}' 

90 assert stats == { 

91 "packages_scanned": 1, 

92 "packages_with_issues": 1, 

93 "issues_found": 1, 

94 "fixable": 1, 

95 "fixed": 0, 

96 "invalid": 0, 

97 } 

98 assert messages == [ 

99 'Would fix package pkg-1 (housing-data) field "number_of_cells": \'{"en": "351"}\' -> \'351\'' 

100 ] 

101 

102 

103def test_process_number_field_migration_fix_updates_fixable_values(): 

104 package = SimpleNamespace( 

105 id="pkg-1", 

106 name="housing-data", 

107 extras={ 

108 "number_of_cells": '{"en": "351"}', 

109 "number_of_rows": "not-a-number", 

110 }, 

111 ) 

112 messages = [] 

113 

114 stats = udc_cli._process_number_field_migration( 

115 [package], 

116 ["number_of_cells", "number_of_rows"], 

117 fix=True, 

118 echo=messages.append, 

119 ) 

120 

121 assert package.extras["number_of_cells"] == "351" 

122 assert package.extras["number_of_rows"] == "not-a-number" 

123 assert stats == { 

124 "packages_scanned": 1, 

125 "packages_with_issues": 1, 

126 "issues_found": 2, 

127 "fixable": 1, 

128 "fixed": 1, 

129 "invalid": 1, 

130 } 

131 assert messages == [ 

132 'Fix package pkg-1 (housing-data) field "number_of_cells": \'{"en": "351"}\' -> \'351\'', 

133 'Invalid value on package pkg-1 (housing-data) field "number_of_rows": \'not-a-number\'', 

134 ] 

135 

136 

137def test_process_number_field_migration_fix_updates_scalar_values_with_thousands_separators(): 

138 package = SimpleNamespace( 

139 id="pkg-1", 

140 name="housing-data", 

141 extras={"number_of_cells": "10,556"}, 

142 ) 

143 messages = [] 

144 

145 stats = udc_cli._process_number_field_migration( 

146 [package], 

147 ["number_of_cells"], 

148 fix=True, 

149 echo=messages.append, 

150 ) 

151 

152 assert package.extras["number_of_cells"] == "10556" 

153 assert stats == { 

154 "packages_scanned": 1, 

155 "packages_with_issues": 1, 

156 "issues_found": 1, 

157 "fixable": 1, 

158 "fixed": 1, 

159 "invalid": 0, 

160 } 

161 assert messages == [ 

162 'Fix package pkg-1 (housing-data) field "number_of_cells": \'10,556\' -> \'10556\'' 

163 ] 

164 

165 

166def test_process_number_field_migration_includes_draft_packages_when_provided(): 

167 package = SimpleNamespace( 

168 id="pkg-draft-1", 

169 name="draft-housing-data", 

170 state="draft", 

171 extras={"number_of_cells": "254,238"}, 

172 ) 

173 messages = [] 

174 

175 stats = udc_cli._process_number_field_migration( 

176 [package], 

177 ["number_of_cells"], 

178 fix=True, 

179 echo=messages.append, 

180 ) 

181 

182 assert package.extras["number_of_cells"] == "254238" 

183 assert stats == { 

184 "packages_scanned": 1, 

185 "packages_with_issues": 1, 

186 "issues_found": 1, 

187 "fixable": 1, 

188 "fixed": 1, 

189 "invalid": 0, 

190 } 

191 assert messages == [ 

192 'Fix package pkg-draft-1 (draft-housing-data) field "number_of_cells": \'254,238\' -> \'254238\'' 

193 ]