@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.
- package/.coveragerc +14 -0
- package/.dockerignore +19 -0
- package/.eslintignore +17 -0
- package/.eslintrc.js +11 -0
- package/.flake8 +5 -0
- package/.gitlab/issue_templates/new validation.md +82 -0
- package/.gitlab-ci.yml +216 -0
- package/.readthedocs.yml +24 -0
- package/CODEOWNERS +11 -0
- package/Dockerfile +13 -0
- package/LICENSE +21 -0
- package/MANIFEST.in +2 -0
- package/bin/hestia-validate-data +80 -0
- package/build_mocking.py +14 -0
- package/commitlint.config.js +1 -0
- package/docs/Makefile +20 -0
- package/docs/_static/styles.css +4 -0
- package/docs/_templates/custom-class-template.rst +34 -0
- package/docs/_templates/custom-module-template.rst +66 -0
- package/docs/_templates/layout.html +4 -0
- package/docs/conf.py +74 -0
- package/docs/index.rst +42 -0
- package/docs/make.bat +35 -0
- package/docs/requirements.txt +13 -0
- package/envs/.develop.env +1 -0
- package/envs/.master.env +1 -0
- package/guide-assets/.gitkeep +0 -0
- package/hestia_earth/validation/README.md +5 -0
- package/hestia_earth/validation/__init__.py +32 -0
- package/hestia_earth/validation/distribution.py +22 -0
- package/hestia_earth/validation/gee.py +162 -0
- package/hestia_earth/validation/log.py +44 -0
- package/hestia_earth/validation/models.py +141 -0
- package/hestia_earth/validation/preload_requests.py +61 -0
- package/hestia_earth/validation/terms.py +88 -0
- package/hestia_earth/validation/utils.py +444 -0
- package/hestia_earth/validation/validators/__init__.py +141 -0
- package/hestia_earth/validation/validators/aggregated_cycle.py +32 -0
- package/hestia_earth/validation/validators/aggregated_shared.py +37 -0
- package/hestia_earth/validation/validators/animal.py +88 -0
- package/hestia_earth/validation/validators/completeness.py +252 -0
- package/hestia_earth/validation/validators/cycle.py +1123 -0
- package/hestia_earth/validation/validators/distribution.py +86 -0
- package/hestia_earth/validation/validators/emission.py +109 -0
- package/hestia_earth/validation/validators/impact_assessment.py +138 -0
- package/hestia_earth/validation/validators/indicator.py +154 -0
- package/hestia_earth/validation/validators/infrastructure.py +25 -0
- package/hestia_earth/validation/validators/input.py +268 -0
- package/hestia_earth/validation/validators/management.py +131 -0
- package/hestia_earth/validation/validators/measurement.py +368 -0
- package/hestia_earth/validation/validators/organisation.py +43 -0
- package/hestia_earth/validation/validators/practice.py +590 -0
- package/hestia_earth/validation/validators/product.py +263 -0
- package/hestia_earth/validation/validators/property.py +266 -0
- package/hestia_earth/validation/validators/shared.py +940 -0
- package/hestia_earth/validation/validators/site.py +312 -0
- package/hestia_earth/validation/validators/source.py +20 -0
- package/hestia_earth/validation/validators/transformation.py +250 -0
- package/hestia_earth/validation/version.py +1 -0
- package/layer/build.sh +34 -0
- package/layer/deploy.sh +18 -0
- package/package.json +59 -0
- package/release.sh +11 -0
- package/requirements-ci.txt +6 -0
- package/requirements-test.txt +4 -0
- package/requirements.txt +2 -0
- package/run-docker-test.sh +7 -0
- package/run-docker.sh +9 -0
- package/run.py +99 -0
- package/scripts/build_docs.py +283 -0
- package/scripts/build_validation_list.py +160 -0
- package/scripts/guide-create-branch.sh +15 -0
- package/scripts/update-package-version.js +28 -0
- package/search-results.json +384 -0
- package/setup.cfg +2 -0
- package/setup.py +35 -0
- package/src/index.ts +1 -0
- package/src/validations.ts +22 -0
- package/src/version.ts +1 -0
- package/tests/Dockerfile +13 -0
- package/tests/__init__.py +3 -0
- package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-no-impactAssessment.json +64 -0
- package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-world.json +69 -0
- package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/valid.json +69 -0
- package/tests/fixtures/animal/duplicated-input-cycle/invalid.json +98 -0
- package/tests/fixtures/animal/duplicated-input-cycle/valid.json +91 -0
- package/tests/fixtures/animal/pregnancyRateTotal/invalid.json +49 -0
- package/tests/fixtures/animal/pregnancyRateTotal/valid.json +60 -0
- package/tests/fixtures/animal/required/invalid.json +59 -0
- package/tests/fixtures/animal/required/valid.json +72 -0
- package/tests/fixtures/completeness/all-values/warning.json +22 -0
- package/tests/fixtures/completeness/animalPopulation/invalid.json +58 -0
- package/tests/fixtures/completeness/animalPopulation/valid-animals.json +71 -0
- package/tests/fixtures/completeness/animalPopulation/valid-incomplete.json +58 -0
- package/tests/fixtures/completeness/animalPopulation/valid-no-liveAnimals.json +37 -0
- package/tests/fixtures/completeness/blank-nodes/agri-food processor-invalid.json +52 -0
- package/tests/fixtures/completeness/blank-nodes/invalid.json +124 -0
- package/tests/fixtures/completeness/blank-nodes/valid.json +128 -0
- package/tests/fixtures/completeness/cropland/site.json +16 -0
- package/tests/fixtures/completeness/cropland/valid.json +22 -0
- package/tests/fixtures/completeness/cropland/warning.json +22 -0
- package/tests/fixtures/completeness/freshForage/error-animals.json +63 -0
- package/tests/fixtures/completeness/freshForage/error-products.json +65 -0
- package/tests/fixtures/completeness/freshForage/valid-animal-inputs.json +63 -0
- package/tests/fixtures/completeness/freshForage/valid-animals.json +63 -0
- package/tests/fixtures/completeness/freshForage/valid-not-grazing-liveAnimal.json +55 -0
- package/tests/fixtures/completeness/freshForage/valid-not-liveAnimal.json +47 -0
- package/tests/fixtures/completeness/freshForage/valid-products.json +68 -0
- package/tests/fixtures/completeness/ingredient/invalid-agri-food-processor.json +37 -0
- package/tests/fixtures/completeness/ingredient/invalid.json +49 -0
- package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-complete.json +49 -0
- package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-incomplete.json +37 -0
- package/tests/fixtures/completeness/ingredient/valid.json +49 -0
- package/tests/fixtures/completeness/material/error.json +49 -0
- package/tests/fixtures/completeness/material/valid-fuel-material.json +60 -0
- package/tests/fixtures/completeness/material/valid-incomplete.json +36 -0
- package/tests/fixtures/completeness/material/valid-no-fuel.json +36 -0
- package/tests/fixtures/completeness/valid.json +22 -0
- package/tests/fixtures/cycle/aboveGroundCropResidue/invalid.json +76 -0
- package/tests/fixtures/cycle/aboveGroundCropResidue/valid.json +76 -0
- package/tests/fixtures/cycle/aggregated-valid.json +102 -0
- package/tests/fixtures/cycle/coverCrop/invalid.json +64 -0
- package/tests/fixtures/cycle/coverCrop/valid-not-coverCrop.json +54 -0
- package/tests/fixtures/cycle/coverCrop/valid.json +64 -0
- package/tests/fixtures/cycle/cropResidue/complete/invalid.json +56 -0
- package/tests/fixtures/cycle/cropResidue/complete/valid.json +82 -0
- package/tests/fixtures/cycle/cropResidue/incomplete/invalid.json +42 -0
- package/tests/fixtures/cycle/cropResidue/incomplete/valid.json +56 -0
- package/tests/fixtures/cycle/dates/invalid-emissions.json +70 -0
- package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/invalid.json +63 -0
- package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/valid.json +63 -0
- package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates-year-only.json +48 -0
- package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates.json +48 -0
- package/tests/fixtures/cycle/maximumCycleDuration/invalid.json +48 -0
- package/tests/fixtures/cycle/maximumCycleDuration/valid-dates-year-only.json +48 -0
- package/tests/fixtures/cycle/maximumCycleDuration/valid-dates.json +48 -0
- package/tests/fixtures/cycle/maximumCycleDuration/valid.json +48 -0
- package/tests/fixtures/cycle/otherSites/cycleDuration/invalid.json +52 -0
- package/tests/fixtures/cycle/otherSites/cycleDuration/valid-no-siteDuration.json +40 -0
- package/tests/fixtures/cycle/otherSites/cycleDuration/valid.json +52 -0
- package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/invalid.json +56 -0
- package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/valid.json +65 -0
- package/tests/fixtures/cycle/primary-product-as-input/invalid.json +59 -0
- package/tests/fixtures/cycle/primary-product-as-input/valid.json +48 -0
- package/tests/fixtures/cycle/product-linked-ia/cycle.json +66 -0
- package/tests/fixtures/cycle/product-linked-ia/invalid-multiple.json +58 -0
- package/tests/fixtures/cycle/product-linked-ia/valid.json +57 -0
- package/tests/fixtures/cycle/products/animals/invalid.json +69 -0
- package/tests/fixtures/cycle/products/animals/valid.json +58 -0
- package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/invalid.json +53 -0
- package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/valid.json +53 -0
- package/tests/fixtures/cycle/siteDuration/crop/invalid.json +53 -0
- package/tests/fixtures/cycle/siteDuration/crop/valid-different-duration.json +53 -0
- package/tests/fixtures/cycle/siteDuration/crop/valid-same-duration.json +53 -0
- package/tests/fixtures/cycle/siteDuration/invalid.json +41 -0
- package/tests/fixtures/cycle/siteDuration/valid-no-siteDuration.json +40 -0
- package/tests/fixtures/cycle/siteDuration/valid-otherSites.json +48 -0
- package/tests/fixtures/cycle/siteDuration/valid.json +45 -0
- package/tests/fixtures/cycle/substrate/required/invalid.json +50 -0
- package/tests/fixtures/cycle/substrate/required/valid.json +60 -0
- package/tests/fixtures/cycle/valid.json +343 -0
- package/tests/fixtures/emission/linked-terms/inputs/invalid.json +78 -0
- package/tests/fixtures/emission/linked-terms/inputs/valid.json +106 -0
- package/tests/fixtures/emission/linked-terms/transformation/error.json +104 -0
- package/tests/fixtures/emission/linked-terms/transformation/valid.json +107 -0
- package/tests/fixtures/emission/linked-terms/transformation/warning.json +76 -0
- package/tests/fixtures/emission/methodTier-background/invalid.json +60 -0
- package/tests/fixtures/emission/methodTier-background/valid.json +60 -0
- package/tests/fixtures/emission/not-relevant/invalid.json +71 -0
- package/tests/fixtures/emission/not-relevant/valid.json +95 -0
- package/tests/fixtures/emission/not-relevant-methodTier/invalid.json +70 -0
- package/tests/fixtures/emission/not-relevant-methodTier/valid.json +95 -0
- package/tests/fixtures/impactAssessment/aggregated-valid.json +43 -0
- package/tests/fixtures/impactAssessment/cycle-contains-product/invalid.json +34 -0
- package/tests/fixtures/impactAssessment/cycle-contains-product/valid.json +34 -0
- package/tests/fixtures/impactAssessment/cycle-endDate/invalid.json +26 -0
- package/tests/fixtures/impactAssessment/cycle-endDate/valid.json +26 -0
- package/tests/fixtures/impactAssessment/valid.json +93 -0
- package/tests/fixtures/indicator/characterisedIndicator-methodModel/invalid.json +52 -0
- package/tests/fixtures/indicator/characterisedIndicator-methodModel/valid.json +52 -0
- package/tests/fixtures/indicator/ionisingCompounds/invalid.json +23 -0
- package/tests/fixtures/indicator/ionisingCompounds/valid.json +23 -0
- package/tests/fixtures/indicator/landTransformation/invalid-grouped.json +257 -0
- package/tests/fixtures/indicator/landTransformation/invalid.json +100 -0
- package/tests/fixtures/indicator/landTransformation/valid-grouped-full.json +507 -0
- package/tests/fixtures/indicator/landTransformation/valid-grouped.json +507 -0
- package/tests/fixtures/indicator/landTransformation/valid.json +100 -0
- package/tests/fixtures/infrastructure/lifespan/invalid.json +26 -0
- package/tests/fixtures/infrastructure/lifespan/valid.json +45 -0
- package/tests/fixtures/input/animalFeed-fate/invalid.json +103 -0
- package/tests/fixtures/input/animalFeed-fate/valid.json +90 -0
- package/tests/fixtures/input/country/invalid.json +64 -0
- package/tests/fixtures/input/country/valid.json +64 -0
- package/tests/fixtures/input/distribution/animalHousing.json +103 -0
- package/tests/fixtures/input/distribution/complete/invalid.json +177 -0
- package/tests/fixtures/input/distribution/complete/valid.json +163 -0
- package/tests/fixtures/input/distribution/incomplete/valid.json +139 -0
- package/tests/fixtures/input/impactAssessment/invalid.json +99 -0
- package/tests/fixtures/input/impactAssessment/valid.json +89 -0
- package/tests/fixtures/input/input-as-product/invalid.json +57 -0
- package/tests/fixtures/input/input-as-product/valid.json +59 -0
- package/tests/fixtures/input/mustIncludeId/invalid.json +13 -0
- package/tests/fixtures/input/mustIncludeId/valid-multiple-ids.json +31 -0
- package/tests/fixtures/input/mustIncludeId/valid.json +22 -0
- package/tests/fixtures/input/saplings/invalid.json +58 -0
- package/tests/fixtures/input/saplings/valid-no-saplings.json +58 -0
- package/tests/fixtures/input/saplings/valid-not-plantation.json +58 -0
- package/tests/fixtures/input/saplings/valid.json +58 -0
- package/tests/fixtures/integration/distribution/product-yield-invalid.json +54 -0
- package/tests/fixtures/management/cycle-overlap/cycles.json +39 -0
- package/tests/fixtures/management/cycle-overlap/invalid.json +26 -0
- package/tests/fixtures/management/cycle-overlap/valid.json +26 -0
- package/tests/fixtures/management/exists/invalid.json +13 -0
- package/tests/fixtures/management/exists/valid.json +25 -0
- package/tests/fixtures/management/fallow-dates/invalid.json +24 -0
- package/tests/fixtures/management/fallow-dates/valid.json +24 -0
- package/tests/fixtures/management/termType/invalid-cropland.json +35 -0
- package/tests/fixtures/management/termType/invalid-permanent-pasture.json +25 -0
- package/tests/fixtures/management/termType/valid-cropland.json +55 -0
- package/tests/fixtures/management/termType/valid-no-management.json +13 -0
- package/tests/fixtures/management/termType/valid-permanent-pasture.json +35 -0
- package/tests/fixtures/measurement/depths/invalid.json +44 -0
- package/tests/fixtures/measurement/depths/valid.json +50 -0
- package/tests/fixtures/measurement/models/valid.json +33 -0
- package/tests/fixtures/measurement/models/warning-no-value.json +30 -0
- package/tests/fixtures/measurement/models/warning.json +33 -0
- package/tests/fixtures/measurement/pond-measurements/invalid.json +11 -0
- package/tests/fixtures/measurement/pond-measurements/valid.json +23 -0
- package/tests/fixtures/measurement/required-depths/error.json +71 -0
- package/tests/fixtures/measurement/required-depths/valid.json +126 -0
- package/tests/fixtures/measurement/required-depths/warning.json +29 -0
- package/tests/fixtures/measurement/soilTexture/missing-texture-value.json +227 -0
- package/tests/fixtures/measurement/soilTexture/percent-invalid.json +110 -0
- package/tests/fixtures/measurement/soilTexture/percent-missing-value.json +43 -0
- package/tests/fixtures/measurement/soilTexture/percent-valid.json +110 -0
- package/tests/fixtures/measurement/startDate-endDate-required/invalid.json +32 -0
- package/tests/fixtures/measurement/startDate-endDate-required/valid.json +46 -0
- package/tests/fixtures/measurement/unique/invalid.json +28 -0
- package/tests/fixtures/measurement/unique/valid.json +16 -0
- package/tests/fixtures/measurement/value-length/invalid.json +46 -0
- package/tests/fixtures/measurement/value-length/valid.json +44 -0
- package/tests/fixtures/measurement/water-salinity/invalid.json +33 -0
- package/tests/fixtures/measurement/water-salinity/valid-brakish.json +40 -0
- package/tests/fixtures/measurement/water-salinity/valid.json +33 -0
- package/tests/fixtures/organisation/valid.json +26 -0
- package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/invalid.json +63 -0
- package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/valid.json +63 -0
- package/tests/fixtures/practice/defaultValue/invalid.json +12 -0
- package/tests/fixtures/practice/defaultValue/valid.json +15 -0
- package/tests/fixtures/practice/excretaManagement/invalid.json +50 -0
- package/tests/fixtures/practice/excretaManagement/valid.json +60 -0
- package/tests/fixtures/practice/irrigated-complete/invalid.json +47 -0
- package/tests/fixtures/practice/irrigated-complete/valid-incomplete.json +47 -0
- package/tests/fixtures/practice/irrigated-complete/valid.json +60 -0
- package/tests/fixtures/practice/landCover-products/invalid.json +58 -0
- package/tests/fixtures/practice/landCover-products/valid-coverCrop.json +69 -0
- package/tests/fixtures/practice/landCover-products/valid.json +58 -0
- package/tests/fixtures/practice/liveAnimal-system/invalid.json +58 -0
- package/tests/fixtures/practice/liveAnimal-system/valid.json +69 -0
- package/tests/fixtures/practice/longFallowDuration/invalid.json +20 -0
- package/tests/fixtures/practice/longFallowDuration/valid.json +20 -0
- package/tests/fixtures/practice/noTillage/invalid.json +23 -0
- package/tests/fixtures/practice/noTillage/valid-value-not-100.json +23 -0
- package/tests/fixtures/practice/noTillage/valid.json +21 -0
- package/tests/fixtures/practice/pastureGrass/key-termType/invalid.json +16 -0
- package/tests/fixtures/practice/pastureGrass/key-termType/valid.json +16 -0
- package/tests/fixtures/practice/pastureGrass/key-value/invalid-numbers.json +67 -0
- package/tests/fixtures/practice/pastureGrass/key-value/invalid.json +67 -0
- package/tests/fixtures/practice/pastureGrass/key-value/valid.json +67 -0
- package/tests/fixtures/practice/pastureGrass/permanent-pasture/invalid.json +37 -0
- package/tests/fixtures/practice/pastureGrass/permanent-pasture/valid.json +47 -0
- package/tests/fixtures/practice/primaryPercent/invalid.json +49 -0
- package/tests/fixtures/practice/primaryPercent/valid.json +49 -0
- package/tests/fixtures/practice/processingOperation/invalid-no-primary.json +48 -0
- package/tests/fixtures/practice/processingOperation/invalid.json +49 -0
- package/tests/fixtures/practice/processingOperation/valid-cropland.json +37 -0
- package/tests/fixtures/practice/processingOperation/valid.json +49 -0
- package/tests/fixtures/practice/productivePhasePermanentCrops/invalid.json +48 -0
- package/tests/fixtures/practice/productivePhasePermanentCrops/valid-0-value.json +58 -0
- package/tests/fixtures/practice/productivePhasePermanentCrops/valid-no-value.json +47 -0
- package/tests/fixtures/practice/productivePhasePermanentCrops/valid.json +48 -0
- package/tests/fixtures/practice/site-management/invalid.json +75 -0
- package/tests/fixtures/practice/site-management/valid.json +75 -0
- package/tests/fixtures/practice/tillage-siteType/valid.json +51 -0
- package/tests/fixtures/practice/tillage-siteType/warning.json +42 -0
- package/tests/fixtures/practice/tillage-values/invalid-fullTillage.json +61 -0
- package/tests/fixtures/practice/tillage-values/invalid-noTillage.json +61 -0
- package/tests/fixtures/practice/tillage-values/valid.json +61 -0
- package/tests/fixtures/practice/waterRegime/rice/invalid.json +59 -0
- package/tests/fixtures/practice/waterRegime/rice/valid-0-value.json +59 -0
- package/tests/fixtures/practice/waterRegime/rice/valid.json +58 -0
- package/tests/fixtures/product/economicValueShare/invalid.json +31 -0
- package/tests/fixtures/product/economicValueShare/valid.json +22 -0
- package/tests/fixtures/product/excreta/invalid.json +62 -0
- package/tests/fixtures/product/excreta/valid.json +62 -0
- package/tests/fixtures/product/excreta/warning.json +53 -0
- package/tests/fixtures/product/excreta/with-system/invalid.json +79 -0
- package/tests/fixtures/product/excreta/with-system/valid.json +88 -0
- package/tests/fixtures/product/excreta/with-system/warning.json +70 -0
- package/tests/fixtures/product/fu_ha/invalid.json +49 -0
- package/tests/fixtures/product/fu_ha/valid.json +49 -0
- package/tests/fixtures/product/primary/invalid.json +22 -0
- package/tests/fixtures/product/primary/valid.json +22 -0
- package/tests/fixtures/product/value/valid.json +26 -0
- package/tests/fixtures/product/value/value-0/error.json +40 -0
- package/tests/fixtures/product/value/value-empty/warning.json +23 -0
- package/tests/fixtures/product/yield/invalid.json +54 -0
- package/tests/fixtures/product/yield/no-value.json +75 -0
- package/tests/fixtures/product/yield/valid.json +54 -0
- package/tests/fixtures/property/default-value/valid-allowed-exception.json +61 -0
- package/tests/fixtures/property/default-value/valid.json +61 -0
- package/tests/fixtures/property/default-value/warning.json +61 -0
- package/tests/fixtures/property/termType/invalid.json +60 -0
- package/tests/fixtures/property/termType/valid.json +60 -0
- package/tests/fixtures/property/value-min-max/invalid.json +77 -0
- package/tests/fixtures/property/value-min-max/valid-skip-maximum.json +57 -0
- package/tests/fixtures/property/value-min-max/valid.json +78 -0
- package/tests/fixtures/property/valueType/invalid.json +79 -0
- package/tests/fixtures/property/valueType/valid.json +79 -0
- package/tests/fixtures/property/volatileSolidsContent/invalid.json +99 -0
- package/tests/fixtures/property/volatileSolidsContent/valid.json +99 -0
- package/tests/fixtures/shared/coordinates/invalid.json +18 -0
- package/tests/fixtures/shared/coordinates/valid.json +18 -0
- package/tests/fixtures/shared/data-duplicates/valid.json +113 -0
- package/tests/fixtures/shared/data-duplicates/warning.json +172 -0
- package/tests/fixtures/shared/duplicated-term-units/invalid-animalProduct.json +61 -0
- package/tests/fixtures/shared/duplicated-term-units/invalid-organicFertiliser.json +61 -0
- package/tests/fixtures/shared/duplicated-term-units/valid.json +49 -0
- package/tests/fixtures/shared/list-country-region/invalid.json +54 -0
- package/tests/fixtures/shared/list-country-region/valid.json +54 -0
- package/tests/fixtures/shared/list-percent-value/invalid.json +49 -0
- package/tests/fixtures/shared/list-percent-value/valid.json +52 -0
- package/tests/fixtures/shared/list-valueType/invalid.json +49 -0
- package/tests/fixtures/shared/list-valueType/valid.json +49 -0
- package/tests/fixtures/shared/list-values-sum-100/management/with-properties/valid.json +91 -0
- package/tests/fixtures/shared/list-values-sum-100/measurements/missing-soil.json +46 -0
- package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-high-value.json +63 -0
- package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-valid.json +40 -0
- package/tests/fixtures/shared/list-values-sum-100/measurements/with-depth-high-value.json +71 -0
- package/tests/fixtures/shared/list-values-sum-100/practices/total-100.json +61 -0
- package/tests/fixtures/shared/list-values-sum-100/practices/total-110.json +61 -0
- package/tests/fixtures/shared/list-values-sum-100/practices/total-90.json +61 -0
- package/tests/fixtures/shared/min-max/value-above.json +31 -0
- package/tests/fixtures/shared/min-max/value-below.json +31 -0
- package/tests/fixtures/shared/min-max/value-valid.json +45 -0
- package/tests/fixtures/shared/model/emissions/invalid.json +102 -0
- package/tests/fixtures/shared/model/emissions/valid-variable-tolerance.json +180 -0
- package/tests/fixtures/shared/model/emissions/valid.json +102 -0
- package/tests/fixtures/shared/model/impacts/invalid.json +75 -0
- package/tests/fixtures/shared/model/impacts/valid.json +75 -0
- package/tests/fixtures/shared/model/inputs/valid-no-value.json +84 -0
- package/tests/fixtures/shared/model/inputs/valid.json +87 -0
- package/tests/fixtures/shared/model/inputs/warning.json +87 -0
- package/tests/fixtures/shared/model/products/valid-no-value.json +88 -0
- package/tests/fixtures/shared/model/products/valid.json +91 -0
- package/tests/fixtures/shared/model/products/warning.json +91 -0
- package/tests/fixtures/shared/otherModel/invalid.json +69 -0
- package/tests/fixtures/shared/otherModel/valid.json +70 -0
- package/tests/fixtures/shared/properties-duplicate-values/invalid.json +61 -0
- package/tests/fixtures/shared/properties-duplicate-values/valid.json +57 -0
- package/tests/fixtures/shared/properties-same-length/invalid.json +62 -0
- package/tests/fixtures/shared/properties-same-length/valid.json +52 -0
- package/tests/fixtures/shared/unit-percent/invalid.json +34 -0
- package/tests/fixtures/shared/unit-percent/valid.json +60 -0
- package/tests/fixtures/shared/unit-percent/warning.json +52 -0
- package/tests/fixtures/site/cycles-linked-ia/invalid.json +129 -0
- package/tests/fixtures/site/cycles-linked-ia/valid.json +129 -0
- package/tests/fixtures/site/valid.json +138 -0
- package/tests/fixtures/source/valid.json +19 -0
- package/tests/fixtures/transformation/excretaManagement/invalid.json +47 -0
- package/tests/fixtures/transformation/excretaManagement/valid.json +59 -0
- package/tests/fixtures/transformation/inputs-products/invalid.json +43 -0
- package/tests/fixtures/transformation/inputs-products/valid.json +43 -0
- package/tests/fixtures/transformation/linked-emission/invalid.json +101 -0
- package/tests/fixtures/transformation/linked-emission/valid.json +107 -0
- package/tests/fixtures/transformation/previousTransformationId/invalid-no-previous.json +127 -0
- package/tests/fixtures/transformation/previousTransformationId/invalid-previous-input.json +100 -0
- package/tests/fixtures/transformation/previousTransformationId/invalid-product-input.json +106 -0
- package/tests/fixtures/transformation/previousTransformationId/invalid-wrong-order.json +136 -0
- package/tests/fixtures/transformation/previousTransformationId/valid.json +171 -0
- package/tests/integration/__init__.py +0 -0
- package/tests/integration/test_product.py +17 -0
- package/tests/test_gee.py +10 -0
- package/tests/test_utils.py +36 -0
- package/tests/test_validation.py +11 -0
- package/tests/utils.py +28 -0
- package/tests/validators/__init__.py +0 -0
- package/tests/validators/test_aggregated_cycle.py +44 -0
- package/tests/validators/test_aggregated_shared.py +63 -0
- package/tests/validators/test_animal.py +72 -0
- package/tests/validators/test_completeness.py +337 -0
- package/tests/validators/test_cycle.py +600 -0
- package/tests/validators/test_emission.py +170 -0
- package/tests/validators/test_impact_assessment.py +80 -0
- package/tests/validators/test_indicator.py +120 -0
- package/tests/validators/test_infrastructure.py +26 -0
- package/tests/validators/test_input.py +434 -0
- package/tests/validators/test_management.py +177 -0
- package/tests/validators/test_measurement.py +317 -0
- package/tests/validators/test_organisation.py +32 -0
- package/tests/validators/test_practice.py +490 -0
- package/tests/validators/test_product.py +291 -0
- package/tests/validators/test_property.py +143 -0
- package/tests/validators/test_shared.py +1139 -0
- package/tests/validators/test_site.py +151 -0
- package/tests/validators/test_source.py +15 -0
- package/tests/validators/test_transformation.py +151 -0
- package/tests/validators/test_validators.py +74 -0
- package/tsconfig.dist.json +9 -0
- 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
|
+
}
|