test_mn3_apd.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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 test._base import SchemaTest
  11. logger = logging.getLogger("mncheck")
  12. class Test(SchemaTest):
  13. SCHEMA_NAME = "mn3_apd"
  14. PROJECT_FILE = Path(__file__).parent / 'projects' / 'mn3_apd' / '1_valid' / '1_valid.qgz'
  15. def setUp(self):
  16. SchemaTest.setUp(self)
  17. self.schema = mncheck.get_schema(self.SCHEMA_NAME)
  18. if not self.schema.checkers:
  19. raise AttributeError("Aucun testeur trouvé dans le schéma")
  20. self.checker = self.schema.checkers[0]()
  21. def run_test(self, test_name, dry=False):
  22. results = self.checker.run(test_name, dry)
  23. if len(results) == 0:
  24. raise Exception("No result for test")
  25. elif len(results) > 1:
  26. raise Exception("More than one result from test")
  27. return results[0]
  28. def assertSuccess(self, r):
  29. if not r.status == SUCCESS:
  30. raise AssertionError("Le test a échoué")
  31. def assertFailure(self, r):
  32. if not r.status == FAILURE:
  33. raise AssertionError("Le test n'aurait pas dû réussir")
  34. def assertError(self, r):
  35. if not r.status == ERROR:
  36. raise AssertionError("Le test n'a pas levé d'erreur")
  37. def assertErrorLogged(self, result, err_msg):
  38. if not any((re.fullmatch(err_msg, err.message) for err in result.errors)):
  39. print(result.errors)
  40. raise AssertionError("Error was not logged: {}".format(err_msg))
  41. def test_load_layers(self):
  42. # cas initial: valide
  43. r = self.run_test("test_load_layers")
  44. self.assertEqual(r.title, 'Chargement des données')
  45. self.assertSuccess(r)
  46. self.assertEqual(len(r.errors), 0)
  47. # une couche manquante et une pk manquante
  48. _pk_ini = self.schema.SiteTelecom.pk
  49. try:
  50. self.schema.SiteClient.layer = None
  51. self.schema.SiteTelecom.pk = "not_a_qgis_field"
  52. r = self.run_test("test_load_layers", True)
  53. self.assertFailure(r)
  54. self.assertErrorLogged(r, ".*Couche manquante.*")
  55. self.assertErrorLogged(r, ".*Clef primaire manquante.*")
  56. finally:
  57. self.schema.SiteTelecom.pk = _pk_ini
  58. def test_scr(self):
  59. # cas initial: valide
  60. r = self.run_test("test_scr")
  61. self.assertEqual(r.title, 'Contrôle des projections')
  62. self.assertSuccess(r)
  63. self.assertEqual(len(r.errors), 0)
  64. # mauvaise projection
  65. crs = QgsCoordinateReferenceSystem()
  66. crs.createFromSrid(4473)
  67. self.schema.SiteTelecom.layer.setCrs(crs)
  68. r = self.run_test("test_scr", True)
  69. self.assertFailure(r)
  70. self.assertErrorLogged(r, f"Mauvaise projection.*")
  71. def test_structure_sites_telecom(self):
  72. # cas initial: valide
  73. r = self.run_test("test_structure_sites_telecom")
  74. self.assertEqual(r.title, 'Structure des données: Sites Telecom')
  75. self.assertSuccess(r)
  76. self.assertEqual(len(r.errors), 0)
  77. # valeur non autorisée
  78. self.checker.sites_telecom[0].ST_NBPRISE = "abcd"
  79. r = self.run_test("test_structure_sites_telecom", True)
  80. self.assertFailure(r)
  81. def test_structure_sites_client(self):
  82. # cas initial: valide
  83. r = self.run_test("test_structure_sites_client")
  84. self.assertEqual(r.title, 'Structure des données: Sites Clients')
  85. self.assertSuccess(r)
  86. self.assertEqual(len(r.errors), 0)
  87. # valeur non autorisée
  88. self.checker.sites_client[0].SC_TYPFON = "invalid"
  89. r = self.run_test("test_structure_sites_client", True)
  90. self.assertFailure(r)
  91. def test_structure_cables(self):
  92. # cas initial: valide
  93. r = self.run_test("test_structure_cables")
  94. self.assertEqual(r.title, 'Structure des données: Cables')
  95. self.assertSuccess(r)
  96. self.assertEqual(len(r.errors), 0)
  97. # valeur non autorisée
  98. self.checker.cables[0].CA_TYPFON = "invalid"
  99. r = self.run_test("test_structure_cables", True)
  100. self.assertFailure(r)
  101. def test_structure_zapbos(self):
  102. # cas initial: valide
  103. r = self.run_test("test_structure_zapbos")
  104. self.assertEqual(r.title, 'Structure des données: Zapbos')
  105. self.assertSuccess(r)
  106. self.assertEqual(len(r.errors), 0)
  107. # valeur non autorisée
  108. self.checker.zapbos[0].ZP_ISOLE = "2"
  109. r = self.run_test("test_structure_zapbos", True)
  110. self.assertFailure(r)
  111. def test_structure_zasros(self):
  112. # cas initial: valide
  113. r = self.run_test("test_structure_zasros")
  114. self.assertEqual(r.title, 'Structure des données: Zasros')
  115. self.assertSuccess(r)
  116. self.assertEqual(len(r.errors), 0)
  117. # valeur non autorisée
  118. self.checker.zasros[0].ZS_NBPRISE = "invalid"
  119. r = self.run_test("test_structure_zasros", True)
  120. self.assertFailure(r)
  121. def test_structure_adductions(self):
  122. # cas initial: valide
  123. r = self.run_test("test_structure_adductions")
  124. self.assertEqual(r.title, 'Structure des données: Adduction')
  125. self.assertSuccess(r)
  126. self.assertEqual(len(r.errors), 0)
  127. # valeur non autorisée
  128. self.checker.adductions[0].AD_LONG = "invalid"
  129. r = self.run_test("test_structure_adductions", True)
  130. self.assertFailure(r)
  131. def test_geometry_validity(self):
  132. # cas initial: valide
  133. r = self.run_test("test_geometry_validity")
  134. self.assertEqual(r.title, 'Contrôle de la validité des géométries')
  135. self.assertSuccess(r)
  136. self.assertEqual(len(r.errors), 0)
  137. # géométrie invalide
  138. self.checker.arteres[0]._feature.setGeometry(QgsGeometry())
  139. r = self.run_test("test_geometry_validity", True)
  140. self.assertFailure(r)
  141. self.assertErrorLogged(r, "La géométrie de l'objet est invalide")
  142. def test_geometry_type(self):
  143. # cas initial: valide
  144. r = self.run_test("test_geometry_type")
  145. self.assertEqual(r.title, 'Contrôle des types de géométries')
  146. self.assertSuccess(r)
  147. self.assertEqual(len(r.errors), 0)
  148. # type de géométrie invalide
  149. self.checker.arteres[0]._feature.setGeometry(QgsGeometry())
  150. r = self.run_test("test_geometry_type", True)
  151. self.assertFailure(r)
  152. self.assertErrorLogged(r, "Type de géométrie invalide.*")
  153. def test_bounding_box(self):
  154. # cas initial: valide
  155. r = self.run_test("test_bounding_box")
  156. self.assertEqual(r.title, 'Contrôle des emprises')
  157. self.assertSuccess(r)
  158. self.assertEqual(len(r.errors), 0)
  159. # hors de l'emprise
  160. self.checker.noeuds[0]._feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(0,0)))
  161. r = self.run_test("test_bounding_box", True)
  162. self.assertFailure(r)
  163. self.assertErrorLogged(r, "Hors de l'emprise autorisée")
  164. def test_duplicates(self):
  165. pass
  166. def test_dimension_zasro(self):
  167. pass
  168. def test_affaiblissement(self):
  169. pass
  170. def test_capacite_modulo(self):
  171. pass
  172. def test_longueur_racco(self):
  173. pass
  174. def test_zapbos_prises(self):
  175. pass