test_mn3_apd.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. '''
  2. @author: olivier.massot, janv. 2019
  3. '''
  4. from core import mncheck
  5. import logging
  6. from qgis.core import QgsCoordinateReferenceSystem, QgsGeometry, QgsPointXY
  7. import re
  8. from core.checking import SUCCESS, FAILURE, ERROR
  9. from path import Path
  10. from schemas.mn3_apd import SiteTelecom, Zapbo
  11. from test._base import SchemaTest
  12. logger = logging.getLogger("mncheck")
  13. class Test(SchemaTest):
  14. SCHEMA_NAME = "mn3_apd"
  15. PROJECT_FILE = Path(__file__).parent / 'projects' / 'mn3_apd' / 'mn3_apd_valid.qgz'
  16. def setUp(self):
  17. SchemaTest.setUp(self)
  18. self.schema = mncheck.get_schema(self.SCHEMA_NAME)
  19. if not self.schema.checkers:
  20. raise AttributeError("Aucun testeur trouvé dans le schéma")
  21. self.checker = self.schema.checkers[0]()
  22. def run_test(self, test_name, dry=False):
  23. results = self.checker.run(test_name, dry)
  24. if len(results) == 0:
  25. raise Exception("No result for test")
  26. elif len(results) > 1:
  27. raise Exception("More than one result from test")
  28. return results[0]
  29. def assertSuccess(self, r):
  30. if not r.status == SUCCESS:
  31. raise AssertionError("Le test a échoué")
  32. def assertFailure(self, r):
  33. if not r.status == FAILURE:
  34. raise AssertionError("Le test n'aurait pas dû réussir")
  35. def assertError(self, r):
  36. if not r.status == ERROR:
  37. raise AssertionError("Le test n'a pas levé d'erreur")
  38. def assertErrorLogged(self, result, err_msg):
  39. if not any((re.fullmatch(err_msg, err.message) for err in result.errors)):
  40. print(result.errors)
  41. raise AssertionError("Error was not logged: {}".format(err_msg))
  42. def test_load_layers(self):
  43. # cas initial: valide
  44. r = self.run_test("test_load_layers")
  45. self.assertEqual(r.title, 'Chargement des données')
  46. self.assertSuccess(r)
  47. self.assertEqual(len(r.errors), 0)
  48. # une couche manquante et une pk manquante
  49. _pk_ini = self.schema.SiteTelecom.pk
  50. try:
  51. self.schema.SiteClient.layer = None
  52. self.schema.SiteTelecom.pk = "not_a_qgis_field"
  53. r = self.run_test("test_load_layers", True)
  54. self.assertFailure(r)
  55. self.assertErrorLogged(r, ".*Couche manquante.*")
  56. self.assertErrorLogged(r, ".*Clef primaire manquante.*")
  57. finally:
  58. self.schema.SiteTelecom.pk = _pk_ini
  59. def test_scr(self):
  60. # cas initial: valide
  61. r = self.run_test("test_scr")
  62. self.assertEqual(r.title, 'Contrôle des projections')
  63. self.assertSuccess(r)
  64. self.assertEqual(len(r.errors), 0)
  65. # mauvaise projection
  66. crs = QgsCoordinateReferenceSystem()
  67. crs.createFromSrid(4473)
  68. self.schema.SiteTelecom.layer.setCrs(crs)
  69. r = self.run_test("test_scr", True)
  70. self.assertFailure(r)
  71. self.assertErrorLogged(r, f"Mauvaise projection.*")
  72. def test_structure_sites_telecom(self):
  73. # cas initial: valide
  74. r = self.run_test("test_structure_sites_telecom")
  75. self.assertEqual(r.title, 'Structure des données: SiteTelecom')
  76. self.assertSuccess(r)
  77. self.assertEqual(len(r.errors), 0)
  78. # valeur non autorisée
  79. self.checker.sites_telecom[0].ST_NBPRISE = "abcd"
  80. r = self.run_test("test_structure_sites_telecom", True)
  81. self.assertFailure(r)
  82. def test_structure_sites_client(self):
  83. # cas initial: valide
  84. r = self.run_test("test_structure_sites_client")
  85. self.assertEqual(r.title, 'Structure des données: SiteClient')
  86. self.assertSuccess(r)
  87. self.assertEqual(len(r.errors), 0)
  88. # valeur non autorisée
  89. self.checker.sites_client[0].SC_TYPFON = "invalid"
  90. r = self.run_test("test_structure_sites_client", True)
  91. self.assertFailure(r)
  92. def test_structure_cables(self):
  93. # cas initial: valide
  94. r = self.run_test("test_structure_cables")
  95. self.assertEqual(r.title, 'Structure des données: Cables')
  96. self.assertSuccess(r)
  97. self.assertEqual(len(r.errors), 0)
  98. # valeur non autorisée
  99. self.checker.cables[0].CA_TYPFON = "invalid"
  100. r = self.run_test("test_structure_cables", True)
  101. self.assertFailure(r)
  102. def test_structure_zapbos(self):
  103. # cas initial: valide
  104. r = self.run_test("test_structure_zapbos")
  105. self.assertEqual(r.title, 'Structure des données: Zapbo')
  106. self.assertSuccess(r)
  107. self.assertEqual(len(r.errors), 0)
  108. # valeur non autorisée
  109. self.checker.zapbos[0].ZP_ISOLE = "2"
  110. r = self.run_test("test_structure_zapbos", True)
  111. self.assertFailure(r)
  112. def test_structure_zasros(self):
  113. # cas initial: valide
  114. r = self.run_test("test_structure_zasros")
  115. self.assertEqual(r.title, 'Structure des données: Zasro')
  116. self.assertSuccess(r)
  117. self.assertEqual(len(r.errors), 0)
  118. # valeur non autorisée
  119. self.checker.zasros[0].ZS_NBPRISE = "invalid"
  120. r = self.run_test("test_structure_zasros", True)
  121. self.assertFailure(r)
  122. def test_structure_adductions(self):
  123. # cas initial: valide
  124. r = self.run_test("test_structure_adductions")
  125. self.assertEqual(r.title, 'Structure des données: Adduction')
  126. self.assertSuccess(r)
  127. self.assertEqual(len(r.errors), 0)
  128. # valeur non autorisée
  129. self.checker.adductions[0].AD_LONG = "invalid"
  130. r = self.run_test("test_structure_adductions", True)
  131. self.assertFailure(r)
  132. def test_geometry_validity(self):
  133. # cas initial: valide
  134. r = self.run_test("test_geometry_validity")
  135. self.assertEqual(r.title, 'Contrôle de la validité des géométries')
  136. self.assertSuccess(r)
  137. self.assertEqual(len(r.errors), 0)
  138. # géométrie invalide
  139. self.checker.cables[0]._feature.setGeometry(QgsGeometry())
  140. r = self.run_test("test_geometry_validity", True)
  141. self.assertFailure(r)
  142. self.assertErrorLogged(r, "La géométrie de l'objet est invalide")
  143. def test_geometry_type(self):
  144. # cas initial: valide
  145. r = self.run_test("test_geometry_type")
  146. self.assertEqual(r.title, 'Contrôle des types de géométries')
  147. self.assertSuccess(r)
  148. self.assertEqual(len(r.errors), 0)
  149. # type de géométrie invalide
  150. self.checker.cables[0]._feature.setGeometry(QgsGeometry())
  151. r = self.run_test("test_geometry_type", True)
  152. self.assertFailure(r)
  153. self.assertErrorLogged(r, "Type de géométrie invalide.*")
  154. def test_bounding_box(self):
  155. # cas initial: valide
  156. r = self.run_test("test_bounding_box")
  157. self.assertEqual(r.title, 'Contrôle des emprises')
  158. self.assertSuccess(r)
  159. self.assertEqual(len(r.errors), 0)
  160. # hors de l'emprise
  161. self.checker.sites_client[0]._feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(0,0)))
  162. r = self.run_test("test_bounding_box", True)
  163. self.assertFailure(r)
  164. self.assertErrorLogged(r, "Hors de l'emprise autorisée")
  165. def test_duplicates(self):
  166. # cas initial: valide
  167. r = self.run_test("test_duplicates")
  168. self.assertEqual(r.title, 'Recherche de doublons')
  169. self.assertSuccess(r)
  170. self.assertEqual(len(r.errors), 0)
  171. new_ = SiteTelecom(self.checker.sites_telecom[0]._feature)
  172. new_.__dict__.update(self.checker.sites_telecom[0].__dict__)
  173. self.checker.sites_telecom.append(new_)
  174. r = self.run_test("test_duplicates", True)
  175. self.assertFailure(r)
  176. self.assertErrorLogged(r, "Doublons dans le champs ST_CODE")
  177. def test_dimension_zasro(self):
  178. # cas initial: valide
  179. r = self.run_test("test_dimension_zasro")
  180. self.assertEqual(r.title, 'Contrôle le dimensionnement des ZASRO')
  181. self.assertSuccess(r)
  182. self.assertEqual(len(r.errors), 0)
  183. self.checker.zasros[0].ZS_NBPRISE = 1000
  184. r = self.run_test("test_dimension_zasro", True)
  185. self.assertFailure(r)
  186. self.assertErrorLogged(r, "Le nombre de prises est supérieur à 850")
  187. def test_affaiblissement(self):
  188. # cas initial: valide
  189. r = self.run_test("test_affaiblissement")
  190. self.assertEqual(r.title, "Contrôle l'affaiblissement")
  191. self.assertSuccess(r)
  192. self.assertEqual(len(r.errors), 0)
  193. self.checker.sites_client[0].SC_ATT_PTO = 100
  194. r = self.run_test("test_affaiblissement", True)
  195. self.assertFailure(r)
  196. self.assertErrorLogged(r, "L'affaiblissement est supérieur à 28")
  197. def test_capacite_modulo(self):
  198. # cas initial: valide
  199. r = self.run_test("test_capacite_modulo")
  200. self.assertEqual(r.title, 'Cohérence capacité du cable / modulo')
  201. self.assertSuccess(r)
  202. self.assertEqual(len(r.errors), 0)
  203. self.checker.cables[0].CA_CAPFO = 24
  204. self.checker.cables[0].CA_MODULO = 12
  205. r = self.run_test("test_capacite_modulo", True)
  206. self.assertFailure(r)
  207. self.assertErrorLogged(r, "Modulo invalide.+")
  208. self.checker.cables[0].CA_CAPFO = 144
  209. self.checker.cables[0].CA_MODULO = 6
  210. r = self.run_test("test_capacite_modulo", True)
  211. self.assertFailure(r)
  212. self.assertErrorLogged(r, "Modulo invalide.+")
  213. def test_longueur_racco(self):
  214. # cas initial: valide
  215. r = self.run_test("test_longueur_racco")
  216. self.assertEqual(r.title, 'Contrôle la longueur des raccordements')
  217. self.assertSuccess(r)
  218. self.assertEqual(len(r.errors), 0)
  219. self.checker.adductions[0].AD_LONG = 10
  220. self.checker.adductions[0].AD_ISOLE = "1"
  221. r = self.run_test("test_longueur_racco", True)
  222. self.assertFailure(r)
  223. self.assertErrorLogged(r, "L'adduction ne devrait pas être consiudérée comme isolée.+")
  224. self.checker.adductions[0].AD_LONG = 1000
  225. self.checker.adductions[0].AD_ISOLE = "0"
  226. r = self.run_test("test_longueur_racco", True)
  227. self.assertFailure(r)
  228. self.assertErrorLogged(r, "L'adduction devrait être considérée comme isolée.+")
  229. def test_zapbos_prises(self):
  230. # cas initial: valide
  231. r = self.run_test("test_zapbos_prises")
  232. self.assertEqual(r.title, 'Topologie: Zapbos / Prises')
  233. self.assertSuccess(r)
  234. self.assertEqual(len(r.errors), 0)
  235. new_ = Zapbo(self.checker.zapbos[0]._feature)
  236. new_.__dict__.update(self.checker.zapbos[0].__dict__)
  237. self.checker.zapbos.append(new_)
  238. r = self.run_test("test_zapbos_prises", True)
  239. self.assertFailure(r)
  240. self.assertErrorLogged(r, "La prise est contenue dans plus d'une ZAPBO")
  241. new_geom = self.checker.sites_client[0]._feature.geometry()
  242. new_geom.translate(1000,1000)
  243. self.checker.sites_client[0]._feature.setGeometry(new_geom)
  244. r = self.run_test("test_zapbos_prises", True)
  245. self.assertFailure(r)
  246. self.assertErrorLogged(r, "La prise n'est contenue dans aucune ZAPBO")