test_mn1_rec.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  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. from core.checking import SUCCESS, FAILURE
  8. from path import Path
  9. from test._base import SchemaTest
  10. logger = logging.getLogger("mncheck")
  11. class Test(SchemaTest):
  12. SCHEMA_NAME = "mn1_rec"
  13. PROJECT_FILE = Path(__file__).parent / 'projects' / 'mn1_rec' / '1_valid' / '1_valid.qgz'
  14. def setUp(self):
  15. SchemaTest.setUp(self)
  16. self.schema = mncheck.get_schema(self.SCHEMA_NAME)
  17. if not self.schema.checkers:
  18. raise AttributeError("Aucun testeur trouvé dans le schéma")
  19. self.checker = self.schema.checkers[0]()
  20. def run_test(self, test_name, dry=False):
  21. results = self.checker.run(test_name, dry)
  22. if len(results) == 0:
  23. raise Exception("No result for test")
  24. elif len(results) > 1:
  25. raise Exception("More than one result from test")
  26. return results[0]
  27. def assertSuccess(self, r):
  28. if not r.status == SUCCESS:
  29. raise AssertionError("Le test a échoué")
  30. def assertFailure(self, r):
  31. if not r.status == FAILURE:
  32. raise AssertionError("Le test n'aurait pas dû réussir")
  33. def assertErrorLogged(self, result, err_msg):
  34. if not any((err.message == err_msg for err in result.errors)):
  35. raise AssertionError("Error was not logged: {}".format(err_msg))
  36. def test_load_layers(self):
  37. # cas initial: valide
  38. r = self.run_test("test_load_layers")
  39. self.assertEqual(r.title, 'Chargement des données')
  40. self.assertSuccess(r)
  41. self.assertEqual(len(r.errors), 0)
  42. # une couche manquante et une pk manquante
  43. _pk_ini = self.schema.Cable.pk
  44. try:
  45. self.schema.Artere.layer = None
  46. self.schema.Cable.pk = "not_a_qgis_field"
  47. r = self.run_test("test_load_layers", True)
  48. self.assertFailure(r)
  49. self.assertErrorLogged(r, "[CRITIQUE] Couche manquante")
  50. self.assertErrorLogged(r, "[CRITIQUE] Clef primaire manquante (not_a_qgis_field)")
  51. except:
  52. raise
  53. finally:
  54. self.schema.Cable.pk = _pk_ini
  55. def test_scr(self):
  56. # cas initial: valide
  57. r = self.run_test("test_scr")
  58. self.assertEqual(r.title, 'Contrôle des projections')
  59. self.assertSuccess(r)
  60. self.assertEqual(len(r.errors), 0)
  61. # mauvaise projection
  62. self.schema.Artere.layer.setCrs(QgsCoordinateReferenceSystem())
  63. r = self.run_test("test_scr", True)
  64. self.assertFailure(r)
  65. def test_structure_arteres(self):
  66. # cas initial: valide
  67. r = self.run_test("test_structure_arteres")
  68. self.assertEqual(r.title, 'Structure des données: Artères')
  69. self.assertSuccess(r)
  70. self.assertEqual(len(r.errors), 0)
  71. # valeur non autorisée
  72. self.checker.arteres[0].AR_ID_INSE = "invalid"
  73. r = self.run_test("test_structure_arteres", True)
  74. self.assertFailure(r)
  75. def test_structure_cables(self):
  76. # cas initial: valide
  77. r = self.run_test("test_structure_cables")
  78. self.assertEqual(r.title, 'Structure des données: Cables')
  79. self.assertSuccess(r)
  80. self.assertEqual(len(r.errors), 0)
  81. # valeur non autorisée
  82. self.checker.cables[0].CA_TYPE = "invalid"
  83. r = self.run_test("test_structure_cables", True)
  84. self.assertFailure(r)
  85. def test_structure_equipements(self):
  86. # cas initial: valide
  87. r = self.run_test("test_structure_equipements")
  88. self.assertEqual(r.title, 'Structure des données: Equipements')
  89. self.assertSuccess(r)
  90. self.assertEqual(len(r.errors), 0)
  91. # valeur non autorisée
  92. self.checker.equipements[0].EQ_TYPE = "invalid"
  93. r = self.run_test("test_structure_equipements", True)
  94. self.assertFailure(r)
  95. def test_structure_noeuds(self):
  96. # cas initial: valide
  97. r = self.run_test("test_structure_noeuds")
  98. self.assertEqual(r.title, 'Structure des données: Noeuds')
  99. self.assertSuccess(r)
  100. self.assertEqual(len(r.errors), 0)
  101. # valeur non autorisée
  102. self.checker.noeuds[0].NO_ID_INSE = "invalid"
  103. r = self.run_test("test_structure_noeuds", True)
  104. self.assertFailure(r)
  105. def test_structure_tranchees(self):
  106. # cas initial: valide
  107. r = self.run_test("test_structure_tranchees")
  108. self.assertEqual(r.title, 'Structure des données: Tranchées')
  109. self.assertSuccess(r)
  110. self.assertEqual(len(r.errors), 0)
  111. # valeur non autorisée
  112. self.checker.tranchees[0].TR_REVET = "invalid"
  113. r = self.run_test("test_structure_tranchees", True)
  114. self.assertFailure(r)
  115. def test_structure_zapbos(self):
  116. # cas initial: valide
  117. r = self.run_test("test_structure_zapbos")
  118. self.assertEqual(r.title, 'Structure des données: Zapbos')
  119. self.assertSuccess(r)
  120. self.assertEqual(len(r.errors), 0)
  121. # valeur non autorisée
  122. self.checker.zapbos[0].STATUT = "invalid"
  123. r = self.run_test("test_structure_zapbos", True)
  124. self.assertFailure(r)
  125. def test_geometry_validity(self):
  126. # cas initial: valide
  127. r = self.run_test("test_geometry_validity")
  128. self.assertEqual(r.title, 'Contrôle de la validité des géométries')
  129. self.assertSuccess(r)
  130. self.assertEqual(len(r.errors), 0)
  131. # géométrie invalide
  132. self.checker.arteres[0]._feature.setGeometry(QgsGeometry())
  133. r = self.run_test("test_geometry_validity", True)
  134. self.assertFailure(r)
  135. def test_geometry_type(self):
  136. # cas initial: valide
  137. r = self.run_test("test_geometry_type")
  138. self.assertEqual(r.title, 'Contrôle des types de géométries')
  139. self.assertSuccess(r)
  140. self.assertEqual(len(r.errors), 0)
  141. # type de géométrie invalide
  142. self.checker.arteres[0]._feature.setGeometry(QgsGeometry())
  143. r = self.run_test("test_geometry_type", True)
  144. self.assertFailure(r)
  145. def test_bounding_box(self):
  146. # cas initial: valide
  147. r = self.run_test("test_bounding_box")
  148. self.assertEqual(r.title, 'Contrôle des emprises')
  149. self.assertSuccess(r)
  150. self.assertEqual(len(r.errors), 0)
  151. # hors de l'emprise
  152. self.checker.noeuds[0]._feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(0,0)))
  153. r = self.run_test("test_bounding_box", True)
  154. self.assertFailure(r)
  155. def test_duplicates(self):
  156. # cas initial: valide
  157. r = self.run_test("test_duplicates")
  158. self.assertEqual(r.title, 'Recherche de doublons')
  159. self.assertSuccess(r)
  160. self.assertEqual(len(r.errors), 0)
  161. # cas de doublon
  162. self.checker.noeuds[0].NO_NOM = self.checker.noeuds[1].NO_NOM
  163. r = self.run_test("test_duplicates", True)
  164. self.assertFailure(r)
  165. def test_constraints_arteres_noeuds(self):
  166. # cas initial: valide
  167. r = self.run_test("test_constraints_arteres_noeuds")
  168. self.assertEqual(r.title, 'Application des contraintes: Artères / Noeuds')
  169. self.assertSuccess(r)
  170. self.assertEqual(len(r.errors), 0)
  171. # contrainte invalide
  172. self.checker.arteres[0].noeud_a = None
  173. r = self.run_test("test_constraints_arteres_noeuds", True)
  174. self.assertFailure(r)
  175. def test_constraints_cables_equipements(self):
  176. # cas initial: valide
  177. r = self.run_test("test_constraints_cables_equipements")
  178. self.assertEqual(r.title, 'Application des contraintes: Equipements / Cables')
  179. self.assertSuccess(r)
  180. self.assertEqual(len(r.errors), 0)
  181. # contrainte invalide
  182. self.checker.cables[0].equipement_a = None
  183. r = self.run_test("test_constraints_cables_equipements", True)
  184. self.assertFailure(r)
  185. def test_constraints_cables_equipements_b(self):
  186. # cas initial: valide
  187. r = self.run_test("test_constraints_cables_equipements_b")
  188. self.assertEqual(r.title, 'Application des contraintes: Equipements B')
  189. self.assertSuccess(r)
  190. self.assertEqual(len(r.errors), 0)
  191. # contrainte invalide
  192. for cable in self.checker.cables:
  193. cable.CA_EQ_B = ""
  194. r = self.run_test("test_constraints_cables_equipements_b", True)
  195. self.assertFailure(r)
  196. def test_constraints_equipements_noeuds(self):
  197. # cas initial: valide
  198. r = self.run_test("test_constraints_equipements_noeuds")
  199. self.assertEqual(r.title, 'Application des contraintes: Noeuds / Equipements')
  200. self.assertSuccess(r)
  201. self.assertEqual(len(r.errors), 0)
  202. # contrainte invalide
  203. self.checker.equipements[0].noeud = None
  204. r = self.run_test("test_constraints_equipements_noeuds", True)
  205. self.assertFailure(r)
  206. def test_graphic_duplicates(self):
  207. # cas initial: valide
  208. r = self.run_test("test_graphic_duplicates")
  209. self.assertEqual(r.title, 'Recherche de doublons graphiques')
  210. self.assertSuccess(r)
  211. self.assertEqual(len(r.errors), 0)
  212. # doublon graphique
  213. self.checker.noeuds[0]._feature.setGeometry(self.checker.noeuds[1]._feature.geometry())
  214. r = self.run_test("test_graphic_duplicates", True)
  215. self.assertFailure(r)
  216. def test_positions_noeuds(self):
  217. # cas initial: valide
  218. r = self.run_test("test_positions_noeuds")
  219. self.assertEqual(r.title, 'Topologie: Noeuds / Artères')
  220. self.assertSuccess(r)
  221. self.assertEqual(len(r.errors), 0)
  222. # erreur topo
  223. self.checker.noeuds[0]._feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(0,0)))
  224. r = self.run_test("test_positions_noeuds", True)
  225. self.assertFailure(r)
  226. def test_positions_equipements(self):
  227. # cas initial: valide
  228. r = self.run_test("test_positions_equipements")
  229. self.assertEqual(r.title, 'Topologie: Equipements / Cables')
  230. self.assertSuccess(r)
  231. self.assertEqual(len(r.errors), 0)
  232. # erreur topo
  233. self.checker.cables[0].equipement_b.noeud._feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(0,0)))
  234. r = self.run_test("test_positions_equipements", True)
  235. self.assertFailure(r)
  236. def test_tranchee_artere(self):
  237. # cas initial: valide
  238. r = self.run_test("test_tranchee_artere")
  239. self.assertEqual(r.title, 'Topologie: Tranchées / Artères')
  240. self.assertSuccess(r)
  241. self.assertEqual(len(r.errors), 0)
  242. # erreur topo
  243. new_geom = self.checker.tranchees[0]._feature.geometry()
  244. new_geom.translate(10000, 10000)
  245. self.checker.tranchees[0]._feature.setGeometry(new_geom)
  246. r = self.run_test("test_tranchee_artere", True)
  247. self.assertFailure(r)
  248. def test_cable_artere(self):
  249. # cas initial: valide
  250. r = self.run_test("test_cable_artere")
  251. self.assertEqual(r.title, 'Topologie: Cables / Artères')
  252. self.assertSuccess(r)
  253. self.assertEqual(len(r.errors), 0)
  254. # erreur topo
  255. self.checker.cables[0].CA_COMMENT = ""
  256. new_geom = self.checker.cables[0]._feature.geometry()
  257. new_geom.translate(10000, 10000)
  258. self.checker.cables[0]._feature.setGeometry(new_geom)
  259. r = self.run_test("test_cable_artere", True)
  260. self.assertFailure(r)
  261. def test_artere_cable(self):
  262. # cas initial: valide
  263. r = self.run_test("test_artere_cable")
  264. self.assertEqual(r.title, 'Topologie: Artères / Cables')
  265. self.assertSuccess(r)
  266. self.assertEqual(len(r.errors), 0)
  267. # erreur topo
  268. self.checker.arteres[0].AR_COMMENT = ""
  269. new_geom = self.checker.arteres[0]._feature.geometry()
  270. new_geom.translate(10000, 10000)
  271. self.checker.arteres[0]._feature.setGeometry(new_geom)
  272. r = self.run_test("test_artere_cable", True)
  273. self.assertFailure(r)
  274. def test_dimensions_fourreaux(self):
  275. # cas initial: valide
  276. r = self.run_test("test_dimensions_fourreaux")
  277. self.assertEqual(r.title, 'Dimensions logiques: fourreaux')
  278. self.assertSuccess(r)
  279. self.assertEqual(len(r.errors), 0)
  280. # nombre de fourreaux incohérent
  281. self.checker.arteres[0].AR_FOU_DIS = 1000
  282. r = self.run_test("test_dimensions_fourreaux", True)
  283. self.assertFailure(r)
  284. self.checker.arteres[0].AR_FOU_DIS = 0
  285. # nombre de fourreaux incohérent
  286. self.checker.cables[0].CA_NB_FO_U = 1000
  287. r = self.run_test("test_dimensions_fourreaux", True)
  288. self.assertFailure(r)
  289. self.checker.cables[0].CA_NB_FO_U = 0
  290. # nombre de fourreaux incohérent
  291. self.checker.cables[0].CA_NB_FO_D = 1000
  292. r = self.run_test("test_dimensions_fourreaux", True)
  293. self.assertFailure(r)
  294. def test_pbos(self):
  295. # cas initial: valide
  296. r = self.run_test("test_pbos")
  297. self.assertEqual(r.title, 'Topologie: PBO / ZAPBO')
  298. self.assertSuccess(r)
  299. self.assertEqual(len(r.errors), 0)
  300. # equipement hors zapbo
  301. _ini_geom = self.checker.equipements[0]._feature.geometry()
  302. self.checker.equipements[0]._feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(0,0)))
  303. r = self.run_test("test_pbos", True)
  304. self.assertFailure(r)
  305. self.checker.equipements[0]._feature.setGeometry(_ini_geom)
  306. # noms equipement / zapbo incoherents
  307. self.checker.equipements[0].EQ_NOM = "%__#123456789#__%"
  308. r = self.run_test("test_pbos", True)
  309. self.assertFailure(r)