@hestia-earth/data-validation 0.37.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/.coveragerc +14 -0
  2. package/.dockerignore +19 -0
  3. package/.eslintignore +17 -0
  4. package/.eslintrc.js +11 -0
  5. package/.flake8 +5 -0
  6. package/.gitlab/issue_templates/new validation.md +82 -0
  7. package/.gitlab-ci.yml +216 -0
  8. package/.readthedocs.yml +24 -0
  9. package/CODEOWNERS +11 -0
  10. package/Dockerfile +13 -0
  11. package/LICENSE +21 -0
  12. package/MANIFEST.in +2 -0
  13. package/bin/hestia-validate-data +80 -0
  14. package/build_mocking.py +14 -0
  15. package/commitlint.config.js +1 -0
  16. package/docs/Makefile +20 -0
  17. package/docs/_static/styles.css +4 -0
  18. package/docs/_templates/custom-class-template.rst +34 -0
  19. package/docs/_templates/custom-module-template.rst +66 -0
  20. package/docs/_templates/layout.html +4 -0
  21. package/docs/conf.py +74 -0
  22. package/docs/index.rst +42 -0
  23. package/docs/make.bat +35 -0
  24. package/docs/requirements.txt +13 -0
  25. package/envs/.develop.env +1 -0
  26. package/envs/.master.env +1 -0
  27. package/guide-assets/.gitkeep +0 -0
  28. package/hestia_earth/validation/README.md +5 -0
  29. package/hestia_earth/validation/__init__.py +32 -0
  30. package/hestia_earth/validation/distribution.py +22 -0
  31. package/hestia_earth/validation/gee.py +162 -0
  32. package/hestia_earth/validation/log.py +44 -0
  33. package/hestia_earth/validation/models.py +141 -0
  34. package/hestia_earth/validation/preload_requests.py +61 -0
  35. package/hestia_earth/validation/terms.py +88 -0
  36. package/hestia_earth/validation/utils.py +444 -0
  37. package/hestia_earth/validation/validators/__init__.py +141 -0
  38. package/hestia_earth/validation/validators/aggregated_cycle.py +32 -0
  39. package/hestia_earth/validation/validators/aggregated_shared.py +37 -0
  40. package/hestia_earth/validation/validators/animal.py +88 -0
  41. package/hestia_earth/validation/validators/completeness.py +252 -0
  42. package/hestia_earth/validation/validators/cycle.py +1123 -0
  43. package/hestia_earth/validation/validators/distribution.py +86 -0
  44. package/hestia_earth/validation/validators/emission.py +109 -0
  45. package/hestia_earth/validation/validators/impact_assessment.py +138 -0
  46. package/hestia_earth/validation/validators/indicator.py +154 -0
  47. package/hestia_earth/validation/validators/infrastructure.py +25 -0
  48. package/hestia_earth/validation/validators/input.py +268 -0
  49. package/hestia_earth/validation/validators/management.py +131 -0
  50. package/hestia_earth/validation/validators/measurement.py +368 -0
  51. package/hestia_earth/validation/validators/organisation.py +43 -0
  52. package/hestia_earth/validation/validators/practice.py +590 -0
  53. package/hestia_earth/validation/validators/product.py +263 -0
  54. package/hestia_earth/validation/validators/property.py +266 -0
  55. package/hestia_earth/validation/validators/shared.py +940 -0
  56. package/hestia_earth/validation/validators/site.py +312 -0
  57. package/hestia_earth/validation/validators/source.py +20 -0
  58. package/hestia_earth/validation/validators/transformation.py +250 -0
  59. package/hestia_earth/validation/version.py +1 -0
  60. package/layer/build.sh +34 -0
  61. package/layer/deploy.sh +18 -0
  62. package/package.json +59 -0
  63. package/release.sh +11 -0
  64. package/requirements-ci.txt +6 -0
  65. package/requirements-test.txt +4 -0
  66. package/requirements.txt +2 -0
  67. package/run-docker-test.sh +7 -0
  68. package/run-docker.sh +9 -0
  69. package/run.py +99 -0
  70. package/scripts/build_docs.py +283 -0
  71. package/scripts/build_validation_list.py +160 -0
  72. package/scripts/guide-create-branch.sh +15 -0
  73. package/scripts/update-package-version.js +28 -0
  74. package/search-results.json +384 -0
  75. package/setup.cfg +2 -0
  76. package/setup.py +35 -0
  77. package/src/index.ts +1 -0
  78. package/src/validations.ts +22 -0
  79. package/src/version.ts +1 -0
  80. package/tests/Dockerfile +13 -0
  81. package/tests/__init__.py +3 -0
  82. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-no-impactAssessment.json +64 -0
  83. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-world.json +69 -0
  84. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/valid.json +69 -0
  85. package/tests/fixtures/animal/duplicated-input-cycle/invalid.json +98 -0
  86. package/tests/fixtures/animal/duplicated-input-cycle/valid.json +91 -0
  87. package/tests/fixtures/animal/pregnancyRateTotal/invalid.json +49 -0
  88. package/tests/fixtures/animal/pregnancyRateTotal/valid.json +60 -0
  89. package/tests/fixtures/animal/required/invalid.json +59 -0
  90. package/tests/fixtures/animal/required/valid.json +72 -0
  91. package/tests/fixtures/completeness/all-values/warning.json +22 -0
  92. package/tests/fixtures/completeness/animalPopulation/invalid.json +58 -0
  93. package/tests/fixtures/completeness/animalPopulation/valid-animals.json +71 -0
  94. package/tests/fixtures/completeness/animalPopulation/valid-incomplete.json +58 -0
  95. package/tests/fixtures/completeness/animalPopulation/valid-no-liveAnimals.json +37 -0
  96. package/tests/fixtures/completeness/blank-nodes/agri-food processor-invalid.json +52 -0
  97. package/tests/fixtures/completeness/blank-nodes/invalid.json +124 -0
  98. package/tests/fixtures/completeness/blank-nodes/valid.json +128 -0
  99. package/tests/fixtures/completeness/cropland/site.json +16 -0
  100. package/tests/fixtures/completeness/cropland/valid.json +22 -0
  101. package/tests/fixtures/completeness/cropland/warning.json +22 -0
  102. package/tests/fixtures/completeness/freshForage/error-animals.json +63 -0
  103. package/tests/fixtures/completeness/freshForage/error-products.json +65 -0
  104. package/tests/fixtures/completeness/freshForage/valid-animal-inputs.json +63 -0
  105. package/tests/fixtures/completeness/freshForage/valid-animals.json +63 -0
  106. package/tests/fixtures/completeness/freshForage/valid-not-grazing-liveAnimal.json +55 -0
  107. package/tests/fixtures/completeness/freshForage/valid-not-liveAnimal.json +47 -0
  108. package/tests/fixtures/completeness/freshForage/valid-products.json +68 -0
  109. package/tests/fixtures/completeness/ingredient/invalid-agri-food-processor.json +37 -0
  110. package/tests/fixtures/completeness/ingredient/invalid.json +49 -0
  111. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-complete.json +49 -0
  112. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-incomplete.json +37 -0
  113. package/tests/fixtures/completeness/ingredient/valid.json +49 -0
  114. package/tests/fixtures/completeness/material/error.json +49 -0
  115. package/tests/fixtures/completeness/material/valid-fuel-material.json +60 -0
  116. package/tests/fixtures/completeness/material/valid-incomplete.json +36 -0
  117. package/tests/fixtures/completeness/material/valid-no-fuel.json +36 -0
  118. package/tests/fixtures/completeness/valid.json +22 -0
  119. package/tests/fixtures/cycle/aboveGroundCropResidue/invalid.json +76 -0
  120. package/tests/fixtures/cycle/aboveGroundCropResidue/valid.json +76 -0
  121. package/tests/fixtures/cycle/aggregated-valid.json +102 -0
  122. package/tests/fixtures/cycle/coverCrop/invalid.json +64 -0
  123. package/tests/fixtures/cycle/coverCrop/valid-not-coverCrop.json +54 -0
  124. package/tests/fixtures/cycle/coverCrop/valid.json +64 -0
  125. package/tests/fixtures/cycle/cropResidue/complete/invalid.json +56 -0
  126. package/tests/fixtures/cycle/cropResidue/complete/valid.json +82 -0
  127. package/tests/fixtures/cycle/cropResidue/incomplete/invalid.json +42 -0
  128. package/tests/fixtures/cycle/cropResidue/incomplete/valid.json +56 -0
  129. package/tests/fixtures/cycle/dates/invalid-emissions.json +70 -0
  130. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/invalid.json +63 -0
  131. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/valid.json +63 -0
  132. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates-year-only.json +48 -0
  133. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates.json +48 -0
  134. package/tests/fixtures/cycle/maximumCycleDuration/invalid.json +48 -0
  135. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates-year-only.json +48 -0
  136. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates.json +48 -0
  137. package/tests/fixtures/cycle/maximumCycleDuration/valid.json +48 -0
  138. package/tests/fixtures/cycle/otherSites/cycleDuration/invalid.json +52 -0
  139. package/tests/fixtures/cycle/otherSites/cycleDuration/valid-no-siteDuration.json +40 -0
  140. package/tests/fixtures/cycle/otherSites/cycleDuration/valid.json +52 -0
  141. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/invalid.json +56 -0
  142. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/valid.json +65 -0
  143. package/tests/fixtures/cycle/primary-product-as-input/invalid.json +59 -0
  144. package/tests/fixtures/cycle/primary-product-as-input/valid.json +48 -0
  145. package/tests/fixtures/cycle/product-linked-ia/cycle.json +66 -0
  146. package/tests/fixtures/cycle/product-linked-ia/invalid-multiple.json +58 -0
  147. package/tests/fixtures/cycle/product-linked-ia/valid.json +57 -0
  148. package/tests/fixtures/cycle/products/animals/invalid.json +69 -0
  149. package/tests/fixtures/cycle/products/animals/valid.json +58 -0
  150. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/invalid.json +53 -0
  151. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/valid.json +53 -0
  152. package/tests/fixtures/cycle/siteDuration/crop/invalid.json +53 -0
  153. package/tests/fixtures/cycle/siteDuration/crop/valid-different-duration.json +53 -0
  154. package/tests/fixtures/cycle/siteDuration/crop/valid-same-duration.json +53 -0
  155. package/tests/fixtures/cycle/siteDuration/invalid.json +41 -0
  156. package/tests/fixtures/cycle/siteDuration/valid-no-siteDuration.json +40 -0
  157. package/tests/fixtures/cycle/siteDuration/valid-otherSites.json +48 -0
  158. package/tests/fixtures/cycle/siteDuration/valid.json +45 -0
  159. package/tests/fixtures/cycle/substrate/required/invalid.json +50 -0
  160. package/tests/fixtures/cycle/substrate/required/valid.json +60 -0
  161. package/tests/fixtures/cycle/valid.json +343 -0
  162. package/tests/fixtures/emission/linked-terms/inputs/invalid.json +78 -0
  163. package/tests/fixtures/emission/linked-terms/inputs/valid.json +106 -0
  164. package/tests/fixtures/emission/linked-terms/transformation/error.json +104 -0
  165. package/tests/fixtures/emission/linked-terms/transformation/valid.json +107 -0
  166. package/tests/fixtures/emission/linked-terms/transformation/warning.json +76 -0
  167. package/tests/fixtures/emission/methodTier-background/invalid.json +60 -0
  168. package/tests/fixtures/emission/methodTier-background/valid.json +60 -0
  169. package/tests/fixtures/emission/not-relevant/invalid.json +71 -0
  170. package/tests/fixtures/emission/not-relevant/valid.json +95 -0
  171. package/tests/fixtures/emission/not-relevant-methodTier/invalid.json +70 -0
  172. package/tests/fixtures/emission/not-relevant-methodTier/valid.json +95 -0
  173. package/tests/fixtures/impactAssessment/aggregated-valid.json +43 -0
  174. package/tests/fixtures/impactAssessment/cycle-contains-product/invalid.json +34 -0
  175. package/tests/fixtures/impactAssessment/cycle-contains-product/valid.json +34 -0
  176. package/tests/fixtures/impactAssessment/cycle-endDate/invalid.json +26 -0
  177. package/tests/fixtures/impactAssessment/cycle-endDate/valid.json +26 -0
  178. package/tests/fixtures/impactAssessment/valid.json +93 -0
  179. package/tests/fixtures/indicator/characterisedIndicator-methodModel/invalid.json +52 -0
  180. package/tests/fixtures/indicator/characterisedIndicator-methodModel/valid.json +52 -0
  181. package/tests/fixtures/indicator/ionisingCompounds/invalid.json +23 -0
  182. package/tests/fixtures/indicator/ionisingCompounds/valid.json +23 -0
  183. package/tests/fixtures/indicator/landTransformation/invalid-grouped.json +257 -0
  184. package/tests/fixtures/indicator/landTransformation/invalid.json +100 -0
  185. package/tests/fixtures/indicator/landTransformation/valid-grouped-full.json +507 -0
  186. package/tests/fixtures/indicator/landTransformation/valid-grouped.json +507 -0
  187. package/tests/fixtures/indicator/landTransformation/valid.json +100 -0
  188. package/tests/fixtures/infrastructure/lifespan/invalid.json +26 -0
  189. package/tests/fixtures/infrastructure/lifespan/valid.json +45 -0
  190. package/tests/fixtures/input/animalFeed-fate/invalid.json +103 -0
  191. package/tests/fixtures/input/animalFeed-fate/valid.json +90 -0
  192. package/tests/fixtures/input/country/invalid.json +64 -0
  193. package/tests/fixtures/input/country/valid.json +64 -0
  194. package/tests/fixtures/input/distribution/animalHousing.json +103 -0
  195. package/tests/fixtures/input/distribution/complete/invalid.json +177 -0
  196. package/tests/fixtures/input/distribution/complete/valid.json +163 -0
  197. package/tests/fixtures/input/distribution/incomplete/valid.json +139 -0
  198. package/tests/fixtures/input/impactAssessment/invalid.json +99 -0
  199. package/tests/fixtures/input/impactAssessment/valid.json +89 -0
  200. package/tests/fixtures/input/input-as-product/invalid.json +57 -0
  201. package/tests/fixtures/input/input-as-product/valid.json +59 -0
  202. package/tests/fixtures/input/mustIncludeId/invalid.json +13 -0
  203. package/tests/fixtures/input/mustIncludeId/valid-multiple-ids.json +31 -0
  204. package/tests/fixtures/input/mustIncludeId/valid.json +22 -0
  205. package/tests/fixtures/input/saplings/invalid.json +58 -0
  206. package/tests/fixtures/input/saplings/valid-no-saplings.json +58 -0
  207. package/tests/fixtures/input/saplings/valid-not-plantation.json +58 -0
  208. package/tests/fixtures/input/saplings/valid.json +58 -0
  209. package/tests/fixtures/integration/distribution/product-yield-invalid.json +54 -0
  210. package/tests/fixtures/management/cycle-overlap/cycles.json +39 -0
  211. package/tests/fixtures/management/cycle-overlap/invalid.json +26 -0
  212. package/tests/fixtures/management/cycle-overlap/valid.json +26 -0
  213. package/tests/fixtures/management/exists/invalid.json +13 -0
  214. package/tests/fixtures/management/exists/valid.json +25 -0
  215. package/tests/fixtures/management/fallow-dates/invalid.json +24 -0
  216. package/tests/fixtures/management/fallow-dates/valid.json +24 -0
  217. package/tests/fixtures/management/termType/invalid-cropland.json +35 -0
  218. package/tests/fixtures/management/termType/invalid-permanent-pasture.json +25 -0
  219. package/tests/fixtures/management/termType/valid-cropland.json +55 -0
  220. package/tests/fixtures/management/termType/valid-no-management.json +13 -0
  221. package/tests/fixtures/management/termType/valid-permanent-pasture.json +35 -0
  222. package/tests/fixtures/measurement/depths/invalid.json +44 -0
  223. package/tests/fixtures/measurement/depths/valid.json +50 -0
  224. package/tests/fixtures/measurement/models/valid.json +33 -0
  225. package/tests/fixtures/measurement/models/warning-no-value.json +30 -0
  226. package/tests/fixtures/measurement/models/warning.json +33 -0
  227. package/tests/fixtures/measurement/pond-measurements/invalid.json +11 -0
  228. package/tests/fixtures/measurement/pond-measurements/valid.json +23 -0
  229. package/tests/fixtures/measurement/required-depths/error.json +71 -0
  230. package/tests/fixtures/measurement/required-depths/valid.json +126 -0
  231. package/tests/fixtures/measurement/required-depths/warning.json +29 -0
  232. package/tests/fixtures/measurement/soilTexture/missing-texture-value.json +227 -0
  233. package/tests/fixtures/measurement/soilTexture/percent-invalid.json +110 -0
  234. package/tests/fixtures/measurement/soilTexture/percent-missing-value.json +43 -0
  235. package/tests/fixtures/measurement/soilTexture/percent-valid.json +110 -0
  236. package/tests/fixtures/measurement/startDate-endDate-required/invalid.json +32 -0
  237. package/tests/fixtures/measurement/startDate-endDate-required/valid.json +46 -0
  238. package/tests/fixtures/measurement/unique/invalid.json +28 -0
  239. package/tests/fixtures/measurement/unique/valid.json +16 -0
  240. package/tests/fixtures/measurement/value-length/invalid.json +46 -0
  241. package/tests/fixtures/measurement/value-length/valid.json +44 -0
  242. package/tests/fixtures/measurement/water-salinity/invalid.json +33 -0
  243. package/tests/fixtures/measurement/water-salinity/valid-brakish.json +40 -0
  244. package/tests/fixtures/measurement/water-salinity/valid.json +33 -0
  245. package/tests/fixtures/organisation/valid.json +26 -0
  246. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/invalid.json +63 -0
  247. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/valid.json +63 -0
  248. package/tests/fixtures/practice/defaultValue/invalid.json +12 -0
  249. package/tests/fixtures/practice/defaultValue/valid.json +15 -0
  250. package/tests/fixtures/practice/excretaManagement/invalid.json +50 -0
  251. package/tests/fixtures/practice/excretaManagement/valid.json +60 -0
  252. package/tests/fixtures/practice/irrigated-complete/invalid.json +47 -0
  253. package/tests/fixtures/practice/irrigated-complete/valid-incomplete.json +47 -0
  254. package/tests/fixtures/practice/irrigated-complete/valid.json +60 -0
  255. package/tests/fixtures/practice/landCover-products/invalid.json +58 -0
  256. package/tests/fixtures/practice/landCover-products/valid-coverCrop.json +69 -0
  257. package/tests/fixtures/practice/landCover-products/valid.json +58 -0
  258. package/tests/fixtures/practice/liveAnimal-system/invalid.json +58 -0
  259. package/tests/fixtures/practice/liveAnimal-system/valid.json +69 -0
  260. package/tests/fixtures/practice/longFallowDuration/invalid.json +20 -0
  261. package/tests/fixtures/practice/longFallowDuration/valid.json +20 -0
  262. package/tests/fixtures/practice/noTillage/invalid.json +23 -0
  263. package/tests/fixtures/practice/noTillage/valid-value-not-100.json +23 -0
  264. package/tests/fixtures/practice/noTillage/valid.json +21 -0
  265. package/tests/fixtures/practice/pastureGrass/key-termType/invalid.json +16 -0
  266. package/tests/fixtures/practice/pastureGrass/key-termType/valid.json +16 -0
  267. package/tests/fixtures/practice/pastureGrass/key-value/invalid-numbers.json +67 -0
  268. package/tests/fixtures/practice/pastureGrass/key-value/invalid.json +67 -0
  269. package/tests/fixtures/practice/pastureGrass/key-value/valid.json +67 -0
  270. package/tests/fixtures/practice/pastureGrass/permanent-pasture/invalid.json +37 -0
  271. package/tests/fixtures/practice/pastureGrass/permanent-pasture/valid.json +47 -0
  272. package/tests/fixtures/practice/primaryPercent/invalid.json +49 -0
  273. package/tests/fixtures/practice/primaryPercent/valid.json +49 -0
  274. package/tests/fixtures/practice/processingOperation/invalid-no-primary.json +48 -0
  275. package/tests/fixtures/practice/processingOperation/invalid.json +49 -0
  276. package/tests/fixtures/practice/processingOperation/valid-cropland.json +37 -0
  277. package/tests/fixtures/practice/processingOperation/valid.json +49 -0
  278. package/tests/fixtures/practice/productivePhasePermanentCrops/invalid.json +48 -0
  279. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-0-value.json +58 -0
  280. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-no-value.json +47 -0
  281. package/tests/fixtures/practice/productivePhasePermanentCrops/valid.json +48 -0
  282. package/tests/fixtures/practice/site-management/invalid.json +75 -0
  283. package/tests/fixtures/practice/site-management/valid.json +75 -0
  284. package/tests/fixtures/practice/tillage-siteType/valid.json +51 -0
  285. package/tests/fixtures/practice/tillage-siteType/warning.json +42 -0
  286. package/tests/fixtures/practice/tillage-values/invalid-fullTillage.json +61 -0
  287. package/tests/fixtures/practice/tillage-values/invalid-noTillage.json +61 -0
  288. package/tests/fixtures/practice/tillage-values/valid.json +61 -0
  289. package/tests/fixtures/practice/waterRegime/rice/invalid.json +59 -0
  290. package/tests/fixtures/practice/waterRegime/rice/valid-0-value.json +59 -0
  291. package/tests/fixtures/practice/waterRegime/rice/valid.json +58 -0
  292. package/tests/fixtures/product/economicValueShare/invalid.json +31 -0
  293. package/tests/fixtures/product/economicValueShare/valid.json +22 -0
  294. package/tests/fixtures/product/excreta/invalid.json +62 -0
  295. package/tests/fixtures/product/excreta/valid.json +62 -0
  296. package/tests/fixtures/product/excreta/warning.json +53 -0
  297. package/tests/fixtures/product/excreta/with-system/invalid.json +79 -0
  298. package/tests/fixtures/product/excreta/with-system/valid.json +88 -0
  299. package/tests/fixtures/product/excreta/with-system/warning.json +70 -0
  300. package/tests/fixtures/product/fu_ha/invalid.json +49 -0
  301. package/tests/fixtures/product/fu_ha/valid.json +49 -0
  302. package/tests/fixtures/product/primary/invalid.json +22 -0
  303. package/tests/fixtures/product/primary/valid.json +22 -0
  304. package/tests/fixtures/product/value/valid.json +26 -0
  305. package/tests/fixtures/product/value/value-0/error.json +40 -0
  306. package/tests/fixtures/product/value/value-empty/warning.json +23 -0
  307. package/tests/fixtures/product/yield/invalid.json +54 -0
  308. package/tests/fixtures/product/yield/no-value.json +75 -0
  309. package/tests/fixtures/product/yield/valid.json +54 -0
  310. package/tests/fixtures/property/default-value/valid-allowed-exception.json +61 -0
  311. package/tests/fixtures/property/default-value/valid.json +61 -0
  312. package/tests/fixtures/property/default-value/warning.json +61 -0
  313. package/tests/fixtures/property/termType/invalid.json +60 -0
  314. package/tests/fixtures/property/termType/valid.json +60 -0
  315. package/tests/fixtures/property/value-min-max/invalid.json +77 -0
  316. package/tests/fixtures/property/value-min-max/valid-skip-maximum.json +57 -0
  317. package/tests/fixtures/property/value-min-max/valid.json +78 -0
  318. package/tests/fixtures/property/valueType/invalid.json +79 -0
  319. package/tests/fixtures/property/valueType/valid.json +79 -0
  320. package/tests/fixtures/property/volatileSolidsContent/invalid.json +99 -0
  321. package/tests/fixtures/property/volatileSolidsContent/valid.json +99 -0
  322. package/tests/fixtures/shared/coordinates/invalid.json +18 -0
  323. package/tests/fixtures/shared/coordinates/valid.json +18 -0
  324. package/tests/fixtures/shared/data-duplicates/valid.json +113 -0
  325. package/tests/fixtures/shared/data-duplicates/warning.json +172 -0
  326. package/tests/fixtures/shared/duplicated-term-units/invalid-animalProduct.json +61 -0
  327. package/tests/fixtures/shared/duplicated-term-units/invalid-organicFertiliser.json +61 -0
  328. package/tests/fixtures/shared/duplicated-term-units/valid.json +49 -0
  329. package/tests/fixtures/shared/list-country-region/invalid.json +54 -0
  330. package/tests/fixtures/shared/list-country-region/valid.json +54 -0
  331. package/tests/fixtures/shared/list-percent-value/invalid.json +49 -0
  332. package/tests/fixtures/shared/list-percent-value/valid.json +52 -0
  333. package/tests/fixtures/shared/list-valueType/invalid.json +49 -0
  334. package/tests/fixtures/shared/list-valueType/valid.json +49 -0
  335. package/tests/fixtures/shared/list-values-sum-100/management/with-properties/valid.json +91 -0
  336. package/tests/fixtures/shared/list-values-sum-100/measurements/missing-soil.json +46 -0
  337. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-high-value.json +63 -0
  338. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-valid.json +40 -0
  339. package/tests/fixtures/shared/list-values-sum-100/measurements/with-depth-high-value.json +71 -0
  340. package/tests/fixtures/shared/list-values-sum-100/practices/total-100.json +61 -0
  341. package/tests/fixtures/shared/list-values-sum-100/practices/total-110.json +61 -0
  342. package/tests/fixtures/shared/list-values-sum-100/practices/total-90.json +61 -0
  343. package/tests/fixtures/shared/min-max/value-above.json +31 -0
  344. package/tests/fixtures/shared/min-max/value-below.json +31 -0
  345. package/tests/fixtures/shared/min-max/value-valid.json +45 -0
  346. package/tests/fixtures/shared/model/emissions/invalid.json +102 -0
  347. package/tests/fixtures/shared/model/emissions/valid-variable-tolerance.json +180 -0
  348. package/tests/fixtures/shared/model/emissions/valid.json +102 -0
  349. package/tests/fixtures/shared/model/impacts/invalid.json +75 -0
  350. package/tests/fixtures/shared/model/impacts/valid.json +75 -0
  351. package/tests/fixtures/shared/model/inputs/valid-no-value.json +84 -0
  352. package/tests/fixtures/shared/model/inputs/valid.json +87 -0
  353. package/tests/fixtures/shared/model/inputs/warning.json +87 -0
  354. package/tests/fixtures/shared/model/products/valid-no-value.json +88 -0
  355. package/tests/fixtures/shared/model/products/valid.json +91 -0
  356. package/tests/fixtures/shared/model/products/warning.json +91 -0
  357. package/tests/fixtures/shared/otherModel/invalid.json +69 -0
  358. package/tests/fixtures/shared/otherModel/valid.json +70 -0
  359. package/tests/fixtures/shared/properties-duplicate-values/invalid.json +61 -0
  360. package/tests/fixtures/shared/properties-duplicate-values/valid.json +57 -0
  361. package/tests/fixtures/shared/properties-same-length/invalid.json +62 -0
  362. package/tests/fixtures/shared/properties-same-length/valid.json +52 -0
  363. package/tests/fixtures/shared/unit-percent/invalid.json +34 -0
  364. package/tests/fixtures/shared/unit-percent/valid.json +60 -0
  365. package/tests/fixtures/shared/unit-percent/warning.json +52 -0
  366. package/tests/fixtures/site/cycles-linked-ia/invalid.json +129 -0
  367. package/tests/fixtures/site/cycles-linked-ia/valid.json +129 -0
  368. package/tests/fixtures/site/valid.json +138 -0
  369. package/tests/fixtures/source/valid.json +19 -0
  370. package/tests/fixtures/transformation/excretaManagement/invalid.json +47 -0
  371. package/tests/fixtures/transformation/excretaManagement/valid.json +59 -0
  372. package/tests/fixtures/transformation/inputs-products/invalid.json +43 -0
  373. package/tests/fixtures/transformation/inputs-products/valid.json +43 -0
  374. package/tests/fixtures/transformation/linked-emission/invalid.json +101 -0
  375. package/tests/fixtures/transformation/linked-emission/valid.json +107 -0
  376. package/tests/fixtures/transformation/previousTransformationId/invalid-no-previous.json +127 -0
  377. package/tests/fixtures/transformation/previousTransformationId/invalid-previous-input.json +100 -0
  378. package/tests/fixtures/transformation/previousTransformationId/invalid-product-input.json +106 -0
  379. package/tests/fixtures/transformation/previousTransformationId/invalid-wrong-order.json +136 -0
  380. package/tests/fixtures/transformation/previousTransformationId/valid.json +171 -0
  381. package/tests/integration/__init__.py +0 -0
  382. package/tests/integration/test_product.py +17 -0
  383. package/tests/test_gee.py +10 -0
  384. package/tests/test_utils.py +36 -0
  385. package/tests/test_validation.py +11 -0
  386. package/tests/utils.py +28 -0
  387. package/tests/validators/__init__.py +0 -0
  388. package/tests/validators/test_aggregated_cycle.py +44 -0
  389. package/tests/validators/test_aggregated_shared.py +63 -0
  390. package/tests/validators/test_animal.py +72 -0
  391. package/tests/validators/test_completeness.py +337 -0
  392. package/tests/validators/test_cycle.py +600 -0
  393. package/tests/validators/test_emission.py +170 -0
  394. package/tests/validators/test_impact_assessment.py +80 -0
  395. package/tests/validators/test_indicator.py +120 -0
  396. package/tests/validators/test_infrastructure.py +26 -0
  397. package/tests/validators/test_input.py +434 -0
  398. package/tests/validators/test_management.py +177 -0
  399. package/tests/validators/test_measurement.py +317 -0
  400. package/tests/validators/test_organisation.py +32 -0
  401. package/tests/validators/test_practice.py +490 -0
  402. package/tests/validators/test_product.py +291 -0
  403. package/tests/validators/test_property.py +143 -0
  404. package/tests/validators/test_shared.py +1139 -0
  405. package/tests/validators/test_site.py +151 -0
  406. package/tests/validators/test_source.py +15 -0
  407. package/tests/validators/test_transformation.py +151 -0
  408. package/tests/validators/test_validators.py +74 -0
  409. package/tsconfig.dist.json +9 -0
  410. package/tsconfig.json +25 -0
@@ -0,0 +1,434 @@
1
+ import os
2
+ import json
3
+ from unittest.mock import patch
4
+
5
+ from tests.utils import fixtures_path
6
+ from hestia_earth.validation.utils import _group_nodes
7
+ from hestia_earth.validation.validators.input import (
8
+ validate_must_include_id,
9
+ validate_input_country,
10
+ validate_related_impacts,
11
+ validate_input_distribution_value,
12
+ validate_animalFeed_requires_isAnimalFeed,
13
+ validate_saplings,
14
+ validate_input_is_product,
15
+ )
16
+
17
+ class_path = "hestia_earth.validation.validators.input"
18
+ distribution_class_path = "hestia_earth.validation.validators.distribution"
19
+ fixtures_folder = os.path.join(fixtures_path, "input")
20
+
21
+
22
+ def test_validate_must_include_id_valid():
23
+ # no inputs should be valid
24
+ assert validate_must_include_id([]) is True
25
+
26
+ with open(f"{fixtures_folder}/mustIncludeId/valid.json") as f:
27
+ data = json.load(f)
28
+ assert validate_must_include_id(data.get("nodes")) is True
29
+
30
+ with open(f"{fixtures_folder}/mustIncludeId/valid-multiple-ids.json") as f:
31
+ data = json.load(f)
32
+ assert validate_must_include_id(data.get("nodes")) is True
33
+
34
+
35
+ def test_validate_must_include_id_invalid():
36
+ with open(f"{fixtures_folder}/mustIncludeId/invalid.json") as f:
37
+ data = json.load(f)
38
+ assert validate_must_include_id(data.get("nodes")) == {
39
+ "level": "warning",
40
+ "dataPath": ".inputs[0]",
41
+ "message": "should add missing inputs",
42
+ "params": {
43
+ "expected": [
44
+ "potassiumNitrateKgK2O",
45
+ ],
46
+ },
47
+ }
48
+
49
+
50
+ def test_validate_input_country_valid():
51
+ # no inputs should be valid
52
+ assert validate_input_country({}) is True
53
+
54
+ with open(f"{fixtures_folder}/country/valid.json") as f:
55
+ cycle = json.load(f)
56
+ assert validate_input_country(cycle, "inputs") is True
57
+
58
+
59
+ def test_validate_input_country_invalid():
60
+ with open(f"{fixtures_folder}/country/invalid.json") as f:
61
+ cycle = json.load(f)
62
+ assert validate_input_country(cycle, "inputs") == {
63
+ "level": "error",
64
+ "dataPath": ".inputs[1].country",
65
+ "message": "must be a country",
66
+ }
67
+
68
+
69
+ def test_validate_related_impacts_valid():
70
+ # no inputs should be valid
71
+ assert validate_related_impacts({}, "inputs") is True
72
+
73
+ with open(f"{fixtures_folder}/impactAssessment/valid.json") as f:
74
+ nodes = json.load(f).get("nodes")
75
+ assert validate_related_impacts(nodes[0], "inputs", _group_nodes(nodes)) is True
76
+
77
+
78
+ def test_validate_related_impacts_invalid():
79
+ with open(f"{fixtures_folder}/impactAssessment/invalid.json") as f:
80
+ nodes = json.load(f).get("nodes")
81
+ assert validate_related_impacts(nodes[0], "inputs", _group_nodes(nodes)) == {
82
+ "level": "error",
83
+ "dataPath": ".inputs[1].impactAssessment",
84
+ "message": "can not be linked to the same type",
85
+ "params": {
86
+ "current": "Cycle",
87
+ },
88
+ }
89
+
90
+
91
+ def test_validate_input_distribution_value_incomplete_valid():
92
+ with open(f"{fixtures_folder}/distribution/incomplete/valid.json") as f:
93
+ cycle = json.load(f)
94
+ assert validate_input_distribution_value(cycle, cycle.get("site")) is True
95
+
96
+
97
+ def fake_get_post_fert(_country_id, product_id, fert_id):
98
+ return {
99
+ "inorganicPhosphorusFertiliserUnspecifiedKgP2O5": (44, 4),
100
+ "inorganicPotassiumFertiliserUnspecifiedKgK2O": (84, 8),
101
+ "inorganicNitrogenFertiliserUnspecifiedKgN": (166, 12),
102
+ "ammoniumSulphateKgN": (166, 12),
103
+ "ureaKgN": (166, 12),
104
+ }[fert_id]
105
+
106
+
107
+ fake_post_pest_value = (4, 12)
108
+ fake_post_irri_value = (400, 120)
109
+
110
+
111
+ @patch(f"{distribution_class_path}.get_post_fert", side_effect=fake_get_post_fert)
112
+ @patch(f"{distribution_class_path}.get_post_pest", return_value=fake_post_pest_value)
113
+ @patch(f"{distribution_class_path}.get_post_irri", return_value=fake_post_irri_value)
114
+ def test_validate_input_distribution_value_complete_invalid(*args):
115
+ with open(f"{fixtures_folder}/distribution/complete/invalid.json") as f:
116
+ cycle = json.load(f)
117
+ assert validate_input_distribution_value(cycle, cycle.get("site"), "inputs") == [
118
+ {
119
+ "level": "warning",
120
+ "dataPath": ".inputs[0].value",
121
+ "message": "is outside confidence interval",
122
+ "params": {
123
+ "term": {
124
+ "@type": "Term",
125
+ "@id": "ureaKgN",
126
+ "termType": "inorganicFertiliser",
127
+ "units": "kg N",
128
+ },
129
+ "group": "Nitrogen (kg N)",
130
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
131
+ "outliers": [113],
132
+ "threshold": 0.95,
133
+ "min": 142.48,
134
+ "max": 189.52,
135
+ },
136
+ },
137
+ {
138
+ "level": "warning",
139
+ "dataPath": ".inputs[1].value",
140
+ "message": "is outside confidence interval",
141
+ "params": {
142
+ "term": {
143
+ "@type": "Term",
144
+ "@id": "ammoniumSulphateKgN",
145
+ "termType": "inorganicFertiliser",
146
+ "units": "kg N",
147
+ },
148
+ "group": "Nitrogen (kg N)",
149
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
150
+ "outliers": [113],
151
+ "threshold": 0.95,
152
+ "min": 142.48,
153
+ "max": 189.52,
154
+ },
155
+ },
156
+ {
157
+ "level": "warning",
158
+ "dataPath": ".inputs[2].value",
159
+ "message": "is outside confidence interval",
160
+ "params": {
161
+ "term": {
162
+ "@type": "Term",
163
+ "@id": "inorganicNitrogenFertiliserUnspecifiedKgN",
164
+ "termType": "inorganicFertiliser",
165
+ "units": "kg N",
166
+ },
167
+ "group": "Nitrogen (kg N)",
168
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
169
+ "outliers": [113],
170
+ "threshold": 0.95,
171
+ "min": 142.48,
172
+ "max": 189.52,
173
+ },
174
+ },
175
+ {
176
+ "level": "warning",
177
+ "dataPath": ".inputs[3].value",
178
+ "message": "is outside confidence interval",
179
+ "params": {
180
+ "term": {
181
+ "@type": "Term",
182
+ "@id": "inorganicPotassiumFertiliserUnspecifiedKgK2O",
183
+ "termType": "inorganicFertiliser",
184
+ "units": "kg K2O",
185
+ },
186
+ "group": "Potassium (kg K2O)",
187
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
188
+ "outliers": [217],
189
+ "threshold": 0.95,
190
+ "min": 68.32,
191
+ "max": 99.68,
192
+ },
193
+ },
194
+ {
195
+ "level": "warning",
196
+ "dataPath": ".inputs[4].value",
197
+ "message": "is outside confidence interval",
198
+ "params": {
199
+ "term": {
200
+ "@type": "Term",
201
+ "@id": "inorganicPhosphorusFertiliserUnspecifiedKgP2O5",
202
+ "termType": "inorganicFertiliser",
203
+ "units": "kg P2O5",
204
+ },
205
+ "group": "Phosphorus (kg P2O5)",
206
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
207
+ "outliers": [183],
208
+ "threshold": 0.95,
209
+ "min": 36.16,
210
+ "max": 51.84,
211
+ },
212
+ },
213
+ {
214
+ "level": "warning",
215
+ "dataPath": ".inputs[5].value",
216
+ "message": "is outside confidence interval",
217
+ "params": {
218
+ "term": {
219
+ "@type": "Term",
220
+ "@id": "CAS-110-17-8",
221
+ "termType": "pesticideAI",
222
+ "units": "kg active ingredient",
223
+ },
224
+ "group": "pesticideUnspecifiedAi",
225
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
226
+ "outliers": [439.64],
227
+ "threshold": 0.95,
228
+ "min": 0,
229
+ "max": 27.52,
230
+ },
231
+ },
232
+ {
233
+ "level": "warning",
234
+ "dataPath": ".inputs[6].value",
235
+ "message": "is outside confidence interval",
236
+ "params": {
237
+ "term": {
238
+ "@type": "Term",
239
+ "@id": "CAS-498-15-7",
240
+ "termType": "pesticideAI",
241
+ "units": "kg active ingredient",
242
+ },
243
+ "group": "pesticideUnspecifiedAi",
244
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
245
+ "outliers": [439.64],
246
+ "threshold": 0.95,
247
+ "min": 0,
248
+ "max": 27.52,
249
+ },
250
+ },
251
+ {
252
+ "level": "warning",
253
+ "dataPath": ".inputs[7].value",
254
+ "message": "is outside confidence interval",
255
+ "params": {
256
+ "term": {
257
+ "@type": "Term",
258
+ "@id": "008MesoFertiliser",
259
+ "termType": "pesticideBrandName",
260
+ "units": "kg",
261
+ },
262
+ "group": "pesticideUnspecifiedAi",
263
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
264
+ "outliers": [439.64],
265
+ "threshold": 0.95,
266
+ "min": 0,
267
+ "max": 27.52,
268
+ },
269
+ },
270
+ {
271
+ "level": "warning",
272
+ "dataPath": ".inputs[8].value",
273
+ "message": "is outside confidence interval",
274
+ "params": {
275
+ "term": {
276
+ "@type": "Term",
277
+ "@id": "waterMarine",
278
+ "termType": "water",
279
+ "units": "m3",
280
+ },
281
+ "group": "waterSourceUnspecified",
282
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
283
+ "outliers": [2800],
284
+ "threshold": 0.95,
285
+ "min": 164.8,
286
+ "max": 635.2,
287
+ },
288
+ },
289
+ {
290
+ "level": "warning",
291
+ "dataPath": ".inputs[9].value",
292
+ "message": "is outside confidence interval",
293
+ "params": {
294
+ "term": {
295
+ "@type": "Term",
296
+ "@id": "waterRiverStream",
297
+ "termType": "water",
298
+ "units": "m3",
299
+ },
300
+ "group": "waterSourceUnspecified",
301
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
302
+ "outliers": [2800],
303
+ "threshold": 0.95,
304
+ "min": 164.8,
305
+ "max": 635.2,
306
+ },
307
+ },
308
+ ]
309
+
310
+
311
+ @patch(f"{distribution_class_path}.get_prior_fert", side_effect=fake_get_post_fert)
312
+ @patch(f"{distribution_class_path}.get_post_fert", return_value=(None, None))
313
+ @patch(f"{distribution_class_path}.get_prior_pest", return_value=fake_post_pest_value)
314
+ @patch(f"{distribution_class_path}.get_post_pest", return_value=(None, None))
315
+ @patch(f"{distribution_class_path}.get_prior_irri", return_value=fake_post_irri_value)
316
+ @patch(f"{distribution_class_path}.get_post_irri", return_value=(None, None))
317
+ def test_validate_input_distribution_value_complete_valid_with_prior_no_posterior(
318
+ *args,
319
+ ):
320
+ with open(f"{fixtures_folder}/distribution/complete/valid.json") as f:
321
+ cycle = json.load(f)
322
+ assert validate_input_distribution_value(cycle, cycle.get("site")) is True
323
+
324
+
325
+ @patch(f"{distribution_class_path}.get_prior_fert", return_value=(None, None))
326
+ @patch(f"{distribution_class_path}.get_post_fert", return_value=(None, None))
327
+ @patch(f"{distribution_class_path}.get_prior_pest", return_value=(None, None))
328
+ @patch(f"{distribution_class_path}.get_post_pest", return_value=(None, None))
329
+ @patch(f"{distribution_class_path}.get_prior_irri", return_value=(None, None))
330
+ @patch(f"{distribution_class_path}.get_post_irri", return_value=(None, None))
331
+ def test_validate_input_distribution_value_complete_valid_no_prior_no_posterior(*args):
332
+ with open(f"{fixtures_folder}/distribution/complete/valid.json") as f:
333
+ cycle = json.load(f)
334
+ assert validate_input_distribution_value(cycle, cycle.get("site")) is True
335
+
336
+
337
+ @patch(f"{distribution_class_path}.get_post_fert", return_value=Exception)
338
+ @patch(f"{distribution_class_path}.get_post_pest", return_value=Exception)
339
+ @patch(f"{distribution_class_path}.get_post_irri", return_value=Exception)
340
+ def test_validate_input_distribution_value_handle_exception(*args):
341
+ with open(f"{fixtures_folder}/distribution/complete/valid.json") as f:
342
+ cycle = json.load(f)
343
+ assert validate_input_distribution_value(cycle, cycle.get("site")) is True
344
+
345
+
346
+ def test_validate_input_distribution_value_non_cropland(*args):
347
+ with open(f"{fixtures_folder}/distribution/animalHousing.json") as f:
348
+ cycle = json.load(f)
349
+ assert validate_input_distribution_value(cycle, cycle.get("site")) is True
350
+
351
+
352
+ def test_validate_animalFeed_requires_isAnimalFeed_valid():
353
+ # no inputs should be valid
354
+ assert validate_animalFeed_requires_isAnimalFeed({}, {}) is True
355
+
356
+ with open(f"{fixtures_folder}/animalFeed-fate/valid.json") as f:
357
+ cycle = json.load(f)
358
+ assert validate_animalFeed_requires_isAnimalFeed(cycle, cycle.get("site")) is True
359
+
360
+
361
+ def test_validate_animalFeed_requires_isAnimalFeed_invalid():
362
+ with open(f"{fixtures_folder}/animalFeed-fate/invalid.json") as f:
363
+ cycle = json.load(f)
364
+ assert validate_animalFeed_requires_isAnimalFeed(cycle, cycle.get("site")) == [
365
+ {
366
+ "level": "error",
367
+ "dataPath": ".inputs[0]",
368
+ "message": "must specify is it an animal feed",
369
+ },
370
+ {
371
+ "level": "error",
372
+ "dataPath": ".animals[0].inputs[0]",
373
+ "message": "must specify is it an animal feed",
374
+ },
375
+ ]
376
+
377
+
378
+ def test_validate_saplings_valid():
379
+ # no inputs should be valid
380
+ assert validate_saplings({}) is True
381
+
382
+ with open(f"{fixtures_folder}/saplings/valid.json") as f:
383
+ cycle = json.load(f)
384
+ assert validate_saplings(cycle, "inputs") is True
385
+
386
+ with open(f"{fixtures_folder}/saplings/valid-not-plantation.json") as f:
387
+ cycle = json.load(f)
388
+ assert validate_saplings(cycle, "inputs") is True
389
+
390
+ with open(f"{fixtures_folder}/saplings/valid-no-saplings.json") as f:
391
+ cycle = json.load(f)
392
+ assert validate_saplings(cycle, "inputs") is True
393
+
394
+
395
+ def test_validate_saplings_invalid():
396
+ with open(f"{fixtures_folder}/saplings/invalid.json") as f:
397
+ cycle = json.load(f)
398
+ assert validate_saplings(cycle, "inputs") == [
399
+ {
400
+ "level": "error",
401
+ "dataPath": ".inputs[0].term",
402
+ "message": "saplings cannot be used as an input here",
403
+ "params": {
404
+ "current": "saplings",
405
+ "expected": "saplingsDepreciatedAmountPerCycle",
406
+ },
407
+ }
408
+ ]
409
+
410
+
411
+ def test_validate_input_is_product_valid():
412
+ # no inputs should be valid
413
+ assert validate_input_is_product({}) is True
414
+
415
+ with open(f"{fixtures_folder}/input-as-product/valid.json") as f:
416
+ cycle = json.load(f)
417
+ assert validate_input_is_product(cycle, "inputs") is True
418
+
419
+
420
+ def test_validate_input_is_product_invalid():
421
+ with open(f"{fixtures_folder}/input-as-product/invalid.json") as f:
422
+ cycle = json.load(f)
423
+ assert validate_input_is_product(cycle, "inputs") == {
424
+ "level": "error",
425
+ "dataPath": ".inputs[1].term",
426
+ "message": "must be a product",
427
+ "params": {
428
+ "term": {
429
+ "@id": "nitrogenUptakeWholeCropWeedsAndVolunteers",
430
+ "@type": "Term",
431
+ "termType": "crop",
432
+ }
433
+ },
434
+ }
@@ -0,0 +1,177 @@
1
+ import os
2
+ import json
3
+ from hestia_earth.schema import TermTermType
4
+
5
+ from tests.utils import fixtures_path
6
+ from hestia_earth.validation.validators.management import (
7
+ validate_has_termType,
8
+ validate_has_termTypes,
9
+ validate_exists,
10
+ validate_fallow_dates,
11
+ validate_cycles_overlap,
12
+ )
13
+
14
+ fixtures_folder = os.path.join(fixtures_path, "management")
15
+
16
+
17
+ def test_validate_has_termType_valid():
18
+ with open(f"{fixtures_folder}/termType/valid-cropland.json") as f:
19
+ site = json.load(f)
20
+
21
+ assert validate_has_termType(site, TermTermType.LANDUSEMANAGEMENT) is True
22
+
23
+ with open(f"{fixtures_folder}/termType/valid-permanent-pasture.json") as f:
24
+ site = json.load(f)
25
+
26
+ assert validate_has_termType(site, TermTermType.LANDUSEMANAGEMENT) is True
27
+
28
+
29
+ def test_validate_has_termType_invalid():
30
+ with open(f"{fixtures_folder}/termType/invalid-cropland.json") as f:
31
+ site = json.load(f)
32
+
33
+ assert validate_has_termType(site, TermTermType.LANDUSEMANAGEMENT) == {
34
+ "level": "warning",
35
+ "dataPath": ".management",
36
+ "message": "should contain at least one management node",
37
+ "params": {"termType": "landUseManagement"},
38
+ }
39
+
40
+ with open(f"{fixtures_folder}/termType/invalid-permanent-pasture.json") as f:
41
+ site = json.load(f)
42
+
43
+ assert validate_has_termType(site, TermTermType.WATERREGIME) == {
44
+ "level": "warning",
45
+ "dataPath": ".management",
46
+ "message": "should contain at least one management node",
47
+ "params": {"termType": "waterRegime"},
48
+ }
49
+
50
+
51
+ def test_validate_has_termTypes_valid():
52
+ # no blank node is valid
53
+ site = {}
54
+ assert validate_has_termTypes(site) is True
55
+
56
+ with open(f"{fixtures_folder}/termType/valid-cropland.json") as f:
57
+ site = json.load(f)
58
+
59
+ assert validate_has_termTypes(site) is True
60
+
61
+ with open(f"{fixtures_folder}/termType/valid-permanent-pasture.json") as f:
62
+ site = json.load(f)
63
+
64
+ assert validate_has_termTypes(site) is True
65
+
66
+ with open(f"{fixtures_folder}/termType/valid-no-management.json") as f:
67
+ site = json.load(f)
68
+
69
+ assert validate_has_termTypes(site) is True
70
+
71
+
72
+ def test_validate_has_termTypes_invalid():
73
+ with open(f"{fixtures_folder}/termType/invalid-cropland.json") as f:
74
+ site = json.load(f)
75
+
76
+ assert validate_has_termTypes(site) == [
77
+ {
78
+ "level": "warning",
79
+ "dataPath": ".management",
80
+ "message": "should contain at least one management node",
81
+ "params": {"termType": "landUseManagement"},
82
+ },
83
+ {
84
+ "level": "warning",
85
+ "dataPath": ".management",
86
+ "message": "should contain at least one management node",
87
+ "params": {"termType": "waterRegime"},
88
+ },
89
+ ]
90
+
91
+ with open(f"{fixtures_folder}/termType/invalid-permanent-pasture.json") as f:
92
+ site = json.load(f)
93
+
94
+ assert validate_has_termTypes(site) == [
95
+ {
96
+ "level": "warning",
97
+ "dataPath": ".management",
98
+ "message": "should contain at least one management node",
99
+ "params": {"termType": "landUseManagement"},
100
+ },
101
+ {
102
+ "level": "warning",
103
+ "dataPath": ".management",
104
+ "message": "should contain at least one management node",
105
+ "params": {"termType": "waterRegime"},
106
+ },
107
+ ]
108
+
109
+
110
+ def test_validate_exists_valid():
111
+ with open(f"{fixtures_folder}/exists/valid.json") as f:
112
+ site = json.load(f)
113
+
114
+ assert validate_exists(site) is True
115
+
116
+
117
+ def test_validate_exists_invalid():
118
+ with open(f"{fixtures_folder}/exists/invalid.json") as f:
119
+ site = json.load(f)
120
+
121
+ assert validate_exists(site) == {
122
+ "level": "warning",
123
+ "dataPath": ".management",
124
+ "message": "should contain at least one management node",
125
+ }
126
+
127
+
128
+ def test_validate_defaultValue_valid():
129
+ # no management should be valid
130
+ assert validate_fallow_dates({}) is True
131
+
132
+ with open(f"{fixtures_folder}/fallow-dates/valid.json") as f:
133
+ data = json.load(f)
134
+ assert validate_fallow_dates(data, "management") is True
135
+
136
+
137
+ def test_validate_defaultValue_invalid():
138
+ with open(f"{fixtures_folder}/fallow-dates/invalid.json") as f:
139
+ data = json.load(f)
140
+ assert validate_fallow_dates(data, "management") == {
141
+ "level": "error",
142
+ "dataPath": ".management[0]",
143
+ "message": "duration must be in specified interval",
144
+ "params": {
145
+ "term": {"@type": "Term", "@id": "shortFallow"},
146
+ "current": 730,
147
+ "expected": "less-than-1-year",
148
+ },
149
+ }
150
+
151
+
152
+ def test_validate_cycles_overlap_valid():
153
+ # no management should be valid
154
+ assert validate_cycles_overlap({}, []) is True
155
+
156
+ with open(f"{fixtures_folder}/cycle-overlap/cycles.json") as f:
157
+ cycles = json.load(f)
158
+
159
+ with open(f"{fixtures_folder}/cycle-overlap/valid.json") as f:
160
+ data = json.load(f)
161
+ # no cycles should be valid
162
+ assert validate_cycles_overlap(data, cycles=[]) is True
163
+ assert validate_cycles_overlap(data, cycles, "management") is True
164
+
165
+
166
+ def test_validate_cycles_overlap_invalid():
167
+ with open(f"{fixtures_folder}/cycle-overlap/cycles.json") as f:
168
+ cycles = json.load(f)
169
+
170
+ with open(f"{fixtures_folder}/cycle-overlap/invalid.json") as f:
171
+ data = json.load(f)
172
+ assert validate_cycles_overlap(data, cycles, "management") == {
173
+ "level": "error",
174
+ "dataPath": ".management[0].endDate",
175
+ "message": "management date must be before cycle start date",
176
+ "params": {"current": "2020-09-22", "expected": "2020-03-12"},
177
+ }