@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,490 @@
1
+ import os
2
+ from unittest.mock import patch
3
+ import json
4
+ from hestia_earth.schema import SiteSiteType
5
+
6
+ from tests.utils import fixtures_path, fake_get_terms
7
+ from hestia_earth.validation.validators.practice import (
8
+ _is_irrigated,
9
+ validate_defaultValue,
10
+ validate_waterRegime_rice_products,
11
+ validate_croppingDuration_riceGrainInHuskFlooded,
12
+ validate_longFallowDuration,
13
+ validate_excretaManagement,
14
+ validate_no_tillage,
15
+ validate_tillage_site_type,
16
+ validate_tillage_values,
17
+ validate_liveAnimal_system,
18
+ validate_pastureGrass_key_termType,
19
+ validate_pastureGrass_key_value,
20
+ validate_has_pastureGrass,
21
+ validate_permanent_crop_productive_phase,
22
+ validate_primaryPercent,
23
+ validate_processing_operation,
24
+ validate_landCover_match_products,
25
+ validate_practices_management,
26
+ validate_irrigated_complete_has_inputs,
27
+ )
28
+
29
+ class_path = "hestia_earth.validation.validators.practice"
30
+ fixtures_folder = os.path.join(fixtures_path, "practice")
31
+
32
+
33
+ def test_is_irrigated():
34
+ term = {"@id": "irrigatedTypeUnspecified", "termType": "waterRegime"}
35
+ assert _is_irrigated(term) is True
36
+
37
+ term = {"@id": "irrigating", "termType": "operation"}
38
+ assert _is_irrigated(term) is True
39
+
40
+
41
+ def test_validate_defaultValue_valid():
42
+ # no practices should be valid
43
+ assert validate_defaultValue({}) is True
44
+
45
+ with open(f"{fixtures_folder}/defaultValue/valid.json") as f:
46
+ data = json.load(f)
47
+ assert validate_defaultValue(data, "nodes") is True
48
+
49
+
50
+ def test_validate_defaultValue_invalid():
51
+ with open(f"{fixtures_folder}/defaultValue/invalid.json") as f:
52
+ data = json.load(f)
53
+ assert validate_defaultValue(data, "nodes") == {
54
+ "level": "warning",
55
+ "dataPath": ".nodes[0]",
56
+ "message": "should specify a value when HESTIA has a default one",
57
+ "params": {
58
+ "term": {
59
+ "@type": "Term",
60
+ "@id": "monocultureSimpleBatchProduction",
61
+ "termType": "aquacultureManagement",
62
+ },
63
+ "expected": 100,
64
+ },
65
+ }
66
+
67
+
68
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
69
+ def test_validate_waterRegime_rice_products_valid(*args):
70
+ # no practices should be valid
71
+ assert validate_waterRegime_rice_products({}, "practices") is True
72
+
73
+ with open(f"{fixtures_folder}/waterRegime/rice/valid.json") as f:
74
+ cycle = json.load(f)
75
+ assert validate_waterRegime_rice_products(cycle) is True
76
+
77
+ with open(f"{fixtures_folder}/waterRegime/rice/valid-0-value.json") as f:
78
+ cycle = json.load(f)
79
+ assert validate_waterRegime_rice_products(cycle) is True
80
+
81
+
82
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
83
+ def test_validate_waterRegime_rice_products_invalid(*args):
84
+ with open(f"{fixtures_folder}/waterRegime/rice/invalid.json") as f:
85
+ cycle = json.load(f)
86
+ assert validate_waterRegime_rice_products(cycle) == {
87
+ "level": "error",
88
+ "dataPath": ".practices[0].term",
89
+ "message": "rice products not allowed for this water regime practice",
90
+ "params": {
91
+ "term": {
92
+ "@type": "Term",
93
+ "@id": "irrigatedTypeUnspecified",
94
+ "termType": "waterRegime",
95
+ },
96
+ "products": [{"@type": "Term", "@id": "riceMeal", "termType": "crop"}],
97
+ "expected": ["riceGrainInHuskFlooded", "riceGrainInHuskUpland"],
98
+ },
99
+ }
100
+
101
+
102
+ def test_validate_croppingDuration_riceGrainInHuskFlooded_valid():
103
+ # no practices should be valid
104
+ assert validate_croppingDuration_riceGrainInHuskFlooded({}, "practices") is True
105
+
106
+ with open(
107
+ f"{fixtures_folder}/croppingDuration//riceGrainInHuskFlooded/valid.json"
108
+ ) as f:
109
+ data = json.load(f)
110
+ assert validate_croppingDuration_riceGrainInHuskFlooded(data) is True
111
+
112
+
113
+ def test_validate_croppingDuration_riceGrainInHuskFlooded_invalid():
114
+ with open(
115
+ f"{fixtures_folder}/croppingDuration//riceGrainInHuskFlooded/invalid.json"
116
+ ) as f:
117
+ data = json.load(f)
118
+ assert validate_croppingDuration_riceGrainInHuskFlooded(data) == {
119
+ "level": "error",
120
+ "dataPath": ".practices[0].value",
121
+ "message": "croppingDuration must be between min and max",
122
+ "params": {"min": 78, "max": 150},
123
+ }
124
+
125
+
126
+ def test_validate_longFallowDuration_valid():
127
+ # no practices should be valid
128
+ assert validate_longFallowDuration([]) is True
129
+
130
+ with open(f"{fixtures_folder}/longFallowDuration/valid.json") as f:
131
+ data = json.load(f)
132
+ assert validate_longFallowDuration(data.get("nodes")) is True
133
+
134
+
135
+ def test_validate_longFallowDuration_invalid():
136
+ with open(f"{fixtures_folder}/longFallowDuration/invalid.json") as f:
137
+ data = json.load(f)
138
+ assert validate_longFallowDuration(data.get("nodes")) == {
139
+ "level": "error",
140
+ "dataPath": ".practices[1].value",
141
+ "message": "longFallowDuration must be lower than 5 years",
142
+ }
143
+
144
+
145
+ def test_validate_excretaManagement_valid():
146
+ # no practices should be valid
147
+ assert validate_excretaManagement({}, []) is True
148
+
149
+ with open(f"{fixtures_folder}/excretaManagement/valid.json") as f:
150
+ cycle = json.load(f)
151
+ assert validate_excretaManagement(cycle, cycle.get("practices")) is True
152
+
153
+
154
+ def test_validate_excretaManagement_invalid():
155
+ with open(f"{fixtures_folder}/excretaManagement/invalid.json") as f:
156
+ cycle = json.load(f)
157
+ assert validate_excretaManagement(cycle, cycle.get("practices")) == {
158
+ "level": "error",
159
+ "dataPath": ".practices",
160
+ "message": "an excreta input is required when using an excretaManagement practice",
161
+ }
162
+
163
+
164
+ def test_validate_no_tillage_valid():
165
+ # no practices should be valid
166
+ assert validate_no_tillage([]) is True
167
+
168
+ with open(f"{fixtures_folder}/noTillage/valid.json") as f:
169
+ data = json.load(f)
170
+ assert validate_no_tillage(data.get("nodes")) is True
171
+
172
+ # value is not 100
173
+ with open(f"{fixtures_folder}/noTillage/valid-value-not-100.json") as f:
174
+ data = json.load(f)
175
+ assert validate_no_tillage(data.get("nodes")) is True
176
+
177
+
178
+ def test_validate_no_tillage_invalid():
179
+ with open(f"{fixtures_folder}/noTillage/invalid.json") as f:
180
+ data = json.load(f)
181
+ assert validate_no_tillage(data.get("nodes")) == {
182
+ "level": "error",
183
+ "dataPath": ".practices[1]",
184
+ "message": "is not allowed in combination with noTillage",
185
+ }
186
+
187
+
188
+ def test_validate_tillage_site_type_valid():
189
+ # no practices should be valid
190
+ assert validate_tillage_site_type([], {}) is True
191
+
192
+ with open(f"{fixtures_folder}/tillage-siteType/valid.json") as f:
193
+ cycle = json.load(f)
194
+ assert validate_tillage_site_type(cycle.get("practices"), cycle.get("site")) is True
195
+
196
+ # no practice but skipped termType
197
+ with open(f"{fixtures_folder}/tillage-siteType/warning.json") as f:
198
+ cycle = json.load(f)
199
+ site = cycle.get("site")
200
+ site["siteType"] = SiteSiteType.SEA_OR_OCEAN.value
201
+ assert validate_tillage_site_type(cycle.get("practices"), site) is True
202
+
203
+
204
+ def test_validate_tillage_site_type_warning():
205
+ with open(f"{fixtures_folder}/tillage-siteType/warning.json") as f:
206
+ cycle = json.load(f)
207
+ assert validate_tillage_site_type(cycle.get("practices"), cycle.get("site")) == {
208
+ "level": "warning",
209
+ "dataPath": ".practices",
210
+ "message": "should contain a tillage practice",
211
+ }
212
+
213
+
214
+ def test_validate_tillage_values_valid():
215
+ # no practices should be valid
216
+ assert validate_tillage_values([]) is True
217
+
218
+ with open(f"{fixtures_folder}/tillage-values/valid.json") as f:
219
+ cycle = json.load(f)
220
+ assert validate_tillage_values(cycle.get("practices")) is True
221
+
222
+
223
+ def test_validate_tillage_values_invalid():
224
+ with open(f"{fixtures_folder}/tillage-values/invalid-noTillage.json") as f:
225
+ cycle = json.load(f)
226
+ assert validate_tillage_values(cycle.get("practices")) == {
227
+ "level": "error",
228
+ "dataPath": ".practices[0]",
229
+ "message": "cannot use no tillage if depth or number of tillages is not 0",
230
+ }
231
+
232
+ with open(f"{fixtures_folder}/tillage-values/invalid-fullTillage.json") as f:
233
+ cycle = json.load(f)
234
+ assert validate_tillage_values(cycle.get("practices")) == {
235
+ "level": "error",
236
+ "dataPath": ".practices[0]",
237
+ "message": "cannot use full tillage if depth or number of tillages is 0",
238
+ }
239
+
240
+
241
+ def test_validate_liveAnimal_system_valid():
242
+ # no practices should be valid
243
+ assert validate_liveAnimal_system({}) is True
244
+
245
+ with open(f"{fixtures_folder}/liveAnimal-system/valid.json") as f:
246
+ data = json.load(f)
247
+ assert validate_liveAnimal_system(data) is True
248
+
249
+
250
+ def test_validate_liveAnimal_system_invalid():
251
+ with open(f"{fixtures_folder}/liveAnimal-system/invalid.json") as f:
252
+ data = json.load(f)
253
+ assert validate_liveAnimal_system(data) == {
254
+ "level": "warning",
255
+ "dataPath": ".practices",
256
+ "message": "should add an animal production system",
257
+ }
258
+
259
+
260
+ def test_validate_pastureGrass_key_termType_valid():
261
+ # no practices should be valid
262
+ assert validate_pastureGrass_key_termType({}) is True
263
+
264
+ with open(f"{fixtures_folder}/pastureGrass/key-termType/valid.json") as f:
265
+ practice = json.load(f)
266
+ assert validate_pastureGrass_key_termType({"practices": [practice]}) is True
267
+
268
+
269
+ def test_validate_pastureGrass_key_termType_invalid():
270
+ with open(f"{fixtures_folder}/pastureGrass/key-termType/invalid.json") as f:
271
+ practice = json.load(f)
272
+ assert validate_pastureGrass_key_termType({"practices": [practice]}) == {
273
+ "level": "error",
274
+ "dataPath": ".practices[0].key",
275
+ "message": "pastureGrass key termType must be landCover",
276
+ "params": {
277
+ "expected": "landCover",
278
+ "term": {
279
+ "@id": "alfalfaFreshForage",
280
+ "@type": "Term",
281
+ "termType": "forage",
282
+ },
283
+ "value": "forage",
284
+ },
285
+ }
286
+
287
+
288
+ def test_validate_pastureGrass_key_value_valid():
289
+ # no practices should be valid
290
+ assert validate_pastureGrass_key_value({}) is True
291
+
292
+ with open(f"{fixtures_folder}/pastureGrass/key-value/valid.json") as f:
293
+ cycle = json.load(f)
294
+ assert validate_pastureGrass_key_value(cycle, "practices") is True
295
+
296
+
297
+ def test_validate_pastureGrass_key_value_invalid():
298
+ with open(f"{fixtures_folder}/pastureGrass/key-value/invalid.json") as f:
299
+ cycle = json.load(f)
300
+ assert validate_pastureGrass_key_value(cycle, "practices") == {
301
+ "level": "error",
302
+ "dataPath": ".practices",
303
+ "message": "the sum of all pastureGrass values must be 100",
304
+ "params": {"expected": 100, "current": 80},
305
+ }
306
+
307
+ with open(f"{fixtures_folder}/pastureGrass/key-value/invalid-numbers.json") as f:
308
+ cycle = json.load(f)
309
+ assert validate_pastureGrass_key_value(cycle, "practices") == {
310
+ "level": "error",
311
+ "dataPath": ".practices",
312
+ "message": "all values must be numbers",
313
+ }
314
+
315
+
316
+ def test_validate_has_pastureGrass_valid():
317
+ with open(f"{fixtures_folder}/pastureGrass/permanent-pasture/valid.json") as f:
318
+ data = json.load(f)
319
+ assert validate_has_pastureGrass(data, data.get("site"), "practices") is True
320
+
321
+
322
+ def test_validate_has_pastureGrass_invalid():
323
+ with open(f"{fixtures_folder}/pastureGrass/permanent-pasture/invalid.json") as f:
324
+ data = json.load(f)
325
+ assert validate_has_pastureGrass(data, data.get("site")) == {
326
+ "level": "warning",
327
+ "dataPath": ".practices",
328
+ "message": "should add the term pastureGrass",
329
+ }
330
+
331
+
332
+ def test_validate_permanent_crop_productive_phase_valid():
333
+ # no practices is valid
334
+ assert validate_permanent_crop_productive_phase({}, "practices") is True
335
+
336
+ with open(f"{fixtures_folder}/productivePhasePermanentCrops/valid.json") as f:
337
+ data = json.load(f)
338
+ assert validate_permanent_crop_productive_phase(data, "practices") is True
339
+
340
+ with open(
341
+ f"{fixtures_folder}/productivePhasePermanentCrops/valid-0-value.json"
342
+ ) as f:
343
+ data = json.load(f)
344
+ assert validate_permanent_crop_productive_phase(data, "practices") is True
345
+
346
+ with open(
347
+ f"{fixtures_folder}/productivePhasePermanentCrops/valid-no-value.json"
348
+ ) as f:
349
+ data = json.load(f)
350
+ assert validate_permanent_crop_productive_phase(data, "practices") is True
351
+
352
+
353
+ def test_validate_permanent_crop_productive_phase_invalid():
354
+ with open(f"{fixtures_folder}/productivePhasePermanentCrops/invalid.json") as f:
355
+ data = json.load(f)
356
+ assert validate_permanent_crop_productive_phase(data) == {
357
+ "level": "error",
358
+ "dataPath": ".practices",
359
+ "message": "must add the term productivePhasePermanentCrops",
360
+ }
361
+
362
+
363
+ def test_validate_primaryPercent_valid():
364
+ # no practices is valid
365
+ assert validate_primaryPercent({}, {}) is True
366
+
367
+ with open(f"{fixtures_folder}/processingOperation/valid.json") as f:
368
+ data = json.load(f)
369
+ assert validate_primaryPercent(data, data.get("site"), "practices") is True
370
+
371
+ with open(f"{fixtures_folder}/processingOperation/valid-cropland.json") as f:
372
+ data = json.load(f)
373
+ assert validate_primaryPercent(data, data.get("site"), "practices") is True
374
+
375
+ with open(f"{fixtures_folder}/primaryPercent/valid.json") as f:
376
+ data = json.load(f)
377
+ assert validate_primaryPercent(data, data.get("site"), "practices") is True
378
+
379
+
380
+ def test_validate_primaryPercent_invalid():
381
+ with open(f"{fixtures_folder}/primaryPercent/invalid.json") as f:
382
+ data = json.load(f)
383
+ assert validate_primaryPercent(data, data.get("site"), "practices") == {
384
+ "level": "error",
385
+ "dataPath": ".practices[0]",
386
+ "message": "primaryPercent not allowed on this siteType",
387
+ "params": {"current": "cropland", "expected": ["agri-food processor"]},
388
+ }
389
+
390
+
391
+ def test_validate_processing_operation_valid():
392
+ # no practices is valid
393
+ assert validate_processing_operation({}, {}) is True
394
+
395
+ with open(f"{fixtures_folder}/processingOperation/valid.json") as f:
396
+ data = json.load(f)
397
+ assert validate_processing_operation(data, data.get("site"), "practices") is True
398
+
399
+ with open(f"{fixtures_folder}/processingOperation/valid-cropland.json") as f:
400
+ data = json.load(f)
401
+ assert validate_processing_operation(data, data.get("site"), "practices") is True
402
+
403
+
404
+ def test_validate_processing_operation_invalid():
405
+ with open(f"{fixtures_folder}/processingOperation/invalid.json") as f:
406
+ data = json.load(f)
407
+ assert validate_processing_operation(data, data.get("site"), "practices") == {
408
+ "level": "error",
409
+ "dataPath": ".practices",
410
+ "message": "must have a primary processing operation",
411
+ }
412
+
413
+ with open(f"{fixtures_folder}/processingOperation/invalid-no-primary.json") as f:
414
+ data = json.load(f)
415
+ assert validate_processing_operation(data, data.get("site"), "practices") == {
416
+ "level": "error",
417
+ "dataPath": ".practices",
418
+ "message": "must have a primary processing operation",
419
+ }
420
+
421
+
422
+ def test_validate_landCover_match_products_valid():
423
+ # no practices is valid
424
+ assert validate_landCover_match_products({}, {}) is True
425
+
426
+ with open(f"{fixtures_folder}/landCover-products/valid.json") as f:
427
+ data = json.load(f)
428
+ assert (
429
+ validate_landCover_match_products(data, data.get("site"), "practices") is True
430
+ )
431
+
432
+ with open(f"{fixtures_folder}/landCover-products/valid-coverCrop.json") as f:
433
+ data = json.load(f)
434
+ assert (
435
+ validate_landCover_match_products(data, data.get("site"), "practices") is True
436
+ )
437
+
438
+
439
+ def test_validate_landCover_match_products_invalid():
440
+ with open(f"{fixtures_folder}/landCover-products/invalid.json") as f:
441
+ data = json.load(f)
442
+ assert validate_landCover_match_products(data, data.get("site"), "practices") == {
443
+ "level": "error",
444
+ "dataPath": ".practices",
445
+ "message": "at least one landCover practice must match an equivalent product",
446
+ "params": {"current": ["abacaPlant"], "expected": ["wheatPlant"]},
447
+ }
448
+
449
+
450
+ def test_validate_practices_management_valid():
451
+ # no practices is valid
452
+ assert validate_practices_management({}, {}) is True
453
+
454
+ with open(f"{fixtures_folder}/site-management/valid.json") as f:
455
+ data = json.load(f)
456
+ assert validate_practices_management(data, data.get("site"), "practices") is True
457
+
458
+
459
+ def test_validate_practices_management_invalid():
460
+ with open(f"{fixtures_folder}/site-management/invalid.json") as f:
461
+ data = json.load(f)
462
+ assert validate_practices_management(data, data.get("site"), "practices") == {
463
+ "level": "error",
464
+ "dataPath": ".practices[0].value",
465
+ "message": "should match the site management node value",
466
+ "params": {"current": 50, "expected": 100},
467
+ }
468
+
469
+
470
+ def test_validate_irrigated_complete_has_inputs_valid():
471
+ # no practices is valid
472
+ assert validate_irrigated_complete_has_inputs({}) is True
473
+
474
+ with open(f"{fixtures_folder}/irrigated-complete/valid.json") as f:
475
+ data = json.load(f)
476
+ assert validate_irrigated_complete_has_inputs(data) is True
477
+
478
+ with open(f"{fixtures_folder}/irrigated-complete/valid-incomplete.json") as f:
479
+ data = json.load(f)
480
+ assert validate_irrigated_complete_has_inputs(data) is True
481
+
482
+
483
+ def test_validate_irrigated_complete_has_inputs_invalid():
484
+ with open(f"{fixtures_folder}/irrigated-complete/invalid.json") as f:
485
+ data = json.load(f)
486
+ assert validate_irrigated_complete_has_inputs(data) == {
487
+ "level": "error",
488
+ "dataPath": ".inputs",
489
+ "message": "must contain water inputs",
490
+ }