From 265159991035f5ac63b7510bec6cfb6ad7ef5ac9 Mon Sep 17 00:00:00 2001
From: prabinoid <38830224+prabinoid@users.noreply.github.com>
Date: Fri, 19 Jun 2026 14:52:46 +0545
Subject: [PATCH] test: remove legacy Flask unittest suite (tests/backend)
---
Makefile | 2 +-
docs/developers/development-setup.md | 2 +-
docs/developers/submit-pr.md | 4 +-
.../services/test_project_search_service.py | 2 +-
.../unit/services/users/test_osm_service.py | 2 +-
tests/backend/__init__.py | 0
tests/backend/base.py | 107 -
tests/backend/helpers/__init__.py | 0
.../helpers/test_files/2d_multi_polygon.json | 37 -
.../test_files/CHAI-Escuintla-West2.json | 1 -
.../test_files/canned_draft_project.json | 85 -
.../test_files/canned_kml_project.json | 56 -
.../test_files/canned_project_detail.json | 180 -
.../clipped_feature_collection.json | 1145 ------
.../test_files/feature_collection.json | 1145 ------
.../feature_collection_one_multipolygon.json | 1563 -------
.../helpers/test_files/multi_polygon.json | 77 -
.../test_files/multi_polygon_dissolved.json | 77 -
.../test_files/non_square_project_aoi.json | 0
.../test_files/non_square_split_results.json | 214 -
.../helpers/test_files/non_square_task.json | 38 -
.../backend/helpers/test_files/osm_sample.xml | 25 -
.../helpers/test_files/osm_user_details.json | 47 -
.../osm_user_details_changed_name.xml | 21 -
.../test_files/osm_user_details_simple.xml | 13 -
.../test_files/search_bbox_feature.json | 2917 --------------
.../test_files/search_bbox_result.json | 2930 --------------
.../test_files/self_intersecting_aoi.json | 121 -
.../helpers/test_files/split_task.json | 154 -
.../helpers/test_files/splittable_task.json | 38 -
.../test_files/tasks_from_aoi_features.json | 42 -
.../backend/helpers/test_files/test_aoi.json | 26 -
.../helpers/test_files/test_arbitrary.json | 36 -
.../backend/helpers/test_files/test_grid.json | 3576 -----------------
tests/backend/helpers/test_helpers.py | 391 --
tests/backend/integration/__init__.py | 0
tests/backend/integration/api/__init__.py | 0
.../integration/api/campaigns/__init__.py | 0
.../api/campaigns/test_resources.py | 325 --
.../integration/api/comments/__init__.py | 0
.../api/comments/test_resources.py | 318 --
.../integration/api/countries/__init__.py | 0
.../api/countries/test_resources.py | 28 -
.../integration/api/interests/__init__.py | 0
.../api/interests/test_resources.py | 335 --
.../integration/api/issues/__init__.py | 0
.../integration/api/issues/test_resources.py | 216 -
.../integration/api/licenses/__init__.py | 0
.../integration/api/licenses/test_actions.py | 55 -
.../api/licenses/test_resources.py | 240 --
.../integration/api/notifications/__init__.py | 0
.../api/notifications/test_actions.py | 52 -
.../api/notifications/test_resources.py | 477 ---
.../integration/api/organisations/__init__.py | 0
.../api/organisations/test_campaigns.py | 162 -
.../api/organisations/test_resources.py | 392 --
.../integration/api/projects/__init__.py | 0
.../integration/api/projects/test_actions.py | 435 --
.../api/projects/test_activities.py | 107 -
.../integration/api/projects/test_campaign.py | 211 -
.../api/projects/test_contributions.py | 176 -
.../api/projects/test_favourites.py | 130 -
.../api/projects/test_resources.py | 2321 -----------
.../api/projects/test_statistics.py | 99 -
.../integration/api/system/__init__.py | 0
.../api/system/test_authentication.py | 288 --
.../integration/api/system/test_banner.py | 64 -
.../integration/api/system/test_general.py | 68 -
.../api/system/test_image_upload.py | 92 -
.../integration/api/system/test_statistics.py | 30 -
.../backend/integration/api/tasks/__init__.py | 0
.../integration/api/tasks/test_actions.py | 1724 --------
.../integration/api/tasks/test_resources.py | 628 ---
.../integration/api/tasks/test_statistics.py | 264 --
.../backend/integration/api/teams/__init__.py | 0
.../integration/api/teams/test_actions.py | 480 ---
.../integration/api/teams/test_resources.py | 275 --
.../backend/integration/api/users/__init__.py | 0
.../integration/api/users/test_actions.py | 309 --
.../api/users/test_openstreetmap.py | 60 -
.../integration/api/users/test_resources.py | 692 ----
.../integration/api/users/test_statistics.py | 157 -
.../integration/api/users/test_tasks.py | 193 -
tests/backend/integration/models/__init__.py | 0
.../integration/models/postgis/__init__.py | 0
.../models/postgis/test_project.py | 130 -
.../integration/models/postgis/test_user.py | 32 -
.../backend/integration/services/__init__.py | 0
.../integration/services/grid/__init__.py | 0
.../services/grid/test_split_service.py | 117 -
.../services/messaging/__init__.py | 0
.../services/messaging/test_chat_service.py | 149 -
.../messaging/test_messaging_service.py | 241 --
.../services/messaging/test_smtp_service.py | 208 -
.../services/test_favorite_service.py | 44 -
.../test_featured_projects_services.py | 26 -
.../services/test_interests_service.py | 91 -
.../services/test_license_service.py | 42 -
.../services/test_mapping_service.py | 167 -
.../services/test_organisation_service.py | 205 -
.../services/test_project_admin_service.py | 484 ---
.../services/test_project_search_service.py | 113 -
.../services/test_project_service.py | 92 -
.../services/test_recommendation_service.py | 207 -
.../services/test_stats_service.py | 19 -
.../integration/services/test_team_service.py | 144 -
.../services/test_validation_service.py | 138 -
.../integration/services/users/__init__.py | 0
.../users/test_authentication_service.py | 172 -
.../services/users/test_osm_service.py | 31 -
.../services/users/test_user_service.py | 164 -
tests/backend/unit/__init__.py | 0
tests/backend/unit/models/__init__.py | 0
tests/backend/unit/models/dtos/__init__.py | 0
.../unit/models/dtos/test_mapping_dto.py | 28 -
.../unit/models/dtos/test_project_dto.py | 14 -
tests/backend/unit/models/postgis/__init__.py | 0
.../unit/models/postgis/test_banner.py | 85 -
.../unit/models/postgis/test_custom_editor.py | 93 -
.../unit/models/postgis/test_message.py | 127 -
.../unit/models/postgis/test_organisation.py | 49 -
.../unit/models/postgis/test_project.py | 69 -
.../unit/models/postgis/test_project_info.py | 12 -
.../backend/unit/models/postgis/test_task.py | 197 -
.../backend/unit/models/postgis/test_user.py | 35 -
tests/backend/unit/services/__init__.py | 0
tests/backend/unit/services/grid/__init__.py | 0
.../unit/services/grid/test_grid_service.py | 159 -
.../unit/services/messaging/__init__.py | 0
.../messaging/test_messaging_service.py | 97 -
.../messaging/test_template_service.py | 57 -
.../unit/services/test_mapping_service.py | 238 --
.../services/test_organisation_service.py | 64 -
.../services/test_project_admin_service.py | 137 -
.../services/test_project_search_service.py | 39 -
.../unit/services/test_project_service.py | 279 --
.../services/test_recommendation_service.py | 173 -
.../unit/services/test_stats_service.py | 203 -
.../unit/services/test_team_service.py | 79 -
.../unit/services/test_validator_service.py | 218 -
tests/backend/unit/services/users/__init__.py | 0
.../users/test_authentication_service.py | 67 -
.../unit/services/users/test_osm_service.py | 21 -
.../unit/services/users/test_user_service.py | 84 -
144 files changed, 6 insertions(+), 32111 deletions(-)
delete mode 100644 tests/backend/__init__.py
delete mode 100644 tests/backend/base.py
delete mode 100644 tests/backend/helpers/__init__.py
delete mode 100644 tests/backend/helpers/test_files/2d_multi_polygon.json
delete mode 100644 tests/backend/helpers/test_files/CHAI-Escuintla-West2.json
delete mode 100644 tests/backend/helpers/test_files/canned_draft_project.json
delete mode 100644 tests/backend/helpers/test_files/canned_kml_project.json
delete mode 100644 tests/backend/helpers/test_files/canned_project_detail.json
delete mode 100644 tests/backend/helpers/test_files/clipped_feature_collection.json
delete mode 100644 tests/backend/helpers/test_files/feature_collection.json
delete mode 100644 tests/backend/helpers/test_files/feature_collection_one_multipolygon.json
delete mode 100644 tests/backend/helpers/test_files/multi_polygon.json
delete mode 100644 tests/backend/helpers/test_files/multi_polygon_dissolved.json
delete mode 100644 tests/backend/helpers/test_files/non_square_project_aoi.json
delete mode 100644 tests/backend/helpers/test_files/non_square_split_results.json
delete mode 100644 tests/backend/helpers/test_files/non_square_task.json
delete mode 100644 tests/backend/helpers/test_files/osm_sample.xml
delete mode 100644 tests/backend/helpers/test_files/osm_user_details.json
delete mode 100644 tests/backend/helpers/test_files/osm_user_details_changed_name.xml
delete mode 100644 tests/backend/helpers/test_files/osm_user_details_simple.xml
delete mode 100644 tests/backend/helpers/test_files/search_bbox_feature.json
delete mode 100644 tests/backend/helpers/test_files/search_bbox_result.json
delete mode 100644 tests/backend/helpers/test_files/self_intersecting_aoi.json
delete mode 100644 tests/backend/helpers/test_files/split_task.json
delete mode 100644 tests/backend/helpers/test_files/splittable_task.json
delete mode 100644 tests/backend/helpers/test_files/tasks_from_aoi_features.json
delete mode 100644 tests/backend/helpers/test_files/test_aoi.json
delete mode 100644 tests/backend/helpers/test_files/test_arbitrary.json
delete mode 100644 tests/backend/helpers/test_files/test_grid.json
delete mode 100644 tests/backend/helpers/test_helpers.py
delete mode 100644 tests/backend/integration/__init__.py
delete mode 100644 tests/backend/integration/api/__init__.py
delete mode 100644 tests/backend/integration/api/campaigns/__init__.py
delete mode 100644 tests/backend/integration/api/campaigns/test_resources.py
delete mode 100644 tests/backend/integration/api/comments/__init__.py
delete mode 100644 tests/backend/integration/api/comments/test_resources.py
delete mode 100644 tests/backend/integration/api/countries/__init__.py
delete mode 100644 tests/backend/integration/api/countries/test_resources.py
delete mode 100644 tests/backend/integration/api/interests/__init__.py
delete mode 100644 tests/backend/integration/api/interests/test_resources.py
delete mode 100644 tests/backend/integration/api/issues/__init__.py
delete mode 100644 tests/backend/integration/api/issues/test_resources.py
delete mode 100644 tests/backend/integration/api/licenses/__init__.py
delete mode 100644 tests/backend/integration/api/licenses/test_actions.py
delete mode 100644 tests/backend/integration/api/licenses/test_resources.py
delete mode 100644 tests/backend/integration/api/notifications/__init__.py
delete mode 100644 tests/backend/integration/api/notifications/test_actions.py
delete mode 100644 tests/backend/integration/api/notifications/test_resources.py
delete mode 100644 tests/backend/integration/api/organisations/__init__.py
delete mode 100644 tests/backend/integration/api/organisations/test_campaigns.py
delete mode 100644 tests/backend/integration/api/organisations/test_resources.py
delete mode 100644 tests/backend/integration/api/projects/__init__.py
delete mode 100644 tests/backend/integration/api/projects/test_actions.py
delete mode 100644 tests/backend/integration/api/projects/test_activities.py
delete mode 100644 tests/backend/integration/api/projects/test_campaign.py
delete mode 100644 tests/backend/integration/api/projects/test_contributions.py
delete mode 100644 tests/backend/integration/api/projects/test_favourites.py
delete mode 100644 tests/backend/integration/api/projects/test_resources.py
delete mode 100644 tests/backend/integration/api/projects/test_statistics.py
delete mode 100644 tests/backend/integration/api/system/__init__.py
delete mode 100644 tests/backend/integration/api/system/test_authentication.py
delete mode 100644 tests/backend/integration/api/system/test_banner.py
delete mode 100644 tests/backend/integration/api/system/test_general.py
delete mode 100644 tests/backend/integration/api/system/test_image_upload.py
delete mode 100644 tests/backend/integration/api/system/test_statistics.py
delete mode 100644 tests/backend/integration/api/tasks/__init__.py
delete mode 100644 tests/backend/integration/api/tasks/test_actions.py
delete mode 100644 tests/backend/integration/api/tasks/test_resources.py
delete mode 100644 tests/backend/integration/api/tasks/test_statistics.py
delete mode 100644 tests/backend/integration/api/teams/__init__.py
delete mode 100644 tests/backend/integration/api/teams/test_actions.py
delete mode 100644 tests/backend/integration/api/teams/test_resources.py
delete mode 100644 tests/backend/integration/api/users/__init__.py
delete mode 100644 tests/backend/integration/api/users/test_actions.py
delete mode 100644 tests/backend/integration/api/users/test_openstreetmap.py
delete mode 100644 tests/backend/integration/api/users/test_resources.py
delete mode 100644 tests/backend/integration/api/users/test_statistics.py
delete mode 100644 tests/backend/integration/api/users/test_tasks.py
delete mode 100644 tests/backend/integration/models/__init__.py
delete mode 100644 tests/backend/integration/models/postgis/__init__.py
delete mode 100644 tests/backend/integration/models/postgis/test_project.py
delete mode 100644 tests/backend/integration/models/postgis/test_user.py
delete mode 100644 tests/backend/integration/services/__init__.py
delete mode 100644 tests/backend/integration/services/grid/__init__.py
delete mode 100644 tests/backend/integration/services/grid/test_split_service.py
delete mode 100644 tests/backend/integration/services/messaging/__init__.py
delete mode 100644 tests/backend/integration/services/messaging/test_chat_service.py
delete mode 100644 tests/backend/integration/services/messaging/test_messaging_service.py
delete mode 100644 tests/backend/integration/services/messaging/test_smtp_service.py
delete mode 100644 tests/backend/integration/services/test_favorite_service.py
delete mode 100644 tests/backend/integration/services/test_featured_projects_services.py
delete mode 100644 tests/backend/integration/services/test_interests_service.py
delete mode 100644 tests/backend/integration/services/test_license_service.py
delete mode 100644 tests/backend/integration/services/test_mapping_service.py
delete mode 100644 tests/backend/integration/services/test_organisation_service.py
delete mode 100644 tests/backend/integration/services/test_project_admin_service.py
delete mode 100644 tests/backend/integration/services/test_project_search_service.py
delete mode 100644 tests/backend/integration/services/test_project_service.py
delete mode 100644 tests/backend/integration/services/test_recommendation_service.py
delete mode 100644 tests/backend/integration/services/test_stats_service.py
delete mode 100644 tests/backend/integration/services/test_team_service.py
delete mode 100644 tests/backend/integration/services/test_validation_service.py
delete mode 100644 tests/backend/integration/services/users/__init__.py
delete mode 100644 tests/backend/integration/services/users/test_authentication_service.py
delete mode 100644 tests/backend/integration/services/users/test_osm_service.py
delete mode 100644 tests/backend/integration/services/users/test_user_service.py
delete mode 100644 tests/backend/unit/__init__.py
delete mode 100644 tests/backend/unit/models/__init__.py
delete mode 100644 tests/backend/unit/models/dtos/__init__.py
delete mode 100644 tests/backend/unit/models/dtos/test_mapping_dto.py
delete mode 100644 tests/backend/unit/models/dtos/test_project_dto.py
delete mode 100644 tests/backend/unit/models/postgis/__init__.py
delete mode 100644 tests/backend/unit/models/postgis/test_banner.py
delete mode 100644 tests/backend/unit/models/postgis/test_custom_editor.py
delete mode 100644 tests/backend/unit/models/postgis/test_message.py
delete mode 100644 tests/backend/unit/models/postgis/test_organisation.py
delete mode 100644 tests/backend/unit/models/postgis/test_project.py
delete mode 100644 tests/backend/unit/models/postgis/test_project_info.py
delete mode 100644 tests/backend/unit/models/postgis/test_task.py
delete mode 100644 tests/backend/unit/models/postgis/test_user.py
delete mode 100644 tests/backend/unit/services/__init__.py
delete mode 100644 tests/backend/unit/services/grid/__init__.py
delete mode 100644 tests/backend/unit/services/grid/test_grid_service.py
delete mode 100644 tests/backend/unit/services/messaging/__init__.py
delete mode 100644 tests/backend/unit/services/messaging/test_messaging_service.py
delete mode 100644 tests/backend/unit/services/messaging/test_template_service.py
delete mode 100644 tests/backend/unit/services/test_mapping_service.py
delete mode 100644 tests/backend/unit/services/test_organisation_service.py
delete mode 100644 tests/backend/unit/services/test_project_admin_service.py
delete mode 100644 tests/backend/unit/services/test_project_search_service.py
delete mode 100644 tests/backend/unit/services/test_project_service.py
delete mode 100644 tests/backend/unit/services/test_recommendation_service.py
delete mode 100644 tests/backend/unit/services/test_stats_service.py
delete mode 100644 tests/backend/unit/services/test_team_service.py
delete mode 100644 tests/backend/unit/services/test_validator_service.py
delete mode 100644 tests/backend/unit/services/users/__init__.py
delete mode 100644 tests/backend/unit/services/users/test_authentication_service.py
delete mode 100644 tests/backend/unit/services/users/test_osm_service.py
delete mode 100644 tests/backend/unit/services/users/test_user_service.py
diff --git a/Makefile b/Makefile
index 6c49dc9f9a..8ea3f06464 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,7 @@ test-frontend:
docker-compose exec frontend sh -c "cd /usr/src/app/frontend && CI=true npm test"
test-backend:
- docker-compose exec backend sh -c "python -m unittest discover tests/backend"
+ docker-compose exec tm-backend sh -c "pytest tests/api -p no:warnings"
fetch:
ifndef PRNUMBER
diff --git a/docs/developers/development-setup.md b/docs/developers/development-setup.md
index 2a360598a4..27c2913ff5 100644
--- a/docs/developers/development-setup.md
+++ b/docs/developers/development-setup.md
@@ -281,7 +281,7 @@ The project includes a suite of Unit and Integration tests that you
should run after any changes.
```
-python3 -m unittest discover tests/backend
+pytest tests/api
```
or
```
diff --git a/docs/developers/submit-pr.md b/docs/developers/submit-pr.md
index 15a4fb265f..d882482721 100644
--- a/docs/developers/submit-pr.md
+++ b/docs/developers/submit-pr.md
@@ -17,11 +17,11 @@ mode for more than a short time runs the risk of being ignored.
The backend has unit tests which can be run manually. These are the
same tests the CI support runs. To run all the tests, do this:
- python3 -m unittest discover ./tests
+ pytest tests/api
To run a specific test case, you can do it like this:
- python -m unittest tests/backend/integration/services/test_license_service.py
+ pytest tests/api/integration/services/test_license_service.py
Whenever you add a new endpoint in the backend, you should add a test
case for it.
diff --git a/tests/api/integration/services/test_project_search_service.py b/tests/api/integration/services/test_project_search_service.py
index 4ed9bbb4a5..a90148b2c1 100644
--- a/tests/api/integration/services/test_project_search_service.py
+++ b/tests/api/integration/services/test_project_search_service.py
@@ -5,7 +5,7 @@
from backend.models.postgis.project import ProjectInfo, Project
from backend.models.dtos.project_dto import ProjectSearchBBoxDTO
from backend.models.postgis.user import User
-from tests.backend.helpers.test_helpers import get_canned_json
+from tests.api.helpers.test_helpers import get_canned_json
from unittest.mock import patch, MagicMock, AsyncMock
from shapely.geometry import Polygon, box
import shapely.wkt
diff --git a/tests/api/unit/services/users/test_osm_service.py b/tests/api/unit/services/users/test_osm_service.py
index 4753817fe8..27adefd3f0 100644
--- a/tests/api/unit/services/users/test_osm_service.py
+++ b/tests/api/unit/services/users/test_osm_service.py
@@ -1,6 +1,6 @@
import pytest
from backend.services.users.osm_service import OSMService, OSMServiceError
-from tests.backend.helpers.test_helpers import get_canned_osm_user_json_details
+from tests.api.helpers.test_helpers import get_canned_osm_user_json_details
class TestOsmService:
diff --git a/tests/backend/__init__.py b/tests/backend/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/tests/backend/base.py b/tests/backend/base.py
deleted file mode 100644
index a322aabe80..0000000000
--- a/tests/backend/base.py
+++ /dev/null
@@ -1,107 +0,0 @@
-import os
-import unittest
-from typing import Optional
-
-import geojson
-from flask import Flask
-from flask_sqlalchemy import SQLAlchemy
-from shapely.geometry import shape
-
-from backend import create_app, db
-
-
-def clean_db(db):
- for table in reversed(db.metadata.sorted_tables):
- db.session.execute(table.delete())
-
-
-class BaseTestCase(unittest.TestCase):
- DEFAULT_PRECISION: Optional[int]
- app: Optional[Flask]
- db: Optional[SQLAlchemy]
-
- @classmethod
- def setUpClass(cls):
- super(BaseTestCase, cls).setUpClass()
- cls.DEFAULT_PRECISION = geojson.geometry.DEFAULT_PRECISION
- # OSM uses 7, which means the worst error of longitude is ±5.56595 mm
- # at the equator. The worst error for 6 decimal places of longitude is
- # ±5.56595 cm at the equator. This is the default, and realistically
- # is probably more than enough for the TM.
- geojson.geometry.DEFAULT_PRECISION = 7
-
- # Set the "TM_ENVIRONMENT" environment variable to "test" to use the test configuration
- os.environ["TM_ENVIRONMENT"] = "test"
- cls.app = create_app("backend.config.TestEnvironmentConfig")
- cls.app.config.update({"TESTING": True})
- cls.db = db
- cls.db.app = cls.app
- with cls.app.app_context():
- cls.db.create_all()
-
- @classmethod
- def tearDownClass(cls):
- geojson.geometry.DEFAULT_PRECISION = cls.DEFAULT_PRECISION
- with cls.app.app_context():
- db.session.remove()
- cls.db.drop_all()
- if cls.app in cls.db.engines:
- cls.db.engines[cls.app].dispose()
- if None in cls.db.engines:
- cls.db.engines[None].dispose()
- super(BaseTestCase, cls).tearDownClass()
-
- def setUp(self):
- super(BaseTestCase, self).setUp()
- self.client = self.app.test_client()
- self.app_context = self.app.app_context()
- self.app_context.push()
- clean_db(self.db)
-
- def tearDown(self):
- super(BaseTestCase, self).tearDown()
- self.db.session.rollback()
- self.db.session.close()
- self.app_context.pop()
-
- # Code modified from https://github.com/larsbutler/oq-engine/blob/master/tests/utils/helpers.py
- # Note: Was originally in test_resources.py (author Aadesh-Baral)
- def assertDeepAlmostEqual(self, expected, actual, *args, **kwargs):
- """
- Assert that two complex structures have almost equal contents.
-
- Compares lists, dicts and tuples recursively. Checks numeric values
- using test_case's :py:meth:`unittest.TestCase.assertAlmostEqual` and
- checks all other values with :py:meth:`unittest.TestCase.assertEqual`.
- Accepts additional positional and keyword arguments and pass those
- intact to assertAlmostEqual() (that's how you specify comparison
- precision).
-
- :type test_case: :py:class:`unittest.TestCase` object
- """
- kwargs.pop("__trace", "ROOT")
- if (
- hasattr(expected, "__geo_interface__")
- and hasattr(actual, "__geo_interface__")
- and expected.__geo_interface__["type"] == actual.__geo_interface__["type"]
- and expected.__geo_interface__["type"]
- not in ["Feature", "FeatureCollection"]
- ):
- shape_expected = shape(expected)
- shape_actual = shape(actual)
- assert shape_expected.equals(shape_actual)
- elif isinstance(expected, (int, float, complex)):
- self.assertAlmostEqual(expected, actual, *args, **kwargs)
- elif isinstance(expected, (list, tuple)):
- self.assertEqual(len(expected), len(actual))
- for index in range(len(expected)):
- v1, v2 = expected[index], actual[index]
- self.assertDeepAlmostEqual(v1, v2, __trace=repr(index), *args, **kwargs)
- elif isinstance(expected, dict):
- self.assertEqual(set(expected), set(actual))
- for key in expected:
- self.assertDeepAlmostEqual(
- expected[key], actual[key], __trace=repr(key), *args, **kwargs
- )
- else:
- self.assertEqual(expected, actual)
diff --git a/tests/backend/helpers/__init__.py b/tests/backend/helpers/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/tests/backend/helpers/test_files/2d_multi_polygon.json b/tests/backend/helpers/test_files/2d_multi_polygon.json
deleted file mode 100644
index 164125cc5f..0000000000
--- a/tests/backend/helpers/test_files/2d_multi_polygon.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "coordinates": [
- [
- [
- [
- -4.65996216497632,
- 55.95041925350509
- ],
- [
- -4.95173413390339,
- 56.2627945145455
- ],
- [
- -4.67367146099783,
- 56.2434516969104
- ],
- [
- -4.66709656284914,
- 56.2435936767028
- ],
- [
- -4.0046243330544,
- 56.03981437664169
- ],
- [
- -4.35742797997559,
- 55.48727395069889
- ],
- [
- -4.65996216497632,
- 55.95041925350509
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
-}
diff --git a/tests/backend/helpers/test_files/CHAI-Escuintla-West2.json b/tests/backend/helpers/test_files/CHAI-Escuintla-West2.json
deleted file mode 100644
index eec661d63c..0000000000
--- a/tests/backend/helpers/test_files/CHAI-Escuintla-West2.json
+++ /dev/null
@@ -1 +0,0 @@
-{"areaOfInterest":{"type":"FeatureCollection","features":[{"type":"Feature","id":"way/-203564","geometry":{"type":"LineString","coordinates":[[-10127048.178416166,1617084.2643527186],[-10127124.615444696,1564294.9416937805],[-10134672.771987133,1564333.1602070213],[-10139899.153796503,1564562.4712926599],[-10145603.267032227,1565135.7490041214],[-10150953.859012537,1565699.4720884543],[-10154116.441057198,1566205.8674002888],[-10162018.118856166,1567973.4736797952],[-10164273.011190526,1568575.4152773896],[-10171639.629792018,1571585.1232656306],[-10178710.054908102,1574566.1673690565],[-10183783.562660413,1576926.1606175983],[-10189716.986981722,1579343.4816372513],[-10189134.154640723,1580021.8602626226],[-10189640.549953194,1581149.3064306113],[-10189248.810182959,1582228.9794543462],[-10189363.465725195,1583595.29133491],[-10187490.758532364,1585200.4689291308],[-10186497.07716483,1586604.99932385],[-10186076.673509594,1588028.6389762075],[-10184366.395001413,1589519.1610274045],[-10183888.663575057,1592051.13758973],[-10181691.099011812,1594200.9290093365],[-10180936.28335746,1595271.047406339],[-10180668.753758166,1596197.8463731967],[-10179980.820503633,1596885.7796285297],[-10179933.047361221,1597545.0489974308],[-10180525.434329813,1598080.108195309],[-10179684.627019336,1598538.73036506],[-10179598.635362104,1599006.907163535],[-10180143.249188283,1600086.580187673],[-10180019.03901734,1602064.3882947403],[-10180334.341759047,1602838.3132062345],[-10180171.9130744,1603354.263147198],[-10179942.601989927,1603545.3557177363],[-10180620.980615752,1604997.6592547125],[-10181442.678669931,1605045.4323972866],[-10181328.023126582,1605666.4832528231],[-10180592.316729637,1606402.1896499498],[-10180754.745415399,1607797.1654164798],[-10181165.594441932,1608523.3171851905],[-10180955.392613756,1609536.1078099879],[-10179980.820503633,1610204.9318074128],[-10179512.64370487,1610997.9659759416],[-10178442.525308808,1611303.7140886895],[-10174018.73229732,1612870.6731685624],[-10173273.47127167,1612813.3453974952],[-10173111.042587021,1613176.4212819359],[-10172919.950016256,1614141.4387640653],[-10172776.630587902,1615240.2210453018],[-10171916.714020018,1615536.414529353],[-10171649.184420723,1617246.6930375884],[-10170598.175282072,1617514.222636646],[-10170177.77162572,1617944.1809211902],[-10168821.014374068,1617982.3994346226],[-10166518.348897293,1619950.6529135099],[-10166059.726727236,1619998.4260565552],[-10166069.28135594,1619750.0057145548],[-10167330.492322769,1617686.2059509377],[-10166986.525694946,1617437.785608549],[-10167273.16455165,1616960.0541812328],[-10167340.046951473,1616224.3477844433],[-10167999.316319888,1614647.8340763669],[-10167550.248778535,1613243.3036815731],[-10168534.37551736,1611676.3446018011],[-10168123.526490832,1610625.3354631204],[-10167043.853466062,1611246.386317547],[-10161425.731887572,1609660.3179806576],[-10161263.30320181,1611208.1678030351],[-10160776.017146748,1611896.1010576806],[-10159858.772807743,1612134.9667713104],[-10159858.772807743,1612861.118539615],[-10158635.780354623,1612746.4629975522],[-10158588.00721221,1612498.0426552794],[-10159381.041380275,1610816.428033054],[-10159228.16732433,1610071.1670079106],[-10159533.915437331,1609106.1495251525],[-10147571.520510998,1606937.248847834],[-10147151.116854647,1607233.4423329392],[-10146587.393771054,1606660.1646199096],[-10146358.082686583,1607099.6775324112],[-10146252.98177305,1608074.2496439232],[-10146482.292857524,1608446.8801567464],[-10146243.427144347,1609306.7967242857],[-10145889.905888932,1610281.368835586],[-10145373.955947755,1611074.4030037387],[-10144619.1402934,1611064.848375511],[-10144399.383836519,1612058.529743294],[-10144284.728294283,1612268.731571024],[-10144466.266236342,1613558.6064233307],[-10144236.95515187,1615230.6664169363],[-10144733.795835637,1615756.1709864808],[-10144819.78749287,1616673.4153254433],[-10145373.955947755,1617198.9198945775],[-10143549.021897338,1618995.1900599198],[-10143185.946013218,1619979.3167994628],[-10141943.844302688,1621307.4101653951],[-10141246.356420564,1621603.6036501292],[-10140749.515735684,1621412.5110790848],[-10140567.977793625,1620896.5611379454],[-10140099.800995972,1620781.9055963007],[-10139536.077912383,1620285.0649124421],[-10138943.690942677,1620829.678738686],[-10137902.236432731,1622119.553590554],[-10136669.689352019,1622367.9739328555],[-10135895.764440253,1623428.5377007416],[-10133717.309134422,1623132.3442154143],[-10133354.23324919,1621985.7887918265],[-10133698.199877013,1620848.7879962025],[-10132035.694511242,1621536.7212505806],[-10131768.164913062,1622625.948903151],[-10131156.668685947,1622836.1507315093],[-10131022.903887413,1623973.1515267442],[-10129933.67623394,1624670.6394095276],[-10129675.701263351,1624326.672782828],[-10128691.574524524,1623447.6469578946],[-10128825.339324169,1622482.6294750923],[-10128051.414412405,1622367.9739328555],[-10127344.371900463,1621125.8722229986],[-10127554.573728638,1619683.1233138966],[-10127048.178416166,1617084.2643527186]]},"properties":null}]},"clipToAoi":true,"grid":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1562984.3540953137],[-10189973.112928126,1565430.3390000015],[-10187527.128023438,1565430.3390000015],[-10187527.128023438,1562984.3540953137],[-10189973.112928126,1562984.3540953137]]]]},"properties":{"x":4026,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1565430.3390000015],[-10189973.112928126,1567876.3239046894],[-10187527.128023438,1567876.3239046894],[-10187527.128023438,1565430.3390000015],[-10189973.112928126,1565430.3390000015]]]]},"properties":{"x":4026,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1567876.3239046894],[-10189973.112928126,1570322.3088093735],[-10187527.128023438,1570322.3088093735],[-10187527.128023438,1567876.3239046894],[-10189973.112928126,1567876.3239046894]]]]},"properties":{"x":4026,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1570322.3088093735],[-10189973.112928126,1572768.2937140614],[-10187527.128023438,1572768.2937140614],[-10187527.128023438,1570322.3088093735],[-10189973.112928126,1570322.3088093735]]]]},"properties":{"x":4026,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1572768.2937140614],[-10189973.112928126,1575214.2786187492],[-10187527.128023438,1575214.2786187492],[-10187527.128023438,1572768.2937140614],[-10189973.112928126,1572768.2937140614]]]]},"properties":{"x":4026,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1575214.2786187492],[-10189973.112928126,1577660.263523437],[-10187527.128023438,1577660.263523437],[-10187527.128023438,1575214.2786187492],[-10189973.112928126,1575214.2786187492]]]]},"properties":{"x":4026,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1577660.263523437],[-10189973.112928126,1580106.248428125],[-10187527.128023438,1580106.248428125],[-10187527.128023438,1577660.263523437],[-10189973.112928126,1577660.263523437]]]]},"properties":{"x":4026,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1580106.248428125],[-10189973.112928126,1582552.2333328128],[-10187527.128023438,1582552.2333328128],[-10187527.128023438,1580106.248428125],[-10189973.112928126,1580106.248428125]]]]},"properties":{"x":4026,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1582552.2333328128],[-10189973.112928126,1584998.2182375006],[-10187527.128023438,1584998.2182375006],[-10187527.128023438,1582552.2333328128],[-10189973.112928126,1582552.2333328128]]]]},"properties":{"x":4026,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1584998.2182375006],[-10189973.112928126,1587444.2031421885],[-10187527.128023438,1587444.2031421885],[-10187527.128023438,1584998.2182375006],[-10189973.112928126,1584998.2182375006]]]]},"properties":{"x":4026,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1587444.2031421885],[-10189973.112928126,1589890.1880468763],[-10187527.128023438,1589890.1880468763],[-10187527.128023438,1587444.2031421885],[-10189973.112928126,1587444.2031421885]]]]},"properties":{"x":4026,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1589890.1880468763],[-10189973.112928126,1592336.1729515642],[-10187527.128023438,1592336.1729515642],[-10187527.128023438,1589890.1880468763],[-10189973.112928126,1589890.1880468763]]]]},"properties":{"x":4026,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1592336.1729515642],[-10189973.112928126,1594782.1578562483],[-10187527.128023438,1594782.1578562483],[-10187527.128023438,1592336.1729515642],[-10189973.112928126,1592336.1729515642]]]]},"properties":{"x":4026,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1594782.1578562483],[-10189973.112928126,1597228.1427609362],[-10187527.128023438,1597228.1427609362],[-10187527.128023438,1594782.1578562483],[-10189973.112928126,1594782.1578562483]]]]},"properties":{"x":4026,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1597228.1427609362],[-10189973.112928126,1599674.127665624],[-10187527.128023438,1599674.127665624],[-10187527.128023438,1597228.1427609362],[-10189973.112928126,1597228.1427609362]]]]},"properties":{"x":4026,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1599674.127665624],[-10189973.112928126,1602120.1125703119],[-10187527.128023438,1602120.1125703119],[-10187527.128023438,1599674.127665624],[-10189973.112928126,1599674.127665624]]]]},"properties":{"x":4026,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1602120.1125703119],[-10189973.112928126,1604566.0974749997],[-10187527.128023438,1604566.0974749997],[-10187527.128023438,1602120.1125703119],[-10189973.112928126,1602120.1125703119]]]]},"properties":{"x":4026,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1604566.0974749997],[-10189973.112928126,1607012.0823796876],[-10187527.128023438,1607012.0823796876],[-10187527.128023438,1604566.0974749997],[-10189973.112928126,1604566.0974749997]]]]},"properties":{"x":4026,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1607012.0823796876],[-10189973.112928126,1609458.0672843754],[-10187527.128023438,1609458.0672843754],[-10187527.128023438,1607012.0823796876],[-10189973.112928126,1607012.0823796876]]]]},"properties":{"x":4026,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1609458.0672843754],[-10189973.112928126,1611904.0521890633],[-10187527.128023438,1611904.0521890633],[-10187527.128023438,1609458.0672843754],[-10189973.112928126,1609458.0672843754]]]]},"properties":{"x":4026,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1611904.0521890633],[-10189973.112928126,1614350.0370937511],[-10187527.128023438,1614350.0370937511],[-10187527.128023438,1611904.0521890633],[-10189973.112928126,1611904.0521890633]]]]},"properties":{"x":4026,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1614350.0370937511],[-10189973.112928126,1616796.021998439],[-10187527.128023438,1616796.021998439],[-10187527.128023438,1614350.0370937511],[-10189973.112928126,1614350.0370937511]]]]},"properties":{"x":4026,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1616796.021998439],[-10189973.112928126,1619242.0069031268],[-10187527.128023438,1619242.0069031268],[-10187527.128023438,1616796.021998439],[-10189973.112928126,1616796.021998439]]]]},"properties":{"x":4026,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1619242.0069031268],[-10189973.112928126,1621687.991807811],[-10187527.128023438,1621687.991807811],[-10187527.128023438,1619242.0069031268],[-10189973.112928126,1619242.0069031268]]]]},"properties":{"x":4026,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1621687.991807811],[-10189973.112928126,1624133.9767124988],[-10187527.128023438,1624133.9767124988],[-10187527.128023438,1621687.991807811],[-10189973.112928126,1621687.991807811]]]]},"properties":{"x":4026,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10189973.112928126,1624133.9767124988],[-10189973.112928126,1626579.9616171867],[-10187527.128023438,1626579.9616171867],[-10187527.128023438,1624133.9767124988],[-10189973.112928126,1624133.9767124988]]]]},"properties":{"x":4026,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1562984.3540953137],[-10187527.128023438,1565430.3390000015],[-10185081.14311875,1565430.3390000015],[-10185081.14311875,1562984.3540953137],[-10187527.128023438,1562984.3540953137]]]]},"properties":{"x":4027,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1565430.3390000015],[-10187527.128023438,1567876.3239046894],[-10185081.14311875,1567876.3239046894],[-10185081.14311875,1565430.3390000015],[-10187527.128023438,1565430.3390000015]]]]},"properties":{"x":4027,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1567876.3239046894],[-10187527.128023438,1570322.3088093735],[-10185081.14311875,1570322.3088093735],[-10185081.14311875,1567876.3239046894],[-10187527.128023438,1567876.3239046894]]]]},"properties":{"x":4027,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1570322.3088093735],[-10187527.128023438,1572768.2937140614],[-10185081.14311875,1572768.2937140614],[-10185081.14311875,1570322.3088093735],[-10187527.128023438,1570322.3088093735]]]]},"properties":{"x":4027,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1572768.2937140614],[-10187527.128023438,1575214.2786187492],[-10185081.14311875,1575214.2786187492],[-10185081.14311875,1572768.2937140614],[-10187527.128023438,1572768.2937140614]]]]},"properties":{"x":4027,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1575214.2786187492],[-10187527.128023438,1577660.263523437],[-10185081.14311875,1577660.263523437],[-10185081.14311875,1575214.2786187492],[-10187527.128023438,1575214.2786187492]]]]},"properties":{"x":4027,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1577660.263523437],[-10187527.128023438,1580106.248428125],[-10185081.14311875,1580106.248428125],[-10185081.14311875,1577660.263523437],[-10187527.128023438,1577660.263523437]]]]},"properties":{"x":4027,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1580106.248428125],[-10187527.128023438,1582552.2333328128],[-10185081.14311875,1582552.2333328128],[-10185081.14311875,1580106.248428125],[-10187527.128023438,1580106.248428125]]]]},"properties":{"x":4027,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1582552.2333328128],[-10187527.128023438,1584998.2182375006],[-10185081.14311875,1584998.2182375006],[-10185081.14311875,1582552.2333328128],[-10187527.128023438,1582552.2333328128]]]]},"properties":{"x":4027,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1584998.2182375006],[-10187527.128023438,1587444.2031421885],[-10185081.14311875,1587444.2031421885],[-10185081.14311875,1584998.2182375006],[-10187527.128023438,1584998.2182375006]]]]},"properties":{"x":4027,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1587444.2031421885],[-10187527.128023438,1589890.1880468763],[-10185081.14311875,1589890.1880468763],[-10185081.14311875,1587444.2031421885],[-10187527.128023438,1587444.2031421885]]]]},"properties":{"x":4027,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1589890.1880468763],[-10187527.128023438,1592336.1729515642],[-10185081.14311875,1592336.1729515642],[-10185081.14311875,1589890.1880468763],[-10187527.128023438,1589890.1880468763]]]]},"properties":{"x":4027,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1592336.1729515642],[-10187527.128023438,1594782.1578562483],[-10185081.14311875,1594782.1578562483],[-10185081.14311875,1592336.1729515642],[-10187527.128023438,1592336.1729515642]]]]},"properties":{"x":4027,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1594782.1578562483],[-10187527.128023438,1597228.1427609362],[-10185081.14311875,1597228.1427609362],[-10185081.14311875,1594782.1578562483],[-10187527.128023438,1594782.1578562483]]]]},"properties":{"x":4027,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1597228.1427609362],[-10187527.128023438,1599674.127665624],[-10185081.14311875,1599674.127665624],[-10185081.14311875,1597228.1427609362],[-10187527.128023438,1597228.1427609362]]]]},"properties":{"x":4027,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1599674.127665624],[-10187527.128023438,1602120.1125703119],[-10185081.14311875,1602120.1125703119],[-10185081.14311875,1599674.127665624],[-10187527.128023438,1599674.127665624]]]]},"properties":{"x":4027,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1602120.1125703119],[-10187527.128023438,1604566.0974749997],[-10185081.14311875,1604566.0974749997],[-10185081.14311875,1602120.1125703119],[-10187527.128023438,1602120.1125703119]]]]},"properties":{"x":4027,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1604566.0974749997],[-10187527.128023438,1607012.0823796876],[-10185081.14311875,1607012.0823796876],[-10185081.14311875,1604566.0974749997],[-10187527.128023438,1604566.0974749997]]]]},"properties":{"x":4027,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1607012.0823796876],[-10187527.128023438,1609458.0672843754],[-10185081.14311875,1609458.0672843754],[-10185081.14311875,1607012.0823796876],[-10187527.128023438,1607012.0823796876]]]]},"properties":{"x":4027,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1609458.0672843754],[-10187527.128023438,1611904.0521890633],[-10185081.14311875,1611904.0521890633],[-10185081.14311875,1609458.0672843754],[-10187527.128023438,1609458.0672843754]]]]},"properties":{"x":4027,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1611904.0521890633],[-10187527.128023438,1614350.0370937511],[-10185081.14311875,1614350.0370937511],[-10185081.14311875,1611904.0521890633],[-10187527.128023438,1611904.0521890633]]]]},"properties":{"x":4027,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1614350.0370937511],[-10187527.128023438,1616796.021998439],[-10185081.14311875,1616796.021998439],[-10185081.14311875,1614350.0370937511],[-10187527.128023438,1614350.0370937511]]]]},"properties":{"x":4027,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1616796.021998439],[-10187527.128023438,1619242.0069031268],[-10185081.14311875,1619242.0069031268],[-10185081.14311875,1616796.021998439],[-10187527.128023438,1616796.021998439]]]]},"properties":{"x":4027,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1619242.0069031268],[-10187527.128023438,1621687.991807811],[-10185081.14311875,1621687.991807811],[-10185081.14311875,1619242.0069031268],[-10187527.128023438,1619242.0069031268]]]]},"properties":{"x":4027,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1621687.991807811],[-10187527.128023438,1624133.9767124988],[-10185081.14311875,1624133.9767124988],[-10185081.14311875,1621687.991807811],[-10187527.128023438,1621687.991807811]]]]},"properties":{"x":4027,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10187527.128023438,1624133.9767124988],[-10187527.128023438,1626579.9616171867],[-10185081.14311875,1626579.9616171867],[-10185081.14311875,1624133.9767124988],[-10187527.128023438,1624133.9767124988]]]]},"properties":{"x":4027,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1562984.3540953137],[-10185081.14311875,1565430.3390000015],[-10182635.158214062,1565430.3390000015],[-10182635.158214062,1562984.3540953137],[-10185081.14311875,1562984.3540953137]]]]},"properties":{"x":4028,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1565430.3390000015],[-10185081.14311875,1567876.3239046894],[-10182635.158214062,1567876.3239046894],[-10182635.158214062,1565430.3390000015],[-10185081.14311875,1565430.3390000015]]]]},"properties":{"x":4028,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1567876.3239046894],[-10185081.14311875,1570322.3088093735],[-10182635.158214062,1570322.3088093735],[-10182635.158214062,1567876.3239046894],[-10185081.14311875,1567876.3239046894]]]]},"properties":{"x":4028,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1570322.3088093735],[-10185081.14311875,1572768.2937140614],[-10182635.158214062,1572768.2937140614],[-10182635.158214062,1570322.3088093735],[-10185081.14311875,1570322.3088093735]]]]},"properties":{"x":4028,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1572768.2937140614],[-10185081.14311875,1575214.2786187492],[-10182635.158214062,1575214.2786187492],[-10182635.158214062,1572768.2937140614],[-10185081.14311875,1572768.2937140614]]]]},"properties":{"x":4028,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1575214.2786187492],[-10185081.14311875,1577660.263523437],[-10182635.158214062,1577660.263523437],[-10182635.158214062,1575214.2786187492],[-10185081.14311875,1575214.2786187492]]]]},"properties":{"x":4028,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1577660.263523437],[-10185081.14311875,1580106.248428125],[-10182635.158214062,1580106.248428125],[-10182635.158214062,1577660.263523437],[-10185081.14311875,1577660.263523437]]]]},"properties":{"x":4028,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1580106.248428125],[-10185081.14311875,1582552.2333328128],[-10182635.158214062,1582552.2333328128],[-10182635.158214062,1580106.248428125],[-10185081.14311875,1580106.248428125]]]]},"properties":{"x":4028,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1582552.2333328128],[-10185081.14311875,1584998.2182375006],[-10182635.158214062,1584998.2182375006],[-10182635.158214062,1582552.2333328128],[-10185081.14311875,1582552.2333328128]]]]},"properties":{"x":4028,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1584998.2182375006],[-10185081.14311875,1587444.2031421885],[-10182635.158214062,1587444.2031421885],[-10182635.158214062,1584998.2182375006],[-10185081.14311875,1584998.2182375006]]]]},"properties":{"x":4028,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1587444.2031421885],[-10185081.14311875,1589890.1880468763],[-10182635.158214062,1589890.1880468763],[-10182635.158214062,1587444.2031421885],[-10185081.14311875,1587444.2031421885]]]]},"properties":{"x":4028,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1589890.1880468763],[-10185081.14311875,1592336.1729515642],[-10182635.158214062,1592336.1729515642],[-10182635.158214062,1589890.1880468763],[-10185081.14311875,1589890.1880468763]]]]},"properties":{"x":4028,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1592336.1729515642],[-10185081.14311875,1594782.1578562483],[-10182635.158214062,1594782.1578562483],[-10182635.158214062,1592336.1729515642],[-10185081.14311875,1592336.1729515642]]]]},"properties":{"x":4028,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1594782.1578562483],[-10185081.14311875,1597228.1427609362],[-10182635.158214062,1597228.1427609362],[-10182635.158214062,1594782.1578562483],[-10185081.14311875,1594782.1578562483]]]]},"properties":{"x":4028,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1597228.1427609362],[-10185081.14311875,1599674.127665624],[-10182635.158214062,1599674.127665624],[-10182635.158214062,1597228.1427609362],[-10185081.14311875,1597228.1427609362]]]]},"properties":{"x":4028,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1599674.127665624],[-10185081.14311875,1602120.1125703119],[-10182635.158214062,1602120.1125703119],[-10182635.158214062,1599674.127665624],[-10185081.14311875,1599674.127665624]]]]},"properties":{"x":4028,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1602120.1125703119],[-10185081.14311875,1604566.0974749997],[-10182635.158214062,1604566.0974749997],[-10182635.158214062,1602120.1125703119],[-10185081.14311875,1602120.1125703119]]]]},"properties":{"x":4028,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1604566.0974749997],[-10185081.14311875,1607012.0823796876],[-10182635.158214062,1607012.0823796876],[-10182635.158214062,1604566.0974749997],[-10185081.14311875,1604566.0974749997]]]]},"properties":{"x":4028,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1607012.0823796876],[-10185081.14311875,1609458.0672843754],[-10182635.158214062,1609458.0672843754],[-10182635.158214062,1607012.0823796876],[-10185081.14311875,1607012.0823796876]]]]},"properties":{"x":4028,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1609458.0672843754],[-10185081.14311875,1611904.0521890633],[-10182635.158214062,1611904.0521890633],[-10182635.158214062,1609458.0672843754],[-10185081.14311875,1609458.0672843754]]]]},"properties":{"x":4028,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1611904.0521890633],[-10185081.14311875,1614350.0370937511],[-10182635.158214062,1614350.0370937511],[-10182635.158214062,1611904.0521890633],[-10185081.14311875,1611904.0521890633]]]]},"properties":{"x":4028,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1614350.0370937511],[-10185081.14311875,1616796.021998439],[-10182635.158214062,1616796.021998439],[-10182635.158214062,1614350.0370937511],[-10185081.14311875,1614350.0370937511]]]]},"properties":{"x":4028,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1616796.021998439],[-10185081.14311875,1619242.0069031268],[-10182635.158214062,1619242.0069031268],[-10182635.158214062,1616796.021998439],[-10185081.14311875,1616796.021998439]]]]},"properties":{"x":4028,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1619242.0069031268],[-10185081.14311875,1621687.991807811],[-10182635.158214062,1621687.991807811],[-10182635.158214062,1619242.0069031268],[-10185081.14311875,1619242.0069031268]]]]},"properties":{"x":4028,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1621687.991807811],[-10185081.14311875,1624133.9767124988],[-10182635.158214062,1624133.9767124988],[-10182635.158214062,1621687.991807811],[-10185081.14311875,1621687.991807811]]]]},"properties":{"x":4028,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10185081.14311875,1624133.9767124988],[-10185081.14311875,1626579.9616171867],[-10182635.158214062,1626579.9616171867],[-10182635.158214062,1624133.9767124988],[-10185081.14311875,1624133.9767124988]]]]},"properties":{"x":4028,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1562984.3540953137],[-10182635.158214062,1565430.3390000015],[-10180189.173309376,1565430.3390000015],[-10180189.173309376,1562984.3540953137],[-10182635.158214062,1562984.3540953137]]]]},"properties":{"x":4029,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1565430.3390000015],[-10182635.158214062,1567876.3239046894],[-10180189.173309376,1567876.3239046894],[-10180189.173309376,1565430.3390000015],[-10182635.158214062,1565430.3390000015]]]]},"properties":{"x":4029,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1567876.3239046894],[-10182635.158214062,1570322.3088093735],[-10180189.173309376,1570322.3088093735],[-10180189.173309376,1567876.3239046894],[-10182635.158214062,1567876.3239046894]]]]},"properties":{"x":4029,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1570322.3088093735],[-10182635.158214062,1572768.2937140614],[-10180189.173309376,1572768.2937140614],[-10180189.173309376,1570322.3088093735],[-10182635.158214062,1570322.3088093735]]]]},"properties":{"x":4029,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1572768.2937140614],[-10182635.158214062,1575214.2786187492],[-10180189.173309376,1575214.2786187492],[-10180189.173309376,1572768.2937140614],[-10182635.158214062,1572768.2937140614]]]]},"properties":{"x":4029,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1575214.2786187492],[-10182635.158214062,1577660.263523437],[-10180189.173309376,1577660.263523437],[-10180189.173309376,1575214.2786187492],[-10182635.158214062,1575214.2786187492]]]]},"properties":{"x":4029,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1577660.263523437],[-10182635.158214062,1580106.248428125],[-10180189.173309376,1580106.248428125],[-10180189.173309376,1577660.263523437],[-10182635.158214062,1577660.263523437]]]]},"properties":{"x":4029,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1580106.248428125],[-10182635.158214062,1582552.2333328128],[-10180189.173309376,1582552.2333328128],[-10180189.173309376,1580106.248428125],[-10182635.158214062,1580106.248428125]]]]},"properties":{"x":4029,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1582552.2333328128],[-10182635.158214062,1584998.2182375006],[-10180189.173309376,1584998.2182375006],[-10180189.173309376,1582552.2333328128],[-10182635.158214062,1582552.2333328128]]]]},"properties":{"x":4029,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1584998.2182375006],[-10182635.158214062,1587444.2031421885],[-10180189.173309376,1587444.2031421885],[-10180189.173309376,1584998.2182375006],[-10182635.158214062,1584998.2182375006]]]]},"properties":{"x":4029,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1587444.2031421885],[-10182635.158214062,1589890.1880468763],[-10180189.173309376,1589890.1880468763],[-10180189.173309376,1587444.2031421885],[-10182635.158214062,1587444.2031421885]]]]},"properties":{"x":4029,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1589890.1880468763],[-10182635.158214062,1592336.1729515642],[-10180189.173309376,1592336.1729515642],[-10180189.173309376,1589890.1880468763],[-10182635.158214062,1589890.1880468763]]]]},"properties":{"x":4029,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1592336.1729515642],[-10182635.158214062,1594782.1578562483],[-10180189.173309376,1594782.1578562483],[-10180189.173309376,1592336.1729515642],[-10182635.158214062,1592336.1729515642]]]]},"properties":{"x":4029,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1594782.1578562483],[-10182635.158214062,1597228.1427609362],[-10180189.173309376,1597228.1427609362],[-10180189.173309376,1594782.1578562483],[-10182635.158214062,1594782.1578562483]]]]},"properties":{"x":4029,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1597228.1427609362],[-10182635.158214062,1599674.127665624],[-10180189.173309376,1599674.127665624],[-10180189.173309376,1597228.1427609362],[-10182635.158214062,1597228.1427609362]]]]},"properties":{"x":4029,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1599674.127665624],[-10182635.158214062,1602120.1125703119],[-10180189.173309376,1602120.1125703119],[-10180189.173309376,1599674.127665624],[-10182635.158214062,1599674.127665624]]]]},"properties":{"x":4029,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1602120.1125703119],[-10182635.158214062,1604566.0974749997],[-10180189.173309376,1604566.0974749997],[-10180189.173309376,1602120.1125703119],[-10182635.158214062,1602120.1125703119]]]]},"properties":{"x":4029,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1604566.0974749997],[-10182635.158214062,1607012.0823796876],[-10180189.173309376,1607012.0823796876],[-10180189.173309376,1604566.0974749997],[-10182635.158214062,1604566.0974749997]]]]},"properties":{"x":4029,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1607012.0823796876],[-10182635.158214062,1609458.0672843754],[-10180189.173309376,1609458.0672843754],[-10180189.173309376,1607012.0823796876],[-10182635.158214062,1607012.0823796876]]]]},"properties":{"x":4029,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1609458.0672843754],[-10182635.158214062,1611904.0521890633],[-10180189.173309376,1611904.0521890633],[-10180189.173309376,1609458.0672843754],[-10182635.158214062,1609458.0672843754]]]]},"properties":{"x":4029,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1611904.0521890633],[-10182635.158214062,1614350.0370937511],[-10180189.173309376,1614350.0370937511],[-10180189.173309376,1611904.0521890633],[-10182635.158214062,1611904.0521890633]]]]},"properties":{"x":4029,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1614350.0370937511],[-10182635.158214062,1616796.021998439],[-10180189.173309376,1616796.021998439],[-10180189.173309376,1614350.0370937511],[-10182635.158214062,1614350.0370937511]]]]},"properties":{"x":4029,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1616796.021998439],[-10182635.158214062,1619242.0069031268],[-10180189.173309376,1619242.0069031268],[-10180189.173309376,1616796.021998439],[-10182635.158214062,1616796.021998439]]]]},"properties":{"x":4029,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1619242.0069031268],[-10182635.158214062,1621687.991807811],[-10180189.173309376,1621687.991807811],[-10180189.173309376,1619242.0069031268],[-10182635.158214062,1619242.0069031268]]]]},"properties":{"x":4029,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1621687.991807811],[-10182635.158214062,1624133.9767124988],[-10180189.173309376,1624133.9767124988],[-10180189.173309376,1621687.991807811],[-10182635.158214062,1621687.991807811]]]]},"properties":{"x":4029,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10182635.158214062,1624133.9767124988],[-10182635.158214062,1626579.9616171867],[-10180189.173309376,1626579.9616171867],[-10180189.173309376,1624133.9767124988],[-10182635.158214062,1624133.9767124988]]]]},"properties":{"x":4029,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1562984.3540953137],[-10180189.173309376,1565430.3390000015],[-10177743.188404689,1565430.3390000015],[-10177743.188404689,1562984.3540953137],[-10180189.173309376,1562984.3540953137]]]]},"properties":{"x":4030,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1565430.3390000015],[-10180189.173309376,1567876.3239046894],[-10177743.188404689,1567876.3239046894],[-10177743.188404689,1565430.3390000015],[-10180189.173309376,1565430.3390000015]]]]},"properties":{"x":4030,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1567876.3239046894],[-10180189.173309376,1570322.3088093735],[-10177743.188404689,1570322.3088093735],[-10177743.188404689,1567876.3239046894],[-10180189.173309376,1567876.3239046894]]]]},"properties":{"x":4030,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1570322.3088093735],[-10180189.173309376,1572768.2937140614],[-10177743.188404689,1572768.2937140614],[-10177743.188404689,1570322.3088093735],[-10180189.173309376,1570322.3088093735]]]]},"properties":{"x":4030,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1572768.2937140614],[-10180189.173309376,1575214.2786187492],[-10177743.188404689,1575214.2786187492],[-10177743.188404689,1572768.2937140614],[-10180189.173309376,1572768.2937140614]]]]},"properties":{"x":4030,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1575214.2786187492],[-10180189.173309376,1577660.263523437],[-10177743.188404689,1577660.263523437],[-10177743.188404689,1575214.2786187492],[-10180189.173309376,1575214.2786187492]]]]},"properties":{"x":4030,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1577660.263523437],[-10180189.173309376,1580106.248428125],[-10177743.188404689,1580106.248428125],[-10177743.188404689,1577660.263523437],[-10180189.173309376,1577660.263523437]]]]},"properties":{"x":4030,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1580106.248428125],[-10180189.173309376,1582552.2333328128],[-10177743.188404689,1582552.2333328128],[-10177743.188404689,1580106.248428125],[-10180189.173309376,1580106.248428125]]]]},"properties":{"x":4030,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1582552.2333328128],[-10180189.173309376,1584998.2182375006],[-10177743.188404689,1584998.2182375006],[-10177743.188404689,1582552.2333328128],[-10180189.173309376,1582552.2333328128]]]]},"properties":{"x":4030,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1584998.2182375006],[-10180189.173309376,1587444.2031421885],[-10177743.188404689,1587444.2031421885],[-10177743.188404689,1584998.2182375006],[-10180189.173309376,1584998.2182375006]]]]},"properties":{"x":4030,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1587444.2031421885],[-10180189.173309376,1589890.1880468763],[-10177743.188404689,1589890.1880468763],[-10177743.188404689,1587444.2031421885],[-10180189.173309376,1587444.2031421885]]]]},"properties":{"x":4030,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1589890.1880468763],[-10180189.173309376,1592336.1729515642],[-10177743.188404689,1592336.1729515642],[-10177743.188404689,1589890.1880468763],[-10180189.173309376,1589890.1880468763]]]]},"properties":{"x":4030,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1592336.1729515642],[-10180189.173309376,1594782.1578562483],[-10177743.188404689,1594782.1578562483],[-10177743.188404689,1592336.1729515642],[-10180189.173309376,1592336.1729515642]]]]},"properties":{"x":4030,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1594782.1578562483],[-10180189.173309376,1597228.1427609362],[-10177743.188404689,1597228.1427609362],[-10177743.188404689,1594782.1578562483],[-10180189.173309376,1594782.1578562483]]]]},"properties":{"x":4030,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1597228.1427609362],[-10180189.173309376,1599674.127665624],[-10177743.188404689,1599674.127665624],[-10177743.188404689,1597228.1427609362],[-10180189.173309376,1597228.1427609362]]]]},"properties":{"x":4030,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1599674.127665624],[-10180189.173309376,1602120.1125703119],[-10177743.188404689,1602120.1125703119],[-10177743.188404689,1599674.127665624],[-10180189.173309376,1599674.127665624]]]]},"properties":{"x":4030,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1602120.1125703119],[-10180189.173309376,1604566.0974749997],[-10177743.188404689,1604566.0974749997],[-10177743.188404689,1602120.1125703119],[-10180189.173309376,1602120.1125703119]]]]},"properties":{"x":4030,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1604566.0974749997],[-10180189.173309376,1607012.0823796876],[-10177743.188404689,1607012.0823796876],[-10177743.188404689,1604566.0974749997],[-10180189.173309376,1604566.0974749997]]]]},"properties":{"x":4030,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1607012.0823796876],[-10180189.173309376,1609458.0672843754],[-10177743.188404689,1609458.0672843754],[-10177743.188404689,1607012.0823796876],[-10180189.173309376,1607012.0823796876]]]]},"properties":{"x":4030,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1609458.0672843754],[-10180189.173309376,1611904.0521890633],[-10177743.188404689,1611904.0521890633],[-10177743.188404689,1609458.0672843754],[-10180189.173309376,1609458.0672843754]]]]},"properties":{"x":4030,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1611904.0521890633],[-10180189.173309376,1614350.0370937511],[-10177743.188404689,1614350.0370937511],[-10177743.188404689,1611904.0521890633],[-10180189.173309376,1611904.0521890633]]]]},"properties":{"x":4030,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1614350.0370937511],[-10180189.173309376,1616796.021998439],[-10177743.188404689,1616796.021998439],[-10177743.188404689,1614350.0370937511],[-10180189.173309376,1614350.0370937511]]]]},"properties":{"x":4030,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1616796.021998439],[-10180189.173309376,1619242.0069031268],[-10177743.188404689,1619242.0069031268],[-10177743.188404689,1616796.021998439],[-10180189.173309376,1616796.021998439]]]]},"properties":{"x":4030,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1619242.0069031268],[-10180189.173309376,1621687.991807811],[-10177743.188404689,1621687.991807811],[-10177743.188404689,1619242.0069031268],[-10180189.173309376,1619242.0069031268]]]]},"properties":{"x":4030,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1621687.991807811],[-10180189.173309376,1624133.9767124988],[-10177743.188404689,1624133.9767124988],[-10177743.188404689,1621687.991807811],[-10180189.173309376,1621687.991807811]]]]},"properties":{"x":4030,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10180189.173309376,1624133.9767124988],[-10180189.173309376,1626579.9616171867],[-10177743.188404689,1626579.9616171867],[-10177743.188404689,1624133.9767124988],[-10180189.173309376,1624133.9767124988]]]]},"properties":{"x":4030,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1562984.3540953137],[-10177743.188404689,1565430.3390000015],[-10175297.2035,1565430.3390000015],[-10175297.2035,1562984.3540953137],[-10177743.188404689,1562984.3540953137]]]]},"properties":{"x":4031,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1565430.3390000015],[-10177743.188404689,1567876.3239046894],[-10175297.2035,1567876.3239046894],[-10175297.2035,1565430.3390000015],[-10177743.188404689,1565430.3390000015]]]]},"properties":{"x":4031,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1567876.3239046894],[-10177743.188404689,1570322.3088093735],[-10175297.2035,1570322.3088093735],[-10175297.2035,1567876.3239046894],[-10177743.188404689,1567876.3239046894]]]]},"properties":{"x":4031,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1570322.3088093735],[-10177743.188404689,1572768.2937140614],[-10175297.2035,1572768.2937140614],[-10175297.2035,1570322.3088093735],[-10177743.188404689,1570322.3088093735]]]]},"properties":{"x":4031,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1572768.2937140614],[-10177743.188404689,1575214.2786187492],[-10175297.2035,1575214.2786187492],[-10175297.2035,1572768.2937140614],[-10177743.188404689,1572768.2937140614]]]]},"properties":{"x":4031,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1575214.2786187492],[-10177743.188404689,1577660.263523437],[-10175297.2035,1577660.263523437],[-10175297.2035,1575214.2786187492],[-10177743.188404689,1575214.2786187492]]]]},"properties":{"x":4031,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1577660.263523437],[-10177743.188404689,1580106.248428125],[-10175297.2035,1580106.248428125],[-10175297.2035,1577660.263523437],[-10177743.188404689,1577660.263523437]]]]},"properties":{"x":4031,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1580106.248428125],[-10177743.188404689,1582552.2333328128],[-10175297.2035,1582552.2333328128],[-10175297.2035,1580106.248428125],[-10177743.188404689,1580106.248428125]]]]},"properties":{"x":4031,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1582552.2333328128],[-10177743.188404689,1584998.2182375006],[-10175297.2035,1584998.2182375006],[-10175297.2035,1582552.2333328128],[-10177743.188404689,1582552.2333328128]]]]},"properties":{"x":4031,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1584998.2182375006],[-10177743.188404689,1587444.2031421885],[-10175297.2035,1587444.2031421885],[-10175297.2035,1584998.2182375006],[-10177743.188404689,1584998.2182375006]]]]},"properties":{"x":4031,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1587444.2031421885],[-10177743.188404689,1589890.1880468763],[-10175297.2035,1589890.1880468763],[-10175297.2035,1587444.2031421885],[-10177743.188404689,1587444.2031421885]]]]},"properties":{"x":4031,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1589890.1880468763],[-10177743.188404689,1592336.1729515642],[-10175297.2035,1592336.1729515642],[-10175297.2035,1589890.1880468763],[-10177743.188404689,1589890.1880468763]]]]},"properties":{"x":4031,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1592336.1729515642],[-10177743.188404689,1594782.1578562483],[-10175297.2035,1594782.1578562483],[-10175297.2035,1592336.1729515642],[-10177743.188404689,1592336.1729515642]]]]},"properties":{"x":4031,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1594782.1578562483],[-10177743.188404689,1597228.1427609362],[-10175297.2035,1597228.1427609362],[-10175297.2035,1594782.1578562483],[-10177743.188404689,1594782.1578562483]]]]},"properties":{"x":4031,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1597228.1427609362],[-10177743.188404689,1599674.127665624],[-10175297.2035,1599674.127665624],[-10175297.2035,1597228.1427609362],[-10177743.188404689,1597228.1427609362]]]]},"properties":{"x":4031,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1599674.127665624],[-10177743.188404689,1602120.1125703119],[-10175297.2035,1602120.1125703119],[-10175297.2035,1599674.127665624],[-10177743.188404689,1599674.127665624]]]]},"properties":{"x":4031,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1602120.1125703119],[-10177743.188404689,1604566.0974749997],[-10175297.2035,1604566.0974749997],[-10175297.2035,1602120.1125703119],[-10177743.188404689,1602120.1125703119]]]]},"properties":{"x":4031,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1604566.0974749997],[-10177743.188404689,1607012.0823796876],[-10175297.2035,1607012.0823796876],[-10175297.2035,1604566.0974749997],[-10177743.188404689,1604566.0974749997]]]]},"properties":{"x":4031,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1607012.0823796876],[-10177743.188404689,1609458.0672843754],[-10175297.2035,1609458.0672843754],[-10175297.2035,1607012.0823796876],[-10177743.188404689,1607012.0823796876]]]]},"properties":{"x":4031,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1609458.0672843754],[-10177743.188404689,1611904.0521890633],[-10175297.2035,1611904.0521890633],[-10175297.2035,1609458.0672843754],[-10177743.188404689,1609458.0672843754]]]]},"properties":{"x":4031,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1611904.0521890633],[-10177743.188404689,1614350.0370937511],[-10175297.2035,1614350.0370937511],[-10175297.2035,1611904.0521890633],[-10177743.188404689,1611904.0521890633]]]]},"properties":{"x":4031,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1614350.0370937511],[-10177743.188404689,1616796.021998439],[-10175297.2035,1616796.021998439],[-10175297.2035,1614350.0370937511],[-10177743.188404689,1614350.0370937511]]]]},"properties":{"x":4031,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1616796.021998439],[-10177743.188404689,1619242.0069031268],[-10175297.2035,1619242.0069031268],[-10175297.2035,1616796.021998439],[-10177743.188404689,1616796.021998439]]]]},"properties":{"x":4031,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1619242.0069031268],[-10177743.188404689,1621687.991807811],[-10175297.2035,1621687.991807811],[-10175297.2035,1619242.0069031268],[-10177743.188404689,1619242.0069031268]]]]},"properties":{"x":4031,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1621687.991807811],[-10177743.188404689,1624133.9767124988],[-10175297.2035,1624133.9767124988],[-10175297.2035,1621687.991807811],[-10177743.188404689,1621687.991807811]]]]},"properties":{"x":4031,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10177743.188404689,1624133.9767124988],[-10177743.188404689,1626579.9616171867],[-10175297.2035,1626579.9616171867],[-10175297.2035,1624133.9767124988],[-10177743.188404689,1624133.9767124988]]]]},"properties":{"x":4031,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1562984.3540953137],[-10175297.2035,1565430.3390000015],[-10172851.218595313,1565430.3390000015],[-10172851.218595313,1562984.3540953137],[-10175297.2035,1562984.3540953137]]]]},"properties":{"x":4032,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1565430.3390000015],[-10175297.2035,1567876.3239046894],[-10172851.218595313,1567876.3239046894],[-10172851.218595313,1565430.3390000015],[-10175297.2035,1565430.3390000015]]]]},"properties":{"x":4032,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1567876.3239046894],[-10175297.2035,1570322.3088093735],[-10172851.218595313,1570322.3088093735],[-10172851.218595313,1567876.3239046894],[-10175297.2035,1567876.3239046894]]]]},"properties":{"x":4032,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1570322.3088093735],[-10175297.2035,1572768.2937140614],[-10172851.218595313,1572768.2937140614],[-10172851.218595313,1570322.3088093735],[-10175297.2035,1570322.3088093735]]]]},"properties":{"x":4032,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1572768.2937140614],[-10175297.2035,1575214.2786187492],[-10172851.218595313,1575214.2786187492],[-10172851.218595313,1572768.2937140614],[-10175297.2035,1572768.2937140614]]]]},"properties":{"x":4032,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1575214.2786187492],[-10175297.2035,1577660.263523437],[-10172851.218595313,1577660.263523437],[-10172851.218595313,1575214.2786187492],[-10175297.2035,1575214.2786187492]]]]},"properties":{"x":4032,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1577660.263523437],[-10175297.2035,1580106.248428125],[-10172851.218595313,1580106.248428125],[-10172851.218595313,1577660.263523437],[-10175297.2035,1577660.263523437]]]]},"properties":{"x":4032,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1580106.248428125],[-10175297.2035,1582552.2333328128],[-10172851.218595313,1582552.2333328128],[-10172851.218595313,1580106.248428125],[-10175297.2035,1580106.248428125]]]]},"properties":{"x":4032,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1582552.2333328128],[-10175297.2035,1584998.2182375006],[-10172851.218595313,1584998.2182375006],[-10172851.218595313,1582552.2333328128],[-10175297.2035,1582552.2333328128]]]]},"properties":{"x":4032,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1584998.2182375006],[-10175297.2035,1587444.2031421885],[-10172851.218595313,1587444.2031421885],[-10172851.218595313,1584998.2182375006],[-10175297.2035,1584998.2182375006]]]]},"properties":{"x":4032,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1587444.2031421885],[-10175297.2035,1589890.1880468763],[-10172851.218595313,1589890.1880468763],[-10172851.218595313,1587444.2031421885],[-10175297.2035,1587444.2031421885]]]]},"properties":{"x":4032,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1589890.1880468763],[-10175297.2035,1592336.1729515642],[-10172851.218595313,1592336.1729515642],[-10172851.218595313,1589890.1880468763],[-10175297.2035,1589890.1880468763]]]]},"properties":{"x":4032,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1592336.1729515642],[-10175297.2035,1594782.1578562483],[-10172851.218595313,1594782.1578562483],[-10172851.218595313,1592336.1729515642],[-10175297.2035,1592336.1729515642]]]]},"properties":{"x":4032,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1594782.1578562483],[-10175297.2035,1597228.1427609362],[-10172851.218595313,1597228.1427609362],[-10172851.218595313,1594782.1578562483],[-10175297.2035,1594782.1578562483]]]]},"properties":{"x":4032,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1597228.1427609362],[-10175297.2035,1599674.127665624],[-10172851.218595313,1599674.127665624],[-10172851.218595313,1597228.1427609362],[-10175297.2035,1597228.1427609362]]]]},"properties":{"x":4032,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1599674.127665624],[-10175297.2035,1602120.1125703119],[-10172851.218595313,1602120.1125703119],[-10172851.218595313,1599674.127665624],[-10175297.2035,1599674.127665624]]]]},"properties":{"x":4032,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1602120.1125703119],[-10175297.2035,1604566.0974749997],[-10172851.218595313,1604566.0974749997],[-10172851.218595313,1602120.1125703119],[-10175297.2035,1602120.1125703119]]]]},"properties":{"x":4032,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1604566.0974749997],[-10175297.2035,1607012.0823796876],[-10172851.218595313,1607012.0823796876],[-10172851.218595313,1604566.0974749997],[-10175297.2035,1604566.0974749997]]]]},"properties":{"x":4032,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1607012.0823796876],[-10175297.2035,1609458.0672843754],[-10172851.218595313,1609458.0672843754],[-10172851.218595313,1607012.0823796876],[-10175297.2035,1607012.0823796876]]]]},"properties":{"x":4032,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1609458.0672843754],[-10175297.2035,1611904.0521890633],[-10172851.218595313,1611904.0521890633],[-10172851.218595313,1609458.0672843754],[-10175297.2035,1609458.0672843754]]]]},"properties":{"x":4032,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1611904.0521890633],[-10175297.2035,1614350.0370937511],[-10172851.218595313,1614350.0370937511],[-10172851.218595313,1611904.0521890633],[-10175297.2035,1611904.0521890633]]]]},"properties":{"x":4032,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1614350.0370937511],[-10175297.2035,1616796.021998439],[-10172851.218595313,1616796.021998439],[-10172851.218595313,1614350.0370937511],[-10175297.2035,1614350.0370937511]]]]},"properties":{"x":4032,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1616796.021998439],[-10175297.2035,1619242.0069031268],[-10172851.218595313,1619242.0069031268],[-10172851.218595313,1616796.021998439],[-10175297.2035,1616796.021998439]]]]},"properties":{"x":4032,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1619242.0069031268],[-10175297.2035,1621687.991807811],[-10172851.218595313,1621687.991807811],[-10172851.218595313,1619242.0069031268],[-10175297.2035,1619242.0069031268]]]]},"properties":{"x":4032,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1621687.991807811],[-10175297.2035,1624133.9767124988],[-10172851.218595313,1624133.9767124988],[-10172851.218595313,1621687.991807811],[-10175297.2035,1621687.991807811]]]]},"properties":{"x":4032,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10175297.2035,1624133.9767124988],[-10175297.2035,1626579.9616171867],[-10172851.218595313,1626579.9616171867],[-10172851.218595313,1624133.9767124988],[-10175297.2035,1624133.9767124988]]]]},"properties":{"x":4032,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1562984.3540953137],[-10172851.218595313,1565430.3390000015],[-10170405.233690625,1565430.3390000015],[-10170405.233690625,1562984.3540953137],[-10172851.218595313,1562984.3540953137]]]]},"properties":{"x":4033,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1565430.3390000015],[-10172851.218595313,1567876.3239046894],[-10170405.233690625,1567876.3239046894],[-10170405.233690625,1565430.3390000015],[-10172851.218595313,1565430.3390000015]]]]},"properties":{"x":4033,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1567876.3239046894],[-10172851.218595313,1570322.3088093735],[-10170405.233690625,1570322.3088093735],[-10170405.233690625,1567876.3239046894],[-10172851.218595313,1567876.3239046894]]]]},"properties":{"x":4033,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1570322.3088093735],[-10172851.218595313,1572768.2937140614],[-10170405.233690625,1572768.2937140614],[-10170405.233690625,1570322.3088093735],[-10172851.218595313,1570322.3088093735]]]]},"properties":{"x":4033,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1572768.2937140614],[-10172851.218595313,1575214.2786187492],[-10170405.233690625,1575214.2786187492],[-10170405.233690625,1572768.2937140614],[-10172851.218595313,1572768.2937140614]]]]},"properties":{"x":4033,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1575214.2786187492],[-10172851.218595313,1577660.263523437],[-10170405.233690625,1577660.263523437],[-10170405.233690625,1575214.2786187492],[-10172851.218595313,1575214.2786187492]]]]},"properties":{"x":4033,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1577660.263523437],[-10172851.218595313,1580106.248428125],[-10170405.233690625,1580106.248428125],[-10170405.233690625,1577660.263523437],[-10172851.218595313,1577660.263523437]]]]},"properties":{"x":4033,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1580106.248428125],[-10172851.218595313,1582552.2333328128],[-10170405.233690625,1582552.2333328128],[-10170405.233690625,1580106.248428125],[-10172851.218595313,1580106.248428125]]]]},"properties":{"x":4033,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1582552.2333328128],[-10172851.218595313,1584998.2182375006],[-10170405.233690625,1584998.2182375006],[-10170405.233690625,1582552.2333328128],[-10172851.218595313,1582552.2333328128]]]]},"properties":{"x":4033,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1584998.2182375006],[-10172851.218595313,1587444.2031421885],[-10170405.233690625,1587444.2031421885],[-10170405.233690625,1584998.2182375006],[-10172851.218595313,1584998.2182375006]]]]},"properties":{"x":4033,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1587444.2031421885],[-10172851.218595313,1589890.1880468763],[-10170405.233690625,1589890.1880468763],[-10170405.233690625,1587444.2031421885],[-10172851.218595313,1587444.2031421885]]]]},"properties":{"x":4033,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1589890.1880468763],[-10172851.218595313,1592336.1729515642],[-10170405.233690625,1592336.1729515642],[-10170405.233690625,1589890.1880468763],[-10172851.218595313,1589890.1880468763]]]]},"properties":{"x":4033,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1592336.1729515642],[-10172851.218595313,1594782.1578562483],[-10170405.233690625,1594782.1578562483],[-10170405.233690625,1592336.1729515642],[-10172851.218595313,1592336.1729515642]]]]},"properties":{"x":4033,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1594782.1578562483],[-10172851.218595313,1597228.1427609362],[-10170405.233690625,1597228.1427609362],[-10170405.233690625,1594782.1578562483],[-10172851.218595313,1594782.1578562483]]]]},"properties":{"x":4033,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1597228.1427609362],[-10172851.218595313,1599674.127665624],[-10170405.233690625,1599674.127665624],[-10170405.233690625,1597228.1427609362],[-10172851.218595313,1597228.1427609362]]]]},"properties":{"x":4033,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1599674.127665624],[-10172851.218595313,1602120.1125703119],[-10170405.233690625,1602120.1125703119],[-10170405.233690625,1599674.127665624],[-10172851.218595313,1599674.127665624]]]]},"properties":{"x":4033,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1602120.1125703119],[-10172851.218595313,1604566.0974749997],[-10170405.233690625,1604566.0974749997],[-10170405.233690625,1602120.1125703119],[-10172851.218595313,1602120.1125703119]]]]},"properties":{"x":4033,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1604566.0974749997],[-10172851.218595313,1607012.0823796876],[-10170405.233690625,1607012.0823796876],[-10170405.233690625,1604566.0974749997],[-10172851.218595313,1604566.0974749997]]]]},"properties":{"x":4033,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1607012.0823796876],[-10172851.218595313,1609458.0672843754],[-10170405.233690625,1609458.0672843754],[-10170405.233690625,1607012.0823796876],[-10172851.218595313,1607012.0823796876]]]]},"properties":{"x":4033,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1609458.0672843754],[-10172851.218595313,1611904.0521890633],[-10170405.233690625,1611904.0521890633],[-10170405.233690625,1609458.0672843754],[-10172851.218595313,1609458.0672843754]]]]},"properties":{"x":4033,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1611904.0521890633],[-10172851.218595313,1614350.0370937511],[-10170405.233690625,1614350.0370937511],[-10170405.233690625,1611904.0521890633],[-10172851.218595313,1611904.0521890633]]]]},"properties":{"x":4033,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1614350.0370937511],[-10172851.218595313,1616796.021998439],[-10170405.233690625,1616796.021998439],[-10170405.233690625,1614350.0370937511],[-10172851.218595313,1614350.0370937511]]]]},"properties":{"x":4033,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1616796.021998439],[-10172851.218595313,1619242.0069031268],[-10170405.233690625,1619242.0069031268],[-10170405.233690625,1616796.021998439],[-10172851.218595313,1616796.021998439]]]]},"properties":{"x":4033,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1619242.0069031268],[-10172851.218595313,1621687.991807811],[-10170405.233690625,1621687.991807811],[-10170405.233690625,1619242.0069031268],[-10172851.218595313,1619242.0069031268]]]]},"properties":{"x":4033,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1621687.991807811],[-10172851.218595313,1624133.9767124988],[-10170405.233690625,1624133.9767124988],[-10170405.233690625,1621687.991807811],[-10172851.218595313,1621687.991807811]]]]},"properties":{"x":4033,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10172851.218595313,1624133.9767124988],[-10172851.218595313,1626579.9616171867],[-10170405.233690625,1626579.9616171867],[-10170405.233690625,1624133.9767124988],[-10172851.218595313,1624133.9767124988]]]]},"properties":{"x":4033,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1562984.3540953137],[-10170405.233690625,1565430.3390000015],[-10167959.248785937,1565430.3390000015],[-10167959.248785937,1562984.3540953137],[-10170405.233690625,1562984.3540953137]]]]},"properties":{"x":4034,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1565430.3390000015],[-10170405.233690625,1567876.3239046894],[-10167959.248785937,1567876.3239046894],[-10167959.248785937,1565430.3390000015],[-10170405.233690625,1565430.3390000015]]]]},"properties":{"x":4034,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1567876.3239046894],[-10170405.233690625,1570322.3088093735],[-10167959.248785937,1570322.3088093735],[-10167959.248785937,1567876.3239046894],[-10170405.233690625,1567876.3239046894]]]]},"properties":{"x":4034,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1570322.3088093735],[-10170405.233690625,1572768.2937140614],[-10167959.248785937,1572768.2937140614],[-10167959.248785937,1570322.3088093735],[-10170405.233690625,1570322.3088093735]]]]},"properties":{"x":4034,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1572768.2937140614],[-10170405.233690625,1575214.2786187492],[-10167959.248785937,1575214.2786187492],[-10167959.248785937,1572768.2937140614],[-10170405.233690625,1572768.2937140614]]]]},"properties":{"x":4034,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1575214.2786187492],[-10170405.233690625,1577660.263523437],[-10167959.248785937,1577660.263523437],[-10167959.248785937,1575214.2786187492],[-10170405.233690625,1575214.2786187492]]]]},"properties":{"x":4034,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1577660.263523437],[-10170405.233690625,1580106.248428125],[-10167959.248785937,1580106.248428125],[-10167959.248785937,1577660.263523437],[-10170405.233690625,1577660.263523437]]]]},"properties":{"x":4034,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1580106.248428125],[-10170405.233690625,1582552.2333328128],[-10167959.248785937,1582552.2333328128],[-10167959.248785937,1580106.248428125],[-10170405.233690625,1580106.248428125]]]]},"properties":{"x":4034,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1582552.2333328128],[-10170405.233690625,1584998.2182375006],[-10167959.248785937,1584998.2182375006],[-10167959.248785937,1582552.2333328128],[-10170405.233690625,1582552.2333328128]]]]},"properties":{"x":4034,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1584998.2182375006],[-10170405.233690625,1587444.2031421885],[-10167959.248785937,1587444.2031421885],[-10167959.248785937,1584998.2182375006],[-10170405.233690625,1584998.2182375006]]]]},"properties":{"x":4034,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1587444.2031421885],[-10170405.233690625,1589890.1880468763],[-10167959.248785937,1589890.1880468763],[-10167959.248785937,1587444.2031421885],[-10170405.233690625,1587444.2031421885]]]]},"properties":{"x":4034,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1589890.1880468763],[-10170405.233690625,1592336.1729515642],[-10167959.248785937,1592336.1729515642],[-10167959.248785937,1589890.1880468763],[-10170405.233690625,1589890.1880468763]]]]},"properties":{"x":4034,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1592336.1729515642],[-10170405.233690625,1594782.1578562483],[-10167959.248785937,1594782.1578562483],[-10167959.248785937,1592336.1729515642],[-10170405.233690625,1592336.1729515642]]]]},"properties":{"x":4034,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1594782.1578562483],[-10170405.233690625,1597228.1427609362],[-10167959.248785937,1597228.1427609362],[-10167959.248785937,1594782.1578562483],[-10170405.233690625,1594782.1578562483]]]]},"properties":{"x":4034,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1597228.1427609362],[-10170405.233690625,1599674.127665624],[-10167959.248785937,1599674.127665624],[-10167959.248785937,1597228.1427609362],[-10170405.233690625,1597228.1427609362]]]]},"properties":{"x":4034,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1599674.127665624],[-10170405.233690625,1602120.1125703119],[-10167959.248785937,1602120.1125703119],[-10167959.248785937,1599674.127665624],[-10170405.233690625,1599674.127665624]]]]},"properties":{"x":4034,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1602120.1125703119],[-10170405.233690625,1604566.0974749997],[-10167959.248785937,1604566.0974749997],[-10167959.248785937,1602120.1125703119],[-10170405.233690625,1602120.1125703119]]]]},"properties":{"x":4034,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1604566.0974749997],[-10170405.233690625,1607012.0823796876],[-10167959.248785937,1607012.0823796876],[-10167959.248785937,1604566.0974749997],[-10170405.233690625,1604566.0974749997]]]]},"properties":{"x":4034,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1607012.0823796876],[-10170405.233690625,1609458.0672843754],[-10167959.248785937,1609458.0672843754],[-10167959.248785937,1607012.0823796876],[-10170405.233690625,1607012.0823796876]]]]},"properties":{"x":4034,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1609458.0672843754],[-10170405.233690625,1611904.0521890633],[-10167959.248785937,1611904.0521890633],[-10167959.248785937,1609458.0672843754],[-10170405.233690625,1609458.0672843754]]]]},"properties":{"x":4034,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1611904.0521890633],[-10170405.233690625,1614350.0370937511],[-10167959.248785937,1614350.0370937511],[-10167959.248785937,1611904.0521890633],[-10170405.233690625,1611904.0521890633]]]]},"properties":{"x":4034,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1614350.0370937511],[-10170405.233690625,1616796.021998439],[-10167959.248785937,1616796.021998439],[-10167959.248785937,1614350.0370937511],[-10170405.233690625,1614350.0370937511]]]]},"properties":{"x":4034,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1616796.021998439],[-10170405.233690625,1619242.0069031268],[-10167959.248785937,1619242.0069031268],[-10167959.248785937,1616796.021998439],[-10170405.233690625,1616796.021998439]]]]},"properties":{"x":4034,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1619242.0069031268],[-10170405.233690625,1621687.991807811],[-10167959.248785937,1621687.991807811],[-10167959.248785937,1619242.0069031268],[-10170405.233690625,1619242.0069031268]]]]},"properties":{"x":4034,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1621687.991807811],[-10170405.233690625,1624133.9767124988],[-10167959.248785937,1624133.9767124988],[-10167959.248785937,1621687.991807811],[-10170405.233690625,1621687.991807811]]]]},"properties":{"x":4034,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10170405.233690625,1624133.9767124988],[-10170405.233690625,1626579.9616171867],[-10167959.248785937,1626579.9616171867],[-10167959.248785937,1624133.9767124988],[-10170405.233690625,1624133.9767124988]]]]},"properties":{"x":4034,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1562984.3540953137],[-10167959.248785937,1565430.3390000015],[-10165513.263881251,1565430.3390000015],[-10165513.263881251,1562984.3540953137],[-10167959.248785937,1562984.3540953137]]]]},"properties":{"x":4035,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1565430.3390000015],[-10167959.248785937,1567876.3239046894],[-10165513.263881251,1567876.3239046894],[-10165513.263881251,1565430.3390000015],[-10167959.248785937,1565430.3390000015]]]]},"properties":{"x":4035,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1567876.3239046894],[-10167959.248785937,1570322.3088093735],[-10165513.263881251,1570322.3088093735],[-10165513.263881251,1567876.3239046894],[-10167959.248785937,1567876.3239046894]]]]},"properties":{"x":4035,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1570322.3088093735],[-10167959.248785937,1572768.2937140614],[-10165513.263881251,1572768.2937140614],[-10165513.263881251,1570322.3088093735],[-10167959.248785937,1570322.3088093735]]]]},"properties":{"x":4035,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1572768.2937140614],[-10167959.248785937,1575214.2786187492],[-10165513.263881251,1575214.2786187492],[-10165513.263881251,1572768.2937140614],[-10167959.248785937,1572768.2937140614]]]]},"properties":{"x":4035,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1575214.2786187492],[-10167959.248785937,1577660.263523437],[-10165513.263881251,1577660.263523437],[-10165513.263881251,1575214.2786187492],[-10167959.248785937,1575214.2786187492]]]]},"properties":{"x":4035,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1577660.263523437],[-10167959.248785937,1580106.248428125],[-10165513.263881251,1580106.248428125],[-10165513.263881251,1577660.263523437],[-10167959.248785937,1577660.263523437]]]]},"properties":{"x":4035,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1580106.248428125],[-10167959.248785937,1582552.2333328128],[-10165513.263881251,1582552.2333328128],[-10165513.263881251,1580106.248428125],[-10167959.248785937,1580106.248428125]]]]},"properties":{"x":4035,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1582552.2333328128],[-10167959.248785937,1584998.2182375006],[-10165513.263881251,1584998.2182375006],[-10165513.263881251,1582552.2333328128],[-10167959.248785937,1582552.2333328128]]]]},"properties":{"x":4035,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1584998.2182375006],[-10167959.248785937,1587444.2031421885],[-10165513.263881251,1587444.2031421885],[-10165513.263881251,1584998.2182375006],[-10167959.248785937,1584998.2182375006]]]]},"properties":{"x":4035,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1587444.2031421885],[-10167959.248785937,1589890.1880468763],[-10165513.263881251,1589890.1880468763],[-10165513.263881251,1587444.2031421885],[-10167959.248785937,1587444.2031421885]]]]},"properties":{"x":4035,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1589890.1880468763],[-10167959.248785937,1592336.1729515642],[-10165513.263881251,1592336.1729515642],[-10165513.263881251,1589890.1880468763],[-10167959.248785937,1589890.1880468763]]]]},"properties":{"x":4035,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1592336.1729515642],[-10167959.248785937,1594782.1578562483],[-10165513.263881251,1594782.1578562483],[-10165513.263881251,1592336.1729515642],[-10167959.248785937,1592336.1729515642]]]]},"properties":{"x":4035,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1594782.1578562483],[-10167959.248785937,1597228.1427609362],[-10165513.263881251,1597228.1427609362],[-10165513.263881251,1594782.1578562483],[-10167959.248785937,1594782.1578562483]]]]},"properties":{"x":4035,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1597228.1427609362],[-10167959.248785937,1599674.127665624],[-10165513.263881251,1599674.127665624],[-10165513.263881251,1597228.1427609362],[-10167959.248785937,1597228.1427609362]]]]},"properties":{"x":4035,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1599674.127665624],[-10167959.248785937,1602120.1125703119],[-10165513.263881251,1602120.1125703119],[-10165513.263881251,1599674.127665624],[-10167959.248785937,1599674.127665624]]]]},"properties":{"x":4035,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1602120.1125703119],[-10167959.248785937,1604566.0974749997],[-10165513.263881251,1604566.0974749997],[-10165513.263881251,1602120.1125703119],[-10167959.248785937,1602120.1125703119]]]]},"properties":{"x":4035,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1604566.0974749997],[-10167959.248785937,1607012.0823796876],[-10165513.263881251,1607012.0823796876],[-10165513.263881251,1604566.0974749997],[-10167959.248785937,1604566.0974749997]]]]},"properties":{"x":4035,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1607012.0823796876],[-10167959.248785937,1609458.0672843754],[-10165513.263881251,1609458.0672843754],[-10165513.263881251,1607012.0823796876],[-10167959.248785937,1607012.0823796876]]]]},"properties":{"x":4035,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1609458.0672843754],[-10167959.248785937,1611904.0521890633],[-10165513.263881251,1611904.0521890633],[-10165513.263881251,1609458.0672843754],[-10167959.248785937,1609458.0672843754]]]]},"properties":{"x":4035,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1611904.0521890633],[-10167959.248785937,1614350.0370937511],[-10165513.263881251,1614350.0370937511],[-10165513.263881251,1611904.0521890633],[-10167959.248785937,1611904.0521890633]]]]},"properties":{"x":4035,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1614350.0370937511],[-10167959.248785937,1616796.021998439],[-10165513.263881251,1616796.021998439],[-10165513.263881251,1614350.0370937511],[-10167959.248785937,1614350.0370937511]]]]},"properties":{"x":4035,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1616796.021998439],[-10167959.248785937,1619242.0069031268],[-10165513.263881251,1619242.0069031268],[-10165513.263881251,1616796.021998439],[-10167959.248785937,1616796.021998439]]]]},"properties":{"x":4035,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1619242.0069031268],[-10167959.248785937,1621687.991807811],[-10165513.263881251,1621687.991807811],[-10165513.263881251,1619242.0069031268],[-10167959.248785937,1619242.0069031268]]]]},"properties":{"x":4035,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1621687.991807811],[-10167959.248785937,1624133.9767124988],[-10165513.263881251,1624133.9767124988],[-10165513.263881251,1621687.991807811],[-10167959.248785937,1621687.991807811]]]]},"properties":{"x":4035,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10167959.248785937,1624133.9767124988],[-10167959.248785937,1626579.9616171867],[-10165513.263881251,1626579.9616171867],[-10165513.263881251,1624133.9767124988],[-10167959.248785937,1624133.9767124988]]]]},"properties":{"x":4035,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1562984.3540953137],[-10165513.263881251,1565430.3390000015],[-10163067.278976563,1565430.3390000015],[-10163067.278976563,1562984.3540953137],[-10165513.263881251,1562984.3540953137]]]]},"properties":{"x":4036,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1565430.3390000015],[-10165513.263881251,1567876.3239046894],[-10163067.278976563,1567876.3239046894],[-10163067.278976563,1565430.3390000015],[-10165513.263881251,1565430.3390000015]]]]},"properties":{"x":4036,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1567876.3239046894],[-10165513.263881251,1570322.3088093735],[-10163067.278976563,1570322.3088093735],[-10163067.278976563,1567876.3239046894],[-10165513.263881251,1567876.3239046894]]]]},"properties":{"x":4036,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1570322.3088093735],[-10165513.263881251,1572768.2937140614],[-10163067.278976563,1572768.2937140614],[-10163067.278976563,1570322.3088093735],[-10165513.263881251,1570322.3088093735]]]]},"properties":{"x":4036,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1572768.2937140614],[-10165513.263881251,1575214.2786187492],[-10163067.278976563,1575214.2786187492],[-10163067.278976563,1572768.2937140614],[-10165513.263881251,1572768.2937140614]]]]},"properties":{"x":4036,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1575214.2786187492],[-10165513.263881251,1577660.263523437],[-10163067.278976563,1577660.263523437],[-10163067.278976563,1575214.2786187492],[-10165513.263881251,1575214.2786187492]]]]},"properties":{"x":4036,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1577660.263523437],[-10165513.263881251,1580106.248428125],[-10163067.278976563,1580106.248428125],[-10163067.278976563,1577660.263523437],[-10165513.263881251,1577660.263523437]]]]},"properties":{"x":4036,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1580106.248428125],[-10165513.263881251,1582552.2333328128],[-10163067.278976563,1582552.2333328128],[-10163067.278976563,1580106.248428125],[-10165513.263881251,1580106.248428125]]]]},"properties":{"x":4036,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1582552.2333328128],[-10165513.263881251,1584998.2182375006],[-10163067.278976563,1584998.2182375006],[-10163067.278976563,1582552.2333328128],[-10165513.263881251,1582552.2333328128]]]]},"properties":{"x":4036,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1584998.2182375006],[-10165513.263881251,1587444.2031421885],[-10163067.278976563,1587444.2031421885],[-10163067.278976563,1584998.2182375006],[-10165513.263881251,1584998.2182375006]]]]},"properties":{"x":4036,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1587444.2031421885],[-10165513.263881251,1589890.1880468763],[-10163067.278976563,1589890.1880468763],[-10163067.278976563,1587444.2031421885],[-10165513.263881251,1587444.2031421885]]]]},"properties":{"x":4036,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1589890.1880468763],[-10165513.263881251,1592336.1729515642],[-10163067.278976563,1592336.1729515642],[-10163067.278976563,1589890.1880468763],[-10165513.263881251,1589890.1880468763]]]]},"properties":{"x":4036,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1592336.1729515642],[-10165513.263881251,1594782.1578562483],[-10163067.278976563,1594782.1578562483],[-10163067.278976563,1592336.1729515642],[-10165513.263881251,1592336.1729515642]]]]},"properties":{"x":4036,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1594782.1578562483],[-10165513.263881251,1597228.1427609362],[-10163067.278976563,1597228.1427609362],[-10163067.278976563,1594782.1578562483],[-10165513.263881251,1594782.1578562483]]]]},"properties":{"x":4036,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1597228.1427609362],[-10165513.263881251,1599674.127665624],[-10163067.278976563,1599674.127665624],[-10163067.278976563,1597228.1427609362],[-10165513.263881251,1597228.1427609362]]]]},"properties":{"x":4036,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1599674.127665624],[-10165513.263881251,1602120.1125703119],[-10163067.278976563,1602120.1125703119],[-10163067.278976563,1599674.127665624],[-10165513.263881251,1599674.127665624]]]]},"properties":{"x":4036,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1602120.1125703119],[-10165513.263881251,1604566.0974749997],[-10163067.278976563,1604566.0974749997],[-10163067.278976563,1602120.1125703119],[-10165513.263881251,1602120.1125703119]]]]},"properties":{"x":4036,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1604566.0974749997],[-10165513.263881251,1607012.0823796876],[-10163067.278976563,1607012.0823796876],[-10163067.278976563,1604566.0974749997],[-10165513.263881251,1604566.0974749997]]]]},"properties":{"x":4036,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1607012.0823796876],[-10165513.263881251,1609458.0672843754],[-10163067.278976563,1609458.0672843754],[-10163067.278976563,1607012.0823796876],[-10165513.263881251,1607012.0823796876]]]]},"properties":{"x":4036,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1609458.0672843754],[-10165513.263881251,1611904.0521890633],[-10163067.278976563,1611904.0521890633],[-10163067.278976563,1609458.0672843754],[-10165513.263881251,1609458.0672843754]]]]},"properties":{"x":4036,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1611904.0521890633],[-10165513.263881251,1614350.0370937511],[-10163067.278976563,1614350.0370937511],[-10163067.278976563,1611904.0521890633],[-10165513.263881251,1611904.0521890633]]]]},"properties":{"x":4036,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1614350.0370937511],[-10165513.263881251,1616796.021998439],[-10163067.278976563,1616796.021998439],[-10163067.278976563,1614350.0370937511],[-10165513.263881251,1614350.0370937511]]]]},"properties":{"x":4036,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1616796.021998439],[-10165513.263881251,1619242.0069031268],[-10163067.278976563,1619242.0069031268],[-10163067.278976563,1616796.021998439],[-10165513.263881251,1616796.021998439]]]]},"properties":{"x":4036,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1619242.0069031268],[-10165513.263881251,1621687.991807811],[-10163067.278976563,1621687.991807811],[-10163067.278976563,1619242.0069031268],[-10165513.263881251,1619242.0069031268]]]]},"properties":{"x":4036,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1621687.991807811],[-10165513.263881251,1624133.9767124988],[-10163067.278976563,1624133.9767124988],[-10163067.278976563,1621687.991807811],[-10165513.263881251,1621687.991807811]]]]},"properties":{"x":4036,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10165513.263881251,1624133.9767124988],[-10165513.263881251,1626579.9616171867],[-10163067.278976563,1626579.9616171867],[-10163067.278976563,1624133.9767124988],[-10165513.263881251,1624133.9767124988]]]]},"properties":{"x":4036,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1562984.3540953137],[-10163067.278976563,1565430.3390000015],[-10160621.294071876,1565430.3390000015],[-10160621.294071876,1562984.3540953137],[-10163067.278976563,1562984.3540953137]]]]},"properties":{"x":4037,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1565430.3390000015],[-10163067.278976563,1567876.3239046894],[-10160621.294071876,1567876.3239046894],[-10160621.294071876,1565430.3390000015],[-10163067.278976563,1565430.3390000015]]]]},"properties":{"x":4037,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1567876.3239046894],[-10163067.278976563,1570322.3088093735],[-10160621.294071876,1570322.3088093735],[-10160621.294071876,1567876.3239046894],[-10163067.278976563,1567876.3239046894]]]]},"properties":{"x":4037,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1570322.3088093735],[-10163067.278976563,1572768.2937140614],[-10160621.294071876,1572768.2937140614],[-10160621.294071876,1570322.3088093735],[-10163067.278976563,1570322.3088093735]]]]},"properties":{"x":4037,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1572768.2937140614],[-10163067.278976563,1575214.2786187492],[-10160621.294071876,1575214.2786187492],[-10160621.294071876,1572768.2937140614],[-10163067.278976563,1572768.2937140614]]]]},"properties":{"x":4037,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1575214.2786187492],[-10163067.278976563,1577660.263523437],[-10160621.294071876,1577660.263523437],[-10160621.294071876,1575214.2786187492],[-10163067.278976563,1575214.2786187492]]]]},"properties":{"x":4037,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1577660.263523437],[-10163067.278976563,1580106.248428125],[-10160621.294071876,1580106.248428125],[-10160621.294071876,1577660.263523437],[-10163067.278976563,1577660.263523437]]]]},"properties":{"x":4037,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1580106.248428125],[-10163067.278976563,1582552.2333328128],[-10160621.294071876,1582552.2333328128],[-10160621.294071876,1580106.248428125],[-10163067.278976563,1580106.248428125]]]]},"properties":{"x":4037,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1582552.2333328128],[-10163067.278976563,1584998.2182375006],[-10160621.294071876,1584998.2182375006],[-10160621.294071876,1582552.2333328128],[-10163067.278976563,1582552.2333328128]]]]},"properties":{"x":4037,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1584998.2182375006],[-10163067.278976563,1587444.2031421885],[-10160621.294071876,1587444.2031421885],[-10160621.294071876,1584998.2182375006],[-10163067.278976563,1584998.2182375006]]]]},"properties":{"x":4037,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1587444.2031421885],[-10163067.278976563,1589890.1880468763],[-10160621.294071876,1589890.1880468763],[-10160621.294071876,1587444.2031421885],[-10163067.278976563,1587444.2031421885]]]]},"properties":{"x":4037,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1589890.1880468763],[-10163067.278976563,1592336.1729515642],[-10160621.294071876,1592336.1729515642],[-10160621.294071876,1589890.1880468763],[-10163067.278976563,1589890.1880468763]]]]},"properties":{"x":4037,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1592336.1729515642],[-10163067.278976563,1594782.1578562483],[-10160621.294071876,1594782.1578562483],[-10160621.294071876,1592336.1729515642],[-10163067.278976563,1592336.1729515642]]]]},"properties":{"x":4037,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1594782.1578562483],[-10163067.278976563,1597228.1427609362],[-10160621.294071876,1597228.1427609362],[-10160621.294071876,1594782.1578562483],[-10163067.278976563,1594782.1578562483]]]]},"properties":{"x":4037,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1597228.1427609362],[-10163067.278976563,1599674.127665624],[-10160621.294071876,1599674.127665624],[-10160621.294071876,1597228.1427609362],[-10163067.278976563,1597228.1427609362]]]]},"properties":{"x":4037,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1599674.127665624],[-10163067.278976563,1602120.1125703119],[-10160621.294071876,1602120.1125703119],[-10160621.294071876,1599674.127665624],[-10163067.278976563,1599674.127665624]]]]},"properties":{"x":4037,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1602120.1125703119],[-10163067.278976563,1604566.0974749997],[-10160621.294071876,1604566.0974749997],[-10160621.294071876,1602120.1125703119],[-10163067.278976563,1602120.1125703119]]]]},"properties":{"x":4037,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1604566.0974749997],[-10163067.278976563,1607012.0823796876],[-10160621.294071876,1607012.0823796876],[-10160621.294071876,1604566.0974749997],[-10163067.278976563,1604566.0974749997]]]]},"properties":{"x":4037,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1607012.0823796876],[-10163067.278976563,1609458.0672843754],[-10160621.294071876,1609458.0672843754],[-10160621.294071876,1607012.0823796876],[-10163067.278976563,1607012.0823796876]]]]},"properties":{"x":4037,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1609458.0672843754],[-10163067.278976563,1611904.0521890633],[-10160621.294071876,1611904.0521890633],[-10160621.294071876,1609458.0672843754],[-10163067.278976563,1609458.0672843754]]]]},"properties":{"x":4037,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1611904.0521890633],[-10163067.278976563,1614350.0370937511],[-10160621.294071876,1614350.0370937511],[-10160621.294071876,1611904.0521890633],[-10163067.278976563,1611904.0521890633]]]]},"properties":{"x":4037,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1614350.0370937511],[-10163067.278976563,1616796.021998439],[-10160621.294071876,1616796.021998439],[-10160621.294071876,1614350.0370937511],[-10163067.278976563,1614350.0370937511]]]]},"properties":{"x":4037,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1616796.021998439],[-10163067.278976563,1619242.0069031268],[-10160621.294071876,1619242.0069031268],[-10160621.294071876,1616796.021998439],[-10163067.278976563,1616796.021998439]]]]},"properties":{"x":4037,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1619242.0069031268],[-10163067.278976563,1621687.991807811],[-10160621.294071876,1621687.991807811],[-10160621.294071876,1619242.0069031268],[-10163067.278976563,1619242.0069031268]]]]},"properties":{"x":4037,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1621687.991807811],[-10163067.278976563,1624133.9767124988],[-10160621.294071876,1624133.9767124988],[-10160621.294071876,1621687.991807811],[-10163067.278976563,1621687.991807811]]]]},"properties":{"x":4037,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10163067.278976563,1624133.9767124988],[-10163067.278976563,1626579.9616171867],[-10160621.294071876,1626579.9616171867],[-10160621.294071876,1624133.9767124988],[-10163067.278976563,1624133.9767124988]]]]},"properties":{"x":4037,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1562984.3540953137],[-10160621.294071876,1565430.3390000015],[-10158175.309167188,1565430.3390000015],[-10158175.309167188,1562984.3540953137],[-10160621.294071876,1562984.3540953137]]]]},"properties":{"x":4038,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1565430.3390000015],[-10160621.294071876,1567876.3239046894],[-10158175.309167188,1567876.3239046894],[-10158175.309167188,1565430.3390000015],[-10160621.294071876,1565430.3390000015]]]]},"properties":{"x":4038,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1567876.3239046894],[-10160621.294071876,1570322.3088093735],[-10158175.309167188,1570322.3088093735],[-10158175.309167188,1567876.3239046894],[-10160621.294071876,1567876.3239046894]]]]},"properties":{"x":4038,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1570322.3088093735],[-10160621.294071876,1572768.2937140614],[-10158175.309167188,1572768.2937140614],[-10158175.309167188,1570322.3088093735],[-10160621.294071876,1570322.3088093735]]]]},"properties":{"x":4038,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1572768.2937140614],[-10160621.294071876,1575214.2786187492],[-10158175.309167188,1575214.2786187492],[-10158175.309167188,1572768.2937140614],[-10160621.294071876,1572768.2937140614]]]]},"properties":{"x":4038,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1575214.2786187492],[-10160621.294071876,1577660.263523437],[-10158175.309167188,1577660.263523437],[-10158175.309167188,1575214.2786187492],[-10160621.294071876,1575214.2786187492]]]]},"properties":{"x":4038,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1577660.263523437],[-10160621.294071876,1580106.248428125],[-10158175.309167188,1580106.248428125],[-10158175.309167188,1577660.263523437],[-10160621.294071876,1577660.263523437]]]]},"properties":{"x":4038,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1580106.248428125],[-10160621.294071876,1582552.2333328128],[-10158175.309167188,1582552.2333328128],[-10158175.309167188,1580106.248428125],[-10160621.294071876,1580106.248428125]]]]},"properties":{"x":4038,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1582552.2333328128],[-10160621.294071876,1584998.2182375006],[-10158175.309167188,1584998.2182375006],[-10158175.309167188,1582552.2333328128],[-10160621.294071876,1582552.2333328128]]]]},"properties":{"x":4038,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1584998.2182375006],[-10160621.294071876,1587444.2031421885],[-10158175.309167188,1587444.2031421885],[-10158175.309167188,1584998.2182375006],[-10160621.294071876,1584998.2182375006]]]]},"properties":{"x":4038,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1587444.2031421885],[-10160621.294071876,1589890.1880468763],[-10158175.309167188,1589890.1880468763],[-10158175.309167188,1587444.2031421885],[-10160621.294071876,1587444.2031421885]]]]},"properties":{"x":4038,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1589890.1880468763],[-10160621.294071876,1592336.1729515642],[-10158175.309167188,1592336.1729515642],[-10158175.309167188,1589890.1880468763],[-10160621.294071876,1589890.1880468763]]]]},"properties":{"x":4038,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1592336.1729515642],[-10160621.294071876,1594782.1578562483],[-10158175.309167188,1594782.1578562483],[-10158175.309167188,1592336.1729515642],[-10160621.294071876,1592336.1729515642]]]]},"properties":{"x":4038,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1594782.1578562483],[-10160621.294071876,1597228.1427609362],[-10158175.309167188,1597228.1427609362],[-10158175.309167188,1594782.1578562483],[-10160621.294071876,1594782.1578562483]]]]},"properties":{"x":4038,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1597228.1427609362],[-10160621.294071876,1599674.127665624],[-10158175.309167188,1599674.127665624],[-10158175.309167188,1597228.1427609362],[-10160621.294071876,1597228.1427609362]]]]},"properties":{"x":4038,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1599674.127665624],[-10160621.294071876,1602120.1125703119],[-10158175.309167188,1602120.1125703119],[-10158175.309167188,1599674.127665624],[-10160621.294071876,1599674.127665624]]]]},"properties":{"x":4038,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1602120.1125703119],[-10160621.294071876,1604566.0974749997],[-10158175.309167188,1604566.0974749997],[-10158175.309167188,1602120.1125703119],[-10160621.294071876,1602120.1125703119]]]]},"properties":{"x":4038,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1604566.0974749997],[-10160621.294071876,1607012.0823796876],[-10158175.309167188,1607012.0823796876],[-10158175.309167188,1604566.0974749997],[-10160621.294071876,1604566.0974749997]]]]},"properties":{"x":4038,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1607012.0823796876],[-10160621.294071876,1609458.0672843754],[-10158175.309167188,1609458.0672843754],[-10158175.309167188,1607012.0823796876],[-10160621.294071876,1607012.0823796876]]]]},"properties":{"x":4038,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1609458.0672843754],[-10160621.294071876,1611904.0521890633],[-10158175.309167188,1611904.0521890633],[-10158175.309167188,1609458.0672843754],[-10160621.294071876,1609458.0672843754]]]]},"properties":{"x":4038,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1611904.0521890633],[-10160621.294071876,1614350.0370937511],[-10158175.309167188,1614350.0370937511],[-10158175.309167188,1611904.0521890633],[-10160621.294071876,1611904.0521890633]]]]},"properties":{"x":4038,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1614350.0370937511],[-10160621.294071876,1616796.021998439],[-10158175.309167188,1616796.021998439],[-10158175.309167188,1614350.0370937511],[-10160621.294071876,1614350.0370937511]]]]},"properties":{"x":4038,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1616796.021998439],[-10160621.294071876,1619242.0069031268],[-10158175.309167188,1619242.0069031268],[-10158175.309167188,1616796.021998439],[-10160621.294071876,1616796.021998439]]]]},"properties":{"x":4038,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1619242.0069031268],[-10160621.294071876,1621687.991807811],[-10158175.309167188,1621687.991807811],[-10158175.309167188,1619242.0069031268],[-10160621.294071876,1619242.0069031268]]]]},"properties":{"x":4038,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1621687.991807811],[-10160621.294071876,1624133.9767124988],[-10158175.309167188,1624133.9767124988],[-10158175.309167188,1621687.991807811],[-10160621.294071876,1621687.991807811]]]]},"properties":{"x":4038,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10160621.294071876,1624133.9767124988],[-10160621.294071876,1626579.9616171867],[-10158175.309167188,1626579.9616171867],[-10158175.309167188,1624133.9767124988],[-10160621.294071876,1624133.9767124988]]]]},"properties":{"x":4038,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1562984.3540953137],[-10158175.309167188,1565430.3390000015],[-10155729.3242625,1565430.3390000015],[-10155729.3242625,1562984.3540953137],[-10158175.309167188,1562984.3540953137]]]]},"properties":{"x":4039,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1565430.3390000015],[-10158175.309167188,1567876.3239046894],[-10155729.3242625,1567876.3239046894],[-10155729.3242625,1565430.3390000015],[-10158175.309167188,1565430.3390000015]]]]},"properties":{"x":4039,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1567876.3239046894],[-10158175.309167188,1570322.3088093735],[-10155729.3242625,1570322.3088093735],[-10155729.3242625,1567876.3239046894],[-10158175.309167188,1567876.3239046894]]]]},"properties":{"x":4039,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1570322.3088093735],[-10158175.309167188,1572768.2937140614],[-10155729.3242625,1572768.2937140614],[-10155729.3242625,1570322.3088093735],[-10158175.309167188,1570322.3088093735]]]]},"properties":{"x":4039,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1572768.2937140614],[-10158175.309167188,1575214.2786187492],[-10155729.3242625,1575214.2786187492],[-10155729.3242625,1572768.2937140614],[-10158175.309167188,1572768.2937140614]]]]},"properties":{"x":4039,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1575214.2786187492],[-10158175.309167188,1577660.263523437],[-10155729.3242625,1577660.263523437],[-10155729.3242625,1575214.2786187492],[-10158175.309167188,1575214.2786187492]]]]},"properties":{"x":4039,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1577660.263523437],[-10158175.309167188,1580106.248428125],[-10155729.3242625,1580106.248428125],[-10155729.3242625,1577660.263523437],[-10158175.309167188,1577660.263523437]]]]},"properties":{"x":4039,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1580106.248428125],[-10158175.309167188,1582552.2333328128],[-10155729.3242625,1582552.2333328128],[-10155729.3242625,1580106.248428125],[-10158175.309167188,1580106.248428125]]]]},"properties":{"x":4039,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1582552.2333328128],[-10158175.309167188,1584998.2182375006],[-10155729.3242625,1584998.2182375006],[-10155729.3242625,1582552.2333328128],[-10158175.309167188,1582552.2333328128]]]]},"properties":{"x":4039,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1584998.2182375006],[-10158175.309167188,1587444.2031421885],[-10155729.3242625,1587444.2031421885],[-10155729.3242625,1584998.2182375006],[-10158175.309167188,1584998.2182375006]]]]},"properties":{"x":4039,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1587444.2031421885],[-10158175.309167188,1589890.1880468763],[-10155729.3242625,1589890.1880468763],[-10155729.3242625,1587444.2031421885],[-10158175.309167188,1587444.2031421885]]]]},"properties":{"x":4039,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1589890.1880468763],[-10158175.309167188,1592336.1729515642],[-10155729.3242625,1592336.1729515642],[-10155729.3242625,1589890.1880468763],[-10158175.309167188,1589890.1880468763]]]]},"properties":{"x":4039,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1592336.1729515642],[-10158175.309167188,1594782.1578562483],[-10155729.3242625,1594782.1578562483],[-10155729.3242625,1592336.1729515642],[-10158175.309167188,1592336.1729515642]]]]},"properties":{"x":4039,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1594782.1578562483],[-10158175.309167188,1597228.1427609362],[-10155729.3242625,1597228.1427609362],[-10155729.3242625,1594782.1578562483],[-10158175.309167188,1594782.1578562483]]]]},"properties":{"x":4039,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1597228.1427609362],[-10158175.309167188,1599674.127665624],[-10155729.3242625,1599674.127665624],[-10155729.3242625,1597228.1427609362],[-10158175.309167188,1597228.1427609362]]]]},"properties":{"x":4039,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1599674.127665624],[-10158175.309167188,1602120.1125703119],[-10155729.3242625,1602120.1125703119],[-10155729.3242625,1599674.127665624],[-10158175.309167188,1599674.127665624]]]]},"properties":{"x":4039,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1602120.1125703119],[-10158175.309167188,1604566.0974749997],[-10155729.3242625,1604566.0974749997],[-10155729.3242625,1602120.1125703119],[-10158175.309167188,1602120.1125703119]]]]},"properties":{"x":4039,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1604566.0974749997],[-10158175.309167188,1607012.0823796876],[-10155729.3242625,1607012.0823796876],[-10155729.3242625,1604566.0974749997],[-10158175.309167188,1604566.0974749997]]]]},"properties":{"x":4039,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1607012.0823796876],[-10158175.309167188,1609458.0672843754],[-10155729.3242625,1609458.0672843754],[-10155729.3242625,1607012.0823796876],[-10158175.309167188,1607012.0823796876]]]]},"properties":{"x":4039,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1609458.0672843754],[-10158175.309167188,1611904.0521890633],[-10155729.3242625,1611904.0521890633],[-10155729.3242625,1609458.0672843754],[-10158175.309167188,1609458.0672843754]]]]},"properties":{"x":4039,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1611904.0521890633],[-10158175.309167188,1614350.0370937511],[-10155729.3242625,1614350.0370937511],[-10155729.3242625,1611904.0521890633],[-10158175.309167188,1611904.0521890633]]]]},"properties":{"x":4039,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1614350.0370937511],[-10158175.309167188,1616796.021998439],[-10155729.3242625,1616796.021998439],[-10155729.3242625,1614350.0370937511],[-10158175.309167188,1614350.0370937511]]]]},"properties":{"x":4039,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1616796.021998439],[-10158175.309167188,1619242.0069031268],[-10155729.3242625,1619242.0069031268],[-10155729.3242625,1616796.021998439],[-10158175.309167188,1616796.021998439]]]]},"properties":{"x":4039,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1619242.0069031268],[-10158175.309167188,1621687.991807811],[-10155729.3242625,1621687.991807811],[-10155729.3242625,1619242.0069031268],[-10158175.309167188,1619242.0069031268]]]]},"properties":{"x":4039,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1621687.991807811],[-10158175.309167188,1624133.9767124988],[-10155729.3242625,1624133.9767124988],[-10155729.3242625,1621687.991807811],[-10158175.309167188,1621687.991807811]]]]},"properties":{"x":4039,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10158175.309167188,1624133.9767124988],[-10158175.309167188,1626579.9616171867],[-10155729.3242625,1626579.9616171867],[-10155729.3242625,1624133.9767124988],[-10158175.309167188,1624133.9767124988]]]]},"properties":{"x":4039,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1562984.3540953137],[-10155729.3242625,1565430.3390000015],[-10153283.339357814,1565430.3390000015],[-10153283.339357814,1562984.3540953137],[-10155729.3242625,1562984.3540953137]]]]},"properties":{"x":4040,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1565430.3390000015],[-10155729.3242625,1567876.3239046894],[-10153283.339357814,1567876.3239046894],[-10153283.339357814,1565430.3390000015],[-10155729.3242625,1565430.3390000015]]]]},"properties":{"x":4040,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1567876.3239046894],[-10155729.3242625,1570322.3088093735],[-10153283.339357814,1570322.3088093735],[-10153283.339357814,1567876.3239046894],[-10155729.3242625,1567876.3239046894]]]]},"properties":{"x":4040,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1570322.3088093735],[-10155729.3242625,1572768.2937140614],[-10153283.339357814,1572768.2937140614],[-10153283.339357814,1570322.3088093735],[-10155729.3242625,1570322.3088093735]]]]},"properties":{"x":4040,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1572768.2937140614],[-10155729.3242625,1575214.2786187492],[-10153283.339357814,1575214.2786187492],[-10153283.339357814,1572768.2937140614],[-10155729.3242625,1572768.2937140614]]]]},"properties":{"x":4040,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1575214.2786187492],[-10155729.3242625,1577660.263523437],[-10153283.339357814,1577660.263523437],[-10153283.339357814,1575214.2786187492],[-10155729.3242625,1575214.2786187492]]]]},"properties":{"x":4040,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1577660.263523437],[-10155729.3242625,1580106.248428125],[-10153283.339357814,1580106.248428125],[-10153283.339357814,1577660.263523437],[-10155729.3242625,1577660.263523437]]]]},"properties":{"x":4040,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1580106.248428125],[-10155729.3242625,1582552.2333328128],[-10153283.339357814,1582552.2333328128],[-10153283.339357814,1580106.248428125],[-10155729.3242625,1580106.248428125]]]]},"properties":{"x":4040,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1582552.2333328128],[-10155729.3242625,1584998.2182375006],[-10153283.339357814,1584998.2182375006],[-10153283.339357814,1582552.2333328128],[-10155729.3242625,1582552.2333328128]]]]},"properties":{"x":4040,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1584998.2182375006],[-10155729.3242625,1587444.2031421885],[-10153283.339357814,1587444.2031421885],[-10153283.339357814,1584998.2182375006],[-10155729.3242625,1584998.2182375006]]]]},"properties":{"x":4040,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1587444.2031421885],[-10155729.3242625,1589890.1880468763],[-10153283.339357814,1589890.1880468763],[-10153283.339357814,1587444.2031421885],[-10155729.3242625,1587444.2031421885]]]]},"properties":{"x":4040,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1589890.1880468763],[-10155729.3242625,1592336.1729515642],[-10153283.339357814,1592336.1729515642],[-10153283.339357814,1589890.1880468763],[-10155729.3242625,1589890.1880468763]]]]},"properties":{"x":4040,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1592336.1729515642],[-10155729.3242625,1594782.1578562483],[-10153283.339357814,1594782.1578562483],[-10153283.339357814,1592336.1729515642],[-10155729.3242625,1592336.1729515642]]]]},"properties":{"x":4040,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1594782.1578562483],[-10155729.3242625,1597228.1427609362],[-10153283.339357814,1597228.1427609362],[-10153283.339357814,1594782.1578562483],[-10155729.3242625,1594782.1578562483]]]]},"properties":{"x":4040,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1597228.1427609362],[-10155729.3242625,1599674.127665624],[-10153283.339357814,1599674.127665624],[-10153283.339357814,1597228.1427609362],[-10155729.3242625,1597228.1427609362]]]]},"properties":{"x":4040,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1599674.127665624],[-10155729.3242625,1602120.1125703119],[-10153283.339357814,1602120.1125703119],[-10153283.339357814,1599674.127665624],[-10155729.3242625,1599674.127665624]]]]},"properties":{"x":4040,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1602120.1125703119],[-10155729.3242625,1604566.0974749997],[-10153283.339357814,1604566.0974749997],[-10153283.339357814,1602120.1125703119],[-10155729.3242625,1602120.1125703119]]]]},"properties":{"x":4040,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1604566.0974749997],[-10155729.3242625,1607012.0823796876],[-10153283.339357814,1607012.0823796876],[-10153283.339357814,1604566.0974749997],[-10155729.3242625,1604566.0974749997]]]]},"properties":{"x":4040,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1607012.0823796876],[-10155729.3242625,1609458.0672843754],[-10153283.339357814,1609458.0672843754],[-10153283.339357814,1607012.0823796876],[-10155729.3242625,1607012.0823796876]]]]},"properties":{"x":4040,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1609458.0672843754],[-10155729.3242625,1611904.0521890633],[-10153283.339357814,1611904.0521890633],[-10153283.339357814,1609458.0672843754],[-10155729.3242625,1609458.0672843754]]]]},"properties":{"x":4040,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1611904.0521890633],[-10155729.3242625,1614350.0370937511],[-10153283.339357814,1614350.0370937511],[-10153283.339357814,1611904.0521890633],[-10155729.3242625,1611904.0521890633]]]]},"properties":{"x":4040,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1614350.0370937511],[-10155729.3242625,1616796.021998439],[-10153283.339357814,1616796.021998439],[-10153283.339357814,1614350.0370937511],[-10155729.3242625,1614350.0370937511]]]]},"properties":{"x":4040,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1616796.021998439],[-10155729.3242625,1619242.0069031268],[-10153283.339357814,1619242.0069031268],[-10153283.339357814,1616796.021998439],[-10155729.3242625,1616796.021998439]]]]},"properties":{"x":4040,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1619242.0069031268],[-10155729.3242625,1621687.991807811],[-10153283.339357814,1621687.991807811],[-10153283.339357814,1619242.0069031268],[-10155729.3242625,1619242.0069031268]]]]},"properties":{"x":4040,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1621687.991807811],[-10155729.3242625,1624133.9767124988],[-10153283.339357814,1624133.9767124988],[-10153283.339357814,1621687.991807811],[-10155729.3242625,1621687.991807811]]]]},"properties":{"x":4040,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10155729.3242625,1624133.9767124988],[-10155729.3242625,1626579.9616171867],[-10153283.339357814,1626579.9616171867],[-10153283.339357814,1624133.9767124988],[-10155729.3242625,1624133.9767124988]]]]},"properties":{"x":4040,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1562984.3540953137],[-10153283.339357814,1565430.3390000015],[-10150837.354453126,1565430.3390000015],[-10150837.354453126,1562984.3540953137],[-10153283.339357814,1562984.3540953137]]]]},"properties":{"x":4041,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1565430.3390000015],[-10153283.339357814,1567876.3239046894],[-10150837.354453126,1567876.3239046894],[-10150837.354453126,1565430.3390000015],[-10153283.339357814,1565430.3390000015]]]]},"properties":{"x":4041,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1567876.3239046894],[-10153283.339357814,1570322.3088093735],[-10150837.354453126,1570322.3088093735],[-10150837.354453126,1567876.3239046894],[-10153283.339357814,1567876.3239046894]]]]},"properties":{"x":4041,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1570322.3088093735],[-10153283.339357814,1572768.2937140614],[-10150837.354453126,1572768.2937140614],[-10150837.354453126,1570322.3088093735],[-10153283.339357814,1570322.3088093735]]]]},"properties":{"x":4041,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1572768.2937140614],[-10153283.339357814,1575214.2786187492],[-10150837.354453126,1575214.2786187492],[-10150837.354453126,1572768.2937140614],[-10153283.339357814,1572768.2937140614]]]]},"properties":{"x":4041,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1575214.2786187492],[-10153283.339357814,1577660.263523437],[-10150837.354453126,1577660.263523437],[-10150837.354453126,1575214.2786187492],[-10153283.339357814,1575214.2786187492]]]]},"properties":{"x":4041,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1577660.263523437],[-10153283.339357814,1580106.248428125],[-10150837.354453126,1580106.248428125],[-10150837.354453126,1577660.263523437],[-10153283.339357814,1577660.263523437]]]]},"properties":{"x":4041,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1580106.248428125],[-10153283.339357814,1582552.2333328128],[-10150837.354453126,1582552.2333328128],[-10150837.354453126,1580106.248428125],[-10153283.339357814,1580106.248428125]]]]},"properties":{"x":4041,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1582552.2333328128],[-10153283.339357814,1584998.2182375006],[-10150837.354453126,1584998.2182375006],[-10150837.354453126,1582552.2333328128],[-10153283.339357814,1582552.2333328128]]]]},"properties":{"x":4041,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1584998.2182375006],[-10153283.339357814,1587444.2031421885],[-10150837.354453126,1587444.2031421885],[-10150837.354453126,1584998.2182375006],[-10153283.339357814,1584998.2182375006]]]]},"properties":{"x":4041,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1587444.2031421885],[-10153283.339357814,1589890.1880468763],[-10150837.354453126,1589890.1880468763],[-10150837.354453126,1587444.2031421885],[-10153283.339357814,1587444.2031421885]]]]},"properties":{"x":4041,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1589890.1880468763],[-10153283.339357814,1592336.1729515642],[-10150837.354453126,1592336.1729515642],[-10150837.354453126,1589890.1880468763],[-10153283.339357814,1589890.1880468763]]]]},"properties":{"x":4041,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1592336.1729515642],[-10153283.339357814,1594782.1578562483],[-10150837.354453126,1594782.1578562483],[-10150837.354453126,1592336.1729515642],[-10153283.339357814,1592336.1729515642]]]]},"properties":{"x":4041,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1594782.1578562483],[-10153283.339357814,1597228.1427609362],[-10150837.354453126,1597228.1427609362],[-10150837.354453126,1594782.1578562483],[-10153283.339357814,1594782.1578562483]]]]},"properties":{"x":4041,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1597228.1427609362],[-10153283.339357814,1599674.127665624],[-10150837.354453126,1599674.127665624],[-10150837.354453126,1597228.1427609362],[-10153283.339357814,1597228.1427609362]]]]},"properties":{"x":4041,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1599674.127665624],[-10153283.339357814,1602120.1125703119],[-10150837.354453126,1602120.1125703119],[-10150837.354453126,1599674.127665624],[-10153283.339357814,1599674.127665624]]]]},"properties":{"x":4041,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1602120.1125703119],[-10153283.339357814,1604566.0974749997],[-10150837.354453126,1604566.0974749997],[-10150837.354453126,1602120.1125703119],[-10153283.339357814,1602120.1125703119]]]]},"properties":{"x":4041,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1604566.0974749997],[-10153283.339357814,1607012.0823796876],[-10150837.354453126,1607012.0823796876],[-10150837.354453126,1604566.0974749997],[-10153283.339357814,1604566.0974749997]]]]},"properties":{"x":4041,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1607012.0823796876],[-10153283.339357814,1609458.0672843754],[-10150837.354453126,1609458.0672843754],[-10150837.354453126,1607012.0823796876],[-10153283.339357814,1607012.0823796876]]]]},"properties":{"x":4041,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1609458.0672843754],[-10153283.339357814,1611904.0521890633],[-10150837.354453126,1611904.0521890633],[-10150837.354453126,1609458.0672843754],[-10153283.339357814,1609458.0672843754]]]]},"properties":{"x":4041,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1611904.0521890633],[-10153283.339357814,1614350.0370937511],[-10150837.354453126,1614350.0370937511],[-10150837.354453126,1611904.0521890633],[-10153283.339357814,1611904.0521890633]]]]},"properties":{"x":4041,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1614350.0370937511],[-10153283.339357814,1616796.021998439],[-10150837.354453126,1616796.021998439],[-10150837.354453126,1614350.0370937511],[-10153283.339357814,1614350.0370937511]]]]},"properties":{"x":4041,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1616796.021998439],[-10153283.339357814,1619242.0069031268],[-10150837.354453126,1619242.0069031268],[-10150837.354453126,1616796.021998439],[-10153283.339357814,1616796.021998439]]]]},"properties":{"x":4041,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1619242.0069031268],[-10153283.339357814,1621687.991807811],[-10150837.354453126,1621687.991807811],[-10150837.354453126,1619242.0069031268],[-10153283.339357814,1619242.0069031268]]]]},"properties":{"x":4041,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1621687.991807811],[-10153283.339357814,1624133.9767124988],[-10150837.354453126,1624133.9767124988],[-10150837.354453126,1621687.991807811],[-10153283.339357814,1621687.991807811]]]]},"properties":{"x":4041,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10153283.339357814,1624133.9767124988],[-10153283.339357814,1626579.9616171867],[-10150837.354453126,1626579.9616171867],[-10150837.354453126,1624133.9767124988],[-10153283.339357814,1624133.9767124988]]]]},"properties":{"x":4041,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1562984.3540953137],[-10150837.354453126,1565430.3390000015],[-10148391.369548438,1565430.3390000015],[-10148391.369548438,1562984.3540953137],[-10150837.354453126,1562984.3540953137]]]]},"properties":{"x":4042,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1565430.3390000015],[-10150837.354453126,1567876.3239046894],[-10148391.369548438,1567876.3239046894],[-10148391.369548438,1565430.3390000015],[-10150837.354453126,1565430.3390000015]]]]},"properties":{"x":4042,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1567876.3239046894],[-10150837.354453126,1570322.3088093735],[-10148391.369548438,1570322.3088093735],[-10148391.369548438,1567876.3239046894],[-10150837.354453126,1567876.3239046894]]]]},"properties":{"x":4042,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1570322.3088093735],[-10150837.354453126,1572768.2937140614],[-10148391.369548438,1572768.2937140614],[-10148391.369548438,1570322.3088093735],[-10150837.354453126,1570322.3088093735]]]]},"properties":{"x":4042,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1572768.2937140614],[-10150837.354453126,1575214.2786187492],[-10148391.369548438,1575214.2786187492],[-10148391.369548438,1572768.2937140614],[-10150837.354453126,1572768.2937140614]]]]},"properties":{"x":4042,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1575214.2786187492],[-10150837.354453126,1577660.263523437],[-10148391.369548438,1577660.263523437],[-10148391.369548438,1575214.2786187492],[-10150837.354453126,1575214.2786187492]]]]},"properties":{"x":4042,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1577660.263523437],[-10150837.354453126,1580106.248428125],[-10148391.369548438,1580106.248428125],[-10148391.369548438,1577660.263523437],[-10150837.354453126,1577660.263523437]]]]},"properties":{"x":4042,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1580106.248428125],[-10150837.354453126,1582552.2333328128],[-10148391.369548438,1582552.2333328128],[-10148391.369548438,1580106.248428125],[-10150837.354453126,1580106.248428125]]]]},"properties":{"x":4042,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1582552.2333328128],[-10150837.354453126,1584998.2182375006],[-10148391.369548438,1584998.2182375006],[-10148391.369548438,1582552.2333328128],[-10150837.354453126,1582552.2333328128]]]]},"properties":{"x":4042,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1584998.2182375006],[-10150837.354453126,1587444.2031421885],[-10148391.369548438,1587444.2031421885],[-10148391.369548438,1584998.2182375006],[-10150837.354453126,1584998.2182375006]]]]},"properties":{"x":4042,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1587444.2031421885],[-10150837.354453126,1589890.1880468763],[-10148391.369548438,1589890.1880468763],[-10148391.369548438,1587444.2031421885],[-10150837.354453126,1587444.2031421885]]]]},"properties":{"x":4042,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1589890.1880468763],[-10150837.354453126,1592336.1729515642],[-10148391.369548438,1592336.1729515642],[-10148391.369548438,1589890.1880468763],[-10150837.354453126,1589890.1880468763]]]]},"properties":{"x":4042,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1592336.1729515642],[-10150837.354453126,1594782.1578562483],[-10148391.369548438,1594782.1578562483],[-10148391.369548438,1592336.1729515642],[-10150837.354453126,1592336.1729515642]]]]},"properties":{"x":4042,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1594782.1578562483],[-10150837.354453126,1597228.1427609362],[-10148391.369548438,1597228.1427609362],[-10148391.369548438,1594782.1578562483],[-10150837.354453126,1594782.1578562483]]]]},"properties":{"x":4042,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1597228.1427609362],[-10150837.354453126,1599674.127665624],[-10148391.369548438,1599674.127665624],[-10148391.369548438,1597228.1427609362],[-10150837.354453126,1597228.1427609362]]]]},"properties":{"x":4042,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1599674.127665624],[-10150837.354453126,1602120.1125703119],[-10148391.369548438,1602120.1125703119],[-10148391.369548438,1599674.127665624],[-10150837.354453126,1599674.127665624]]]]},"properties":{"x":4042,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1602120.1125703119],[-10150837.354453126,1604566.0974749997],[-10148391.369548438,1604566.0974749997],[-10148391.369548438,1602120.1125703119],[-10150837.354453126,1602120.1125703119]]]]},"properties":{"x":4042,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1604566.0974749997],[-10150837.354453126,1607012.0823796876],[-10148391.369548438,1607012.0823796876],[-10148391.369548438,1604566.0974749997],[-10150837.354453126,1604566.0974749997]]]]},"properties":{"x":4042,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1607012.0823796876],[-10150837.354453126,1609458.0672843754],[-10148391.369548438,1609458.0672843754],[-10148391.369548438,1607012.0823796876],[-10150837.354453126,1607012.0823796876]]]]},"properties":{"x":4042,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1609458.0672843754],[-10150837.354453126,1611904.0521890633],[-10148391.369548438,1611904.0521890633],[-10148391.369548438,1609458.0672843754],[-10150837.354453126,1609458.0672843754]]]]},"properties":{"x":4042,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1611904.0521890633],[-10150837.354453126,1614350.0370937511],[-10148391.369548438,1614350.0370937511],[-10148391.369548438,1611904.0521890633],[-10150837.354453126,1611904.0521890633]]]]},"properties":{"x":4042,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1614350.0370937511],[-10150837.354453126,1616796.021998439],[-10148391.369548438,1616796.021998439],[-10148391.369548438,1614350.0370937511],[-10150837.354453126,1614350.0370937511]]]]},"properties":{"x":4042,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1616796.021998439],[-10150837.354453126,1619242.0069031268],[-10148391.369548438,1619242.0069031268],[-10148391.369548438,1616796.021998439],[-10150837.354453126,1616796.021998439]]]]},"properties":{"x":4042,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1619242.0069031268],[-10150837.354453126,1621687.991807811],[-10148391.369548438,1621687.991807811],[-10148391.369548438,1619242.0069031268],[-10150837.354453126,1619242.0069031268]]]]},"properties":{"x":4042,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1621687.991807811],[-10150837.354453126,1624133.9767124988],[-10148391.369548438,1624133.9767124988],[-10148391.369548438,1621687.991807811],[-10150837.354453126,1621687.991807811]]]]},"properties":{"x":4042,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10150837.354453126,1624133.9767124988],[-10150837.354453126,1626579.9616171867],[-10148391.369548438,1626579.9616171867],[-10148391.369548438,1624133.9767124988],[-10150837.354453126,1624133.9767124988]]]]},"properties":{"x":4042,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1562984.3540953137],[-10148391.369548438,1565430.3390000015],[-10145945.38464375,1565430.3390000015],[-10145945.38464375,1562984.3540953137],[-10148391.369548438,1562984.3540953137]]]]},"properties":{"x":4043,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1565430.3390000015],[-10148391.369548438,1567876.3239046894],[-10145945.38464375,1567876.3239046894],[-10145945.38464375,1565430.3390000015],[-10148391.369548438,1565430.3390000015]]]]},"properties":{"x":4043,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1567876.3239046894],[-10148391.369548438,1570322.3088093735],[-10145945.38464375,1570322.3088093735],[-10145945.38464375,1567876.3239046894],[-10148391.369548438,1567876.3239046894]]]]},"properties":{"x":4043,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1570322.3088093735],[-10148391.369548438,1572768.2937140614],[-10145945.38464375,1572768.2937140614],[-10145945.38464375,1570322.3088093735],[-10148391.369548438,1570322.3088093735]]]]},"properties":{"x":4043,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1572768.2937140614],[-10148391.369548438,1575214.2786187492],[-10145945.38464375,1575214.2786187492],[-10145945.38464375,1572768.2937140614],[-10148391.369548438,1572768.2937140614]]]]},"properties":{"x":4043,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1575214.2786187492],[-10148391.369548438,1577660.263523437],[-10145945.38464375,1577660.263523437],[-10145945.38464375,1575214.2786187492],[-10148391.369548438,1575214.2786187492]]]]},"properties":{"x":4043,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1577660.263523437],[-10148391.369548438,1580106.248428125],[-10145945.38464375,1580106.248428125],[-10145945.38464375,1577660.263523437],[-10148391.369548438,1577660.263523437]]]]},"properties":{"x":4043,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1580106.248428125],[-10148391.369548438,1582552.2333328128],[-10145945.38464375,1582552.2333328128],[-10145945.38464375,1580106.248428125],[-10148391.369548438,1580106.248428125]]]]},"properties":{"x":4043,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1582552.2333328128],[-10148391.369548438,1584998.2182375006],[-10145945.38464375,1584998.2182375006],[-10145945.38464375,1582552.2333328128],[-10148391.369548438,1582552.2333328128]]]]},"properties":{"x":4043,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1584998.2182375006],[-10148391.369548438,1587444.2031421885],[-10145945.38464375,1587444.2031421885],[-10145945.38464375,1584998.2182375006],[-10148391.369548438,1584998.2182375006]]]]},"properties":{"x":4043,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1587444.2031421885],[-10148391.369548438,1589890.1880468763],[-10145945.38464375,1589890.1880468763],[-10145945.38464375,1587444.2031421885],[-10148391.369548438,1587444.2031421885]]]]},"properties":{"x":4043,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1589890.1880468763],[-10148391.369548438,1592336.1729515642],[-10145945.38464375,1592336.1729515642],[-10145945.38464375,1589890.1880468763],[-10148391.369548438,1589890.1880468763]]]]},"properties":{"x":4043,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1592336.1729515642],[-10148391.369548438,1594782.1578562483],[-10145945.38464375,1594782.1578562483],[-10145945.38464375,1592336.1729515642],[-10148391.369548438,1592336.1729515642]]]]},"properties":{"x":4043,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1594782.1578562483],[-10148391.369548438,1597228.1427609362],[-10145945.38464375,1597228.1427609362],[-10145945.38464375,1594782.1578562483],[-10148391.369548438,1594782.1578562483]]]]},"properties":{"x":4043,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1597228.1427609362],[-10148391.369548438,1599674.127665624],[-10145945.38464375,1599674.127665624],[-10145945.38464375,1597228.1427609362],[-10148391.369548438,1597228.1427609362]]]]},"properties":{"x":4043,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1599674.127665624],[-10148391.369548438,1602120.1125703119],[-10145945.38464375,1602120.1125703119],[-10145945.38464375,1599674.127665624],[-10148391.369548438,1599674.127665624]]]]},"properties":{"x":4043,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1602120.1125703119],[-10148391.369548438,1604566.0974749997],[-10145945.38464375,1604566.0974749997],[-10145945.38464375,1602120.1125703119],[-10148391.369548438,1602120.1125703119]]]]},"properties":{"x":4043,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1604566.0974749997],[-10148391.369548438,1607012.0823796876],[-10145945.38464375,1607012.0823796876],[-10145945.38464375,1604566.0974749997],[-10148391.369548438,1604566.0974749997]]]]},"properties":{"x":4043,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1607012.0823796876],[-10148391.369548438,1609458.0672843754],[-10145945.38464375,1609458.0672843754],[-10145945.38464375,1607012.0823796876],[-10148391.369548438,1607012.0823796876]]]]},"properties":{"x":4043,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1609458.0672843754],[-10148391.369548438,1611904.0521890633],[-10145945.38464375,1611904.0521890633],[-10145945.38464375,1609458.0672843754],[-10148391.369548438,1609458.0672843754]]]]},"properties":{"x":4043,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1611904.0521890633],[-10148391.369548438,1614350.0370937511],[-10145945.38464375,1614350.0370937511],[-10145945.38464375,1611904.0521890633],[-10148391.369548438,1611904.0521890633]]]]},"properties":{"x":4043,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1614350.0370937511],[-10148391.369548438,1616796.021998439],[-10145945.38464375,1616796.021998439],[-10145945.38464375,1614350.0370937511],[-10148391.369548438,1614350.0370937511]]]]},"properties":{"x":4043,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1616796.021998439],[-10148391.369548438,1619242.0069031268],[-10145945.38464375,1619242.0069031268],[-10145945.38464375,1616796.021998439],[-10148391.369548438,1616796.021998439]]]]},"properties":{"x":4043,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1619242.0069031268],[-10148391.369548438,1621687.991807811],[-10145945.38464375,1621687.991807811],[-10145945.38464375,1619242.0069031268],[-10148391.369548438,1619242.0069031268]]]]},"properties":{"x":4043,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1621687.991807811],[-10148391.369548438,1624133.9767124988],[-10145945.38464375,1624133.9767124988],[-10145945.38464375,1621687.991807811],[-10148391.369548438,1621687.991807811]]]]},"properties":{"x":4043,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10148391.369548438,1624133.9767124988],[-10148391.369548438,1626579.9616171867],[-10145945.38464375,1626579.9616171867],[-10145945.38464375,1624133.9767124988],[-10148391.369548438,1624133.9767124988]]]]},"properties":{"x":4043,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1562984.3540953137],[-10145945.38464375,1565430.3390000015],[-10143499.399739062,1565430.3390000015],[-10143499.399739062,1562984.3540953137],[-10145945.38464375,1562984.3540953137]]]]},"properties":{"x":4044,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1565430.3390000015],[-10145945.38464375,1567876.3239046894],[-10143499.399739062,1567876.3239046894],[-10143499.399739062,1565430.3390000015],[-10145945.38464375,1565430.3390000015]]]]},"properties":{"x":4044,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1567876.3239046894],[-10145945.38464375,1570322.3088093735],[-10143499.399739062,1570322.3088093735],[-10143499.399739062,1567876.3239046894],[-10145945.38464375,1567876.3239046894]]]]},"properties":{"x":4044,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1570322.3088093735],[-10145945.38464375,1572768.2937140614],[-10143499.399739062,1572768.2937140614],[-10143499.399739062,1570322.3088093735],[-10145945.38464375,1570322.3088093735]]]]},"properties":{"x":4044,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1572768.2937140614],[-10145945.38464375,1575214.2786187492],[-10143499.399739062,1575214.2786187492],[-10143499.399739062,1572768.2937140614],[-10145945.38464375,1572768.2937140614]]]]},"properties":{"x":4044,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1575214.2786187492],[-10145945.38464375,1577660.263523437],[-10143499.399739062,1577660.263523437],[-10143499.399739062,1575214.2786187492],[-10145945.38464375,1575214.2786187492]]]]},"properties":{"x":4044,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1577660.263523437],[-10145945.38464375,1580106.248428125],[-10143499.399739062,1580106.248428125],[-10143499.399739062,1577660.263523437],[-10145945.38464375,1577660.263523437]]]]},"properties":{"x":4044,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1580106.248428125],[-10145945.38464375,1582552.2333328128],[-10143499.399739062,1582552.2333328128],[-10143499.399739062,1580106.248428125],[-10145945.38464375,1580106.248428125]]]]},"properties":{"x":4044,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1582552.2333328128],[-10145945.38464375,1584998.2182375006],[-10143499.399739062,1584998.2182375006],[-10143499.399739062,1582552.2333328128],[-10145945.38464375,1582552.2333328128]]]]},"properties":{"x":4044,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1584998.2182375006],[-10145945.38464375,1587444.2031421885],[-10143499.399739062,1587444.2031421885],[-10143499.399739062,1584998.2182375006],[-10145945.38464375,1584998.2182375006]]]]},"properties":{"x":4044,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1587444.2031421885],[-10145945.38464375,1589890.1880468763],[-10143499.399739062,1589890.1880468763],[-10143499.399739062,1587444.2031421885],[-10145945.38464375,1587444.2031421885]]]]},"properties":{"x":4044,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1589890.1880468763],[-10145945.38464375,1592336.1729515642],[-10143499.399739062,1592336.1729515642],[-10143499.399739062,1589890.1880468763],[-10145945.38464375,1589890.1880468763]]]]},"properties":{"x":4044,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1592336.1729515642],[-10145945.38464375,1594782.1578562483],[-10143499.399739062,1594782.1578562483],[-10143499.399739062,1592336.1729515642],[-10145945.38464375,1592336.1729515642]]]]},"properties":{"x":4044,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1594782.1578562483],[-10145945.38464375,1597228.1427609362],[-10143499.399739062,1597228.1427609362],[-10143499.399739062,1594782.1578562483],[-10145945.38464375,1594782.1578562483]]]]},"properties":{"x":4044,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1597228.1427609362],[-10145945.38464375,1599674.127665624],[-10143499.399739062,1599674.127665624],[-10143499.399739062,1597228.1427609362],[-10145945.38464375,1597228.1427609362]]]]},"properties":{"x":4044,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1599674.127665624],[-10145945.38464375,1602120.1125703119],[-10143499.399739062,1602120.1125703119],[-10143499.399739062,1599674.127665624],[-10145945.38464375,1599674.127665624]]]]},"properties":{"x":4044,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1602120.1125703119],[-10145945.38464375,1604566.0974749997],[-10143499.399739062,1604566.0974749997],[-10143499.399739062,1602120.1125703119],[-10145945.38464375,1602120.1125703119]]]]},"properties":{"x":4044,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1604566.0974749997],[-10145945.38464375,1607012.0823796876],[-10143499.399739062,1607012.0823796876],[-10143499.399739062,1604566.0974749997],[-10145945.38464375,1604566.0974749997]]]]},"properties":{"x":4044,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1607012.0823796876],[-10145945.38464375,1609458.0672843754],[-10143499.399739062,1609458.0672843754],[-10143499.399739062,1607012.0823796876],[-10145945.38464375,1607012.0823796876]]]]},"properties":{"x":4044,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1609458.0672843754],[-10145945.38464375,1611904.0521890633],[-10143499.399739062,1611904.0521890633],[-10143499.399739062,1609458.0672843754],[-10145945.38464375,1609458.0672843754]]]]},"properties":{"x":4044,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1611904.0521890633],[-10145945.38464375,1614350.0370937511],[-10143499.399739062,1614350.0370937511],[-10143499.399739062,1611904.0521890633],[-10145945.38464375,1611904.0521890633]]]]},"properties":{"x":4044,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1614350.0370937511],[-10145945.38464375,1616796.021998439],[-10143499.399739062,1616796.021998439],[-10143499.399739062,1614350.0370937511],[-10145945.38464375,1614350.0370937511]]]]},"properties":{"x":4044,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1616796.021998439],[-10145945.38464375,1619242.0069031268],[-10143499.399739062,1619242.0069031268],[-10143499.399739062,1616796.021998439],[-10145945.38464375,1616796.021998439]]]]},"properties":{"x":4044,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1619242.0069031268],[-10145945.38464375,1621687.991807811],[-10143499.399739062,1621687.991807811],[-10143499.399739062,1619242.0069031268],[-10145945.38464375,1619242.0069031268]]]]},"properties":{"x":4044,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1621687.991807811],[-10145945.38464375,1624133.9767124988],[-10143499.399739062,1624133.9767124988],[-10143499.399739062,1621687.991807811],[-10145945.38464375,1621687.991807811]]]]},"properties":{"x":4044,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10145945.38464375,1624133.9767124988],[-10145945.38464375,1626579.9616171867],[-10143499.399739062,1626579.9616171867],[-10143499.399739062,1624133.9767124988],[-10145945.38464375,1624133.9767124988]]]]},"properties":{"x":4044,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1562984.3540953137],[-10143499.399739062,1565430.3390000015],[-10141053.414834376,1565430.3390000015],[-10141053.414834376,1562984.3540953137],[-10143499.399739062,1562984.3540953137]]]]},"properties":{"x":4045,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1565430.3390000015],[-10143499.399739062,1567876.3239046894],[-10141053.414834376,1567876.3239046894],[-10141053.414834376,1565430.3390000015],[-10143499.399739062,1565430.3390000015]]]]},"properties":{"x":4045,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1567876.3239046894],[-10143499.399739062,1570322.3088093735],[-10141053.414834376,1570322.3088093735],[-10141053.414834376,1567876.3239046894],[-10143499.399739062,1567876.3239046894]]]]},"properties":{"x":4045,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1570322.3088093735],[-10143499.399739062,1572768.2937140614],[-10141053.414834376,1572768.2937140614],[-10141053.414834376,1570322.3088093735],[-10143499.399739062,1570322.3088093735]]]]},"properties":{"x":4045,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1572768.2937140614],[-10143499.399739062,1575214.2786187492],[-10141053.414834376,1575214.2786187492],[-10141053.414834376,1572768.2937140614],[-10143499.399739062,1572768.2937140614]]]]},"properties":{"x":4045,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1575214.2786187492],[-10143499.399739062,1577660.263523437],[-10141053.414834376,1577660.263523437],[-10141053.414834376,1575214.2786187492],[-10143499.399739062,1575214.2786187492]]]]},"properties":{"x":4045,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1577660.263523437],[-10143499.399739062,1580106.248428125],[-10141053.414834376,1580106.248428125],[-10141053.414834376,1577660.263523437],[-10143499.399739062,1577660.263523437]]]]},"properties":{"x":4045,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1580106.248428125],[-10143499.399739062,1582552.2333328128],[-10141053.414834376,1582552.2333328128],[-10141053.414834376,1580106.248428125],[-10143499.399739062,1580106.248428125]]]]},"properties":{"x":4045,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1582552.2333328128],[-10143499.399739062,1584998.2182375006],[-10141053.414834376,1584998.2182375006],[-10141053.414834376,1582552.2333328128],[-10143499.399739062,1582552.2333328128]]]]},"properties":{"x":4045,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1584998.2182375006],[-10143499.399739062,1587444.2031421885],[-10141053.414834376,1587444.2031421885],[-10141053.414834376,1584998.2182375006],[-10143499.399739062,1584998.2182375006]]]]},"properties":{"x":4045,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1587444.2031421885],[-10143499.399739062,1589890.1880468763],[-10141053.414834376,1589890.1880468763],[-10141053.414834376,1587444.2031421885],[-10143499.399739062,1587444.2031421885]]]]},"properties":{"x":4045,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1589890.1880468763],[-10143499.399739062,1592336.1729515642],[-10141053.414834376,1592336.1729515642],[-10141053.414834376,1589890.1880468763],[-10143499.399739062,1589890.1880468763]]]]},"properties":{"x":4045,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1592336.1729515642],[-10143499.399739062,1594782.1578562483],[-10141053.414834376,1594782.1578562483],[-10141053.414834376,1592336.1729515642],[-10143499.399739062,1592336.1729515642]]]]},"properties":{"x":4045,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1594782.1578562483],[-10143499.399739062,1597228.1427609362],[-10141053.414834376,1597228.1427609362],[-10141053.414834376,1594782.1578562483],[-10143499.399739062,1594782.1578562483]]]]},"properties":{"x":4045,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1597228.1427609362],[-10143499.399739062,1599674.127665624],[-10141053.414834376,1599674.127665624],[-10141053.414834376,1597228.1427609362],[-10143499.399739062,1597228.1427609362]]]]},"properties":{"x":4045,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1599674.127665624],[-10143499.399739062,1602120.1125703119],[-10141053.414834376,1602120.1125703119],[-10141053.414834376,1599674.127665624],[-10143499.399739062,1599674.127665624]]]]},"properties":{"x":4045,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1602120.1125703119],[-10143499.399739062,1604566.0974749997],[-10141053.414834376,1604566.0974749997],[-10141053.414834376,1602120.1125703119],[-10143499.399739062,1602120.1125703119]]]]},"properties":{"x":4045,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1604566.0974749997],[-10143499.399739062,1607012.0823796876],[-10141053.414834376,1607012.0823796876],[-10141053.414834376,1604566.0974749997],[-10143499.399739062,1604566.0974749997]]]]},"properties":{"x":4045,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1607012.0823796876],[-10143499.399739062,1609458.0672843754],[-10141053.414834376,1609458.0672843754],[-10141053.414834376,1607012.0823796876],[-10143499.399739062,1607012.0823796876]]]]},"properties":{"x":4045,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1609458.0672843754],[-10143499.399739062,1611904.0521890633],[-10141053.414834376,1611904.0521890633],[-10141053.414834376,1609458.0672843754],[-10143499.399739062,1609458.0672843754]]]]},"properties":{"x":4045,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1611904.0521890633],[-10143499.399739062,1614350.0370937511],[-10141053.414834376,1614350.0370937511],[-10141053.414834376,1611904.0521890633],[-10143499.399739062,1611904.0521890633]]]]},"properties":{"x":4045,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1614350.0370937511],[-10143499.399739062,1616796.021998439],[-10141053.414834376,1616796.021998439],[-10141053.414834376,1614350.0370937511],[-10143499.399739062,1614350.0370937511]]]]},"properties":{"x":4045,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1616796.021998439],[-10143499.399739062,1619242.0069031268],[-10141053.414834376,1619242.0069031268],[-10141053.414834376,1616796.021998439],[-10143499.399739062,1616796.021998439]]]]},"properties":{"x":4045,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1619242.0069031268],[-10143499.399739062,1621687.991807811],[-10141053.414834376,1621687.991807811],[-10141053.414834376,1619242.0069031268],[-10143499.399739062,1619242.0069031268]]]]},"properties":{"x":4045,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1621687.991807811],[-10143499.399739062,1624133.9767124988],[-10141053.414834376,1624133.9767124988],[-10141053.414834376,1621687.991807811],[-10143499.399739062,1621687.991807811]]]]},"properties":{"x":4045,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10143499.399739062,1624133.9767124988],[-10143499.399739062,1626579.9616171867],[-10141053.414834376,1626579.9616171867],[-10141053.414834376,1624133.9767124988],[-10143499.399739062,1624133.9767124988]]]]},"properties":{"x":4045,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1562984.3540953137],[-10141053.414834376,1565430.3390000015],[-10138607.429929689,1565430.3390000015],[-10138607.429929689,1562984.3540953137],[-10141053.414834376,1562984.3540953137]]]]},"properties":{"x":4046,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1565430.3390000015],[-10141053.414834376,1567876.3239046894],[-10138607.429929689,1567876.3239046894],[-10138607.429929689,1565430.3390000015],[-10141053.414834376,1565430.3390000015]]]]},"properties":{"x":4046,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1567876.3239046894],[-10141053.414834376,1570322.3088093735],[-10138607.429929689,1570322.3088093735],[-10138607.429929689,1567876.3239046894],[-10141053.414834376,1567876.3239046894]]]]},"properties":{"x":4046,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1570322.3088093735],[-10141053.414834376,1572768.2937140614],[-10138607.429929689,1572768.2937140614],[-10138607.429929689,1570322.3088093735],[-10141053.414834376,1570322.3088093735]]]]},"properties":{"x":4046,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1572768.2937140614],[-10141053.414834376,1575214.2786187492],[-10138607.429929689,1575214.2786187492],[-10138607.429929689,1572768.2937140614],[-10141053.414834376,1572768.2937140614]]]]},"properties":{"x":4046,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1575214.2786187492],[-10141053.414834376,1577660.263523437],[-10138607.429929689,1577660.263523437],[-10138607.429929689,1575214.2786187492],[-10141053.414834376,1575214.2786187492]]]]},"properties":{"x":4046,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1577660.263523437],[-10141053.414834376,1580106.248428125],[-10138607.429929689,1580106.248428125],[-10138607.429929689,1577660.263523437],[-10141053.414834376,1577660.263523437]]]]},"properties":{"x":4046,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1580106.248428125],[-10141053.414834376,1582552.2333328128],[-10138607.429929689,1582552.2333328128],[-10138607.429929689,1580106.248428125],[-10141053.414834376,1580106.248428125]]]]},"properties":{"x":4046,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1582552.2333328128],[-10141053.414834376,1584998.2182375006],[-10138607.429929689,1584998.2182375006],[-10138607.429929689,1582552.2333328128],[-10141053.414834376,1582552.2333328128]]]]},"properties":{"x":4046,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1584998.2182375006],[-10141053.414834376,1587444.2031421885],[-10138607.429929689,1587444.2031421885],[-10138607.429929689,1584998.2182375006],[-10141053.414834376,1584998.2182375006]]]]},"properties":{"x":4046,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1587444.2031421885],[-10141053.414834376,1589890.1880468763],[-10138607.429929689,1589890.1880468763],[-10138607.429929689,1587444.2031421885],[-10141053.414834376,1587444.2031421885]]]]},"properties":{"x":4046,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1589890.1880468763],[-10141053.414834376,1592336.1729515642],[-10138607.429929689,1592336.1729515642],[-10138607.429929689,1589890.1880468763],[-10141053.414834376,1589890.1880468763]]]]},"properties":{"x":4046,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1592336.1729515642],[-10141053.414834376,1594782.1578562483],[-10138607.429929689,1594782.1578562483],[-10138607.429929689,1592336.1729515642],[-10141053.414834376,1592336.1729515642]]]]},"properties":{"x":4046,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1594782.1578562483],[-10141053.414834376,1597228.1427609362],[-10138607.429929689,1597228.1427609362],[-10138607.429929689,1594782.1578562483],[-10141053.414834376,1594782.1578562483]]]]},"properties":{"x":4046,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1597228.1427609362],[-10141053.414834376,1599674.127665624],[-10138607.429929689,1599674.127665624],[-10138607.429929689,1597228.1427609362],[-10141053.414834376,1597228.1427609362]]]]},"properties":{"x":4046,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1599674.127665624],[-10141053.414834376,1602120.1125703119],[-10138607.429929689,1602120.1125703119],[-10138607.429929689,1599674.127665624],[-10141053.414834376,1599674.127665624]]]]},"properties":{"x":4046,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1602120.1125703119],[-10141053.414834376,1604566.0974749997],[-10138607.429929689,1604566.0974749997],[-10138607.429929689,1602120.1125703119],[-10141053.414834376,1602120.1125703119]]]]},"properties":{"x":4046,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1604566.0974749997],[-10141053.414834376,1607012.0823796876],[-10138607.429929689,1607012.0823796876],[-10138607.429929689,1604566.0974749997],[-10141053.414834376,1604566.0974749997]]]]},"properties":{"x":4046,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1607012.0823796876],[-10141053.414834376,1609458.0672843754],[-10138607.429929689,1609458.0672843754],[-10138607.429929689,1607012.0823796876],[-10141053.414834376,1607012.0823796876]]]]},"properties":{"x":4046,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1609458.0672843754],[-10141053.414834376,1611904.0521890633],[-10138607.429929689,1611904.0521890633],[-10138607.429929689,1609458.0672843754],[-10141053.414834376,1609458.0672843754]]]]},"properties":{"x":4046,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1611904.0521890633],[-10141053.414834376,1614350.0370937511],[-10138607.429929689,1614350.0370937511],[-10138607.429929689,1611904.0521890633],[-10141053.414834376,1611904.0521890633]]]]},"properties":{"x":4046,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1614350.0370937511],[-10141053.414834376,1616796.021998439],[-10138607.429929689,1616796.021998439],[-10138607.429929689,1614350.0370937511],[-10141053.414834376,1614350.0370937511]]]]},"properties":{"x":4046,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1616796.021998439],[-10141053.414834376,1619242.0069031268],[-10138607.429929689,1619242.0069031268],[-10138607.429929689,1616796.021998439],[-10141053.414834376,1616796.021998439]]]]},"properties":{"x":4046,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1619242.0069031268],[-10141053.414834376,1621687.991807811],[-10138607.429929689,1621687.991807811],[-10138607.429929689,1619242.0069031268],[-10141053.414834376,1619242.0069031268]]]]},"properties":{"x":4046,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1621687.991807811],[-10141053.414834376,1624133.9767124988],[-10138607.429929689,1624133.9767124988],[-10138607.429929689,1621687.991807811],[-10141053.414834376,1621687.991807811]]]]},"properties":{"x":4046,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10141053.414834376,1624133.9767124988],[-10141053.414834376,1626579.9616171867],[-10138607.429929689,1626579.9616171867],[-10138607.429929689,1624133.9767124988],[-10141053.414834376,1624133.9767124988]]]]},"properties":{"x":4046,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1562984.3540953137],[-10138607.429929689,1565430.3390000015],[-10136161.445025,1565430.3390000015],[-10136161.445025,1562984.3540953137],[-10138607.429929689,1562984.3540953137]]]]},"properties":{"x":4047,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1565430.3390000015],[-10138607.429929689,1567876.3239046894],[-10136161.445025,1567876.3239046894],[-10136161.445025,1565430.3390000015],[-10138607.429929689,1565430.3390000015]]]]},"properties":{"x":4047,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1567876.3239046894],[-10138607.429929689,1570322.3088093735],[-10136161.445025,1570322.3088093735],[-10136161.445025,1567876.3239046894],[-10138607.429929689,1567876.3239046894]]]]},"properties":{"x":4047,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1570322.3088093735],[-10138607.429929689,1572768.2937140614],[-10136161.445025,1572768.2937140614],[-10136161.445025,1570322.3088093735],[-10138607.429929689,1570322.3088093735]]]]},"properties":{"x":4047,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1572768.2937140614],[-10138607.429929689,1575214.2786187492],[-10136161.445025,1575214.2786187492],[-10136161.445025,1572768.2937140614],[-10138607.429929689,1572768.2937140614]]]]},"properties":{"x":4047,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1575214.2786187492],[-10138607.429929689,1577660.263523437],[-10136161.445025,1577660.263523437],[-10136161.445025,1575214.2786187492],[-10138607.429929689,1575214.2786187492]]]]},"properties":{"x":4047,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1577660.263523437],[-10138607.429929689,1580106.248428125],[-10136161.445025,1580106.248428125],[-10136161.445025,1577660.263523437],[-10138607.429929689,1577660.263523437]]]]},"properties":{"x":4047,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1580106.248428125],[-10138607.429929689,1582552.2333328128],[-10136161.445025,1582552.2333328128],[-10136161.445025,1580106.248428125],[-10138607.429929689,1580106.248428125]]]]},"properties":{"x":4047,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1582552.2333328128],[-10138607.429929689,1584998.2182375006],[-10136161.445025,1584998.2182375006],[-10136161.445025,1582552.2333328128],[-10138607.429929689,1582552.2333328128]]]]},"properties":{"x":4047,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1584998.2182375006],[-10138607.429929689,1587444.2031421885],[-10136161.445025,1587444.2031421885],[-10136161.445025,1584998.2182375006],[-10138607.429929689,1584998.2182375006]]]]},"properties":{"x":4047,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1587444.2031421885],[-10138607.429929689,1589890.1880468763],[-10136161.445025,1589890.1880468763],[-10136161.445025,1587444.2031421885],[-10138607.429929689,1587444.2031421885]]]]},"properties":{"x":4047,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1589890.1880468763],[-10138607.429929689,1592336.1729515642],[-10136161.445025,1592336.1729515642],[-10136161.445025,1589890.1880468763],[-10138607.429929689,1589890.1880468763]]]]},"properties":{"x":4047,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1592336.1729515642],[-10138607.429929689,1594782.1578562483],[-10136161.445025,1594782.1578562483],[-10136161.445025,1592336.1729515642],[-10138607.429929689,1592336.1729515642]]]]},"properties":{"x":4047,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1594782.1578562483],[-10138607.429929689,1597228.1427609362],[-10136161.445025,1597228.1427609362],[-10136161.445025,1594782.1578562483],[-10138607.429929689,1594782.1578562483]]]]},"properties":{"x":4047,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1597228.1427609362],[-10138607.429929689,1599674.127665624],[-10136161.445025,1599674.127665624],[-10136161.445025,1597228.1427609362],[-10138607.429929689,1597228.1427609362]]]]},"properties":{"x":4047,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1599674.127665624],[-10138607.429929689,1602120.1125703119],[-10136161.445025,1602120.1125703119],[-10136161.445025,1599674.127665624],[-10138607.429929689,1599674.127665624]]]]},"properties":{"x":4047,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1602120.1125703119],[-10138607.429929689,1604566.0974749997],[-10136161.445025,1604566.0974749997],[-10136161.445025,1602120.1125703119],[-10138607.429929689,1602120.1125703119]]]]},"properties":{"x":4047,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1604566.0974749997],[-10138607.429929689,1607012.0823796876],[-10136161.445025,1607012.0823796876],[-10136161.445025,1604566.0974749997],[-10138607.429929689,1604566.0974749997]]]]},"properties":{"x":4047,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1607012.0823796876],[-10138607.429929689,1609458.0672843754],[-10136161.445025,1609458.0672843754],[-10136161.445025,1607012.0823796876],[-10138607.429929689,1607012.0823796876]]]]},"properties":{"x":4047,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1609458.0672843754],[-10138607.429929689,1611904.0521890633],[-10136161.445025,1611904.0521890633],[-10136161.445025,1609458.0672843754],[-10138607.429929689,1609458.0672843754]]]]},"properties":{"x":4047,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1611904.0521890633],[-10138607.429929689,1614350.0370937511],[-10136161.445025,1614350.0370937511],[-10136161.445025,1611904.0521890633],[-10138607.429929689,1611904.0521890633]]]]},"properties":{"x":4047,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1614350.0370937511],[-10138607.429929689,1616796.021998439],[-10136161.445025,1616796.021998439],[-10136161.445025,1614350.0370937511],[-10138607.429929689,1614350.0370937511]]]]},"properties":{"x":4047,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1616796.021998439],[-10138607.429929689,1619242.0069031268],[-10136161.445025,1619242.0069031268],[-10136161.445025,1616796.021998439],[-10138607.429929689,1616796.021998439]]]]},"properties":{"x":4047,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1619242.0069031268],[-10138607.429929689,1621687.991807811],[-10136161.445025,1621687.991807811],[-10136161.445025,1619242.0069031268],[-10138607.429929689,1619242.0069031268]]]]},"properties":{"x":4047,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1621687.991807811],[-10138607.429929689,1624133.9767124988],[-10136161.445025,1624133.9767124988],[-10136161.445025,1621687.991807811],[-10138607.429929689,1621687.991807811]]]]},"properties":{"x":4047,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10138607.429929689,1624133.9767124988],[-10138607.429929689,1626579.9616171867],[-10136161.445025,1626579.9616171867],[-10136161.445025,1624133.9767124988],[-10138607.429929689,1624133.9767124988]]]]},"properties":{"x":4047,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1562984.3540953137],[-10136161.445025,1565430.3390000015],[-10133715.460120313,1565430.3390000015],[-10133715.460120313,1562984.3540953137],[-10136161.445025,1562984.3540953137]]]]},"properties":{"x":4048,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1565430.3390000015],[-10136161.445025,1567876.3239046894],[-10133715.460120313,1567876.3239046894],[-10133715.460120313,1565430.3390000015],[-10136161.445025,1565430.3390000015]]]]},"properties":{"x":4048,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1567876.3239046894],[-10136161.445025,1570322.3088093735],[-10133715.460120313,1570322.3088093735],[-10133715.460120313,1567876.3239046894],[-10136161.445025,1567876.3239046894]]]]},"properties":{"x":4048,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1570322.3088093735],[-10136161.445025,1572768.2937140614],[-10133715.460120313,1572768.2937140614],[-10133715.460120313,1570322.3088093735],[-10136161.445025,1570322.3088093735]]]]},"properties":{"x":4048,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1572768.2937140614],[-10136161.445025,1575214.2786187492],[-10133715.460120313,1575214.2786187492],[-10133715.460120313,1572768.2937140614],[-10136161.445025,1572768.2937140614]]]]},"properties":{"x":4048,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1575214.2786187492],[-10136161.445025,1577660.263523437],[-10133715.460120313,1577660.263523437],[-10133715.460120313,1575214.2786187492],[-10136161.445025,1575214.2786187492]]]]},"properties":{"x":4048,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1577660.263523437],[-10136161.445025,1580106.248428125],[-10133715.460120313,1580106.248428125],[-10133715.460120313,1577660.263523437],[-10136161.445025,1577660.263523437]]]]},"properties":{"x":4048,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1580106.248428125],[-10136161.445025,1582552.2333328128],[-10133715.460120313,1582552.2333328128],[-10133715.460120313,1580106.248428125],[-10136161.445025,1580106.248428125]]]]},"properties":{"x":4048,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1582552.2333328128],[-10136161.445025,1584998.2182375006],[-10133715.460120313,1584998.2182375006],[-10133715.460120313,1582552.2333328128],[-10136161.445025,1582552.2333328128]]]]},"properties":{"x":4048,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1584998.2182375006],[-10136161.445025,1587444.2031421885],[-10133715.460120313,1587444.2031421885],[-10133715.460120313,1584998.2182375006],[-10136161.445025,1584998.2182375006]]]]},"properties":{"x":4048,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1587444.2031421885],[-10136161.445025,1589890.1880468763],[-10133715.460120313,1589890.1880468763],[-10133715.460120313,1587444.2031421885],[-10136161.445025,1587444.2031421885]]]]},"properties":{"x":4048,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1589890.1880468763],[-10136161.445025,1592336.1729515642],[-10133715.460120313,1592336.1729515642],[-10133715.460120313,1589890.1880468763],[-10136161.445025,1589890.1880468763]]]]},"properties":{"x":4048,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1592336.1729515642],[-10136161.445025,1594782.1578562483],[-10133715.460120313,1594782.1578562483],[-10133715.460120313,1592336.1729515642],[-10136161.445025,1592336.1729515642]]]]},"properties":{"x":4048,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1594782.1578562483],[-10136161.445025,1597228.1427609362],[-10133715.460120313,1597228.1427609362],[-10133715.460120313,1594782.1578562483],[-10136161.445025,1594782.1578562483]]]]},"properties":{"x":4048,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1597228.1427609362],[-10136161.445025,1599674.127665624],[-10133715.460120313,1599674.127665624],[-10133715.460120313,1597228.1427609362],[-10136161.445025,1597228.1427609362]]]]},"properties":{"x":4048,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1599674.127665624],[-10136161.445025,1602120.1125703119],[-10133715.460120313,1602120.1125703119],[-10133715.460120313,1599674.127665624],[-10136161.445025,1599674.127665624]]]]},"properties":{"x":4048,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1602120.1125703119],[-10136161.445025,1604566.0974749997],[-10133715.460120313,1604566.0974749997],[-10133715.460120313,1602120.1125703119],[-10136161.445025,1602120.1125703119]]]]},"properties":{"x":4048,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1604566.0974749997],[-10136161.445025,1607012.0823796876],[-10133715.460120313,1607012.0823796876],[-10133715.460120313,1604566.0974749997],[-10136161.445025,1604566.0974749997]]]]},"properties":{"x":4048,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1607012.0823796876],[-10136161.445025,1609458.0672843754],[-10133715.460120313,1609458.0672843754],[-10133715.460120313,1607012.0823796876],[-10136161.445025,1607012.0823796876]]]]},"properties":{"x":4048,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1609458.0672843754],[-10136161.445025,1611904.0521890633],[-10133715.460120313,1611904.0521890633],[-10133715.460120313,1609458.0672843754],[-10136161.445025,1609458.0672843754]]]]},"properties":{"x":4048,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1611904.0521890633],[-10136161.445025,1614350.0370937511],[-10133715.460120313,1614350.0370937511],[-10133715.460120313,1611904.0521890633],[-10136161.445025,1611904.0521890633]]]]},"properties":{"x":4048,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1614350.0370937511],[-10136161.445025,1616796.021998439],[-10133715.460120313,1616796.021998439],[-10133715.460120313,1614350.0370937511],[-10136161.445025,1614350.0370937511]]]]},"properties":{"x":4048,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1616796.021998439],[-10136161.445025,1619242.0069031268],[-10133715.460120313,1619242.0069031268],[-10133715.460120313,1616796.021998439],[-10136161.445025,1616796.021998439]]]]},"properties":{"x":4048,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1619242.0069031268],[-10136161.445025,1621687.991807811],[-10133715.460120313,1621687.991807811],[-10133715.460120313,1619242.0069031268],[-10136161.445025,1619242.0069031268]]]]},"properties":{"x":4048,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1621687.991807811],[-10136161.445025,1624133.9767124988],[-10133715.460120313,1624133.9767124988],[-10133715.460120313,1621687.991807811],[-10136161.445025,1621687.991807811]]]]},"properties":{"x":4048,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10136161.445025,1624133.9767124988],[-10136161.445025,1626579.9616171867],[-10133715.460120313,1626579.9616171867],[-10133715.460120313,1624133.9767124988],[-10136161.445025,1624133.9767124988]]]]},"properties":{"x":4048,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1562984.3540953137],[-10133715.460120313,1565430.3390000015],[-10131269.475215625,1565430.3390000015],[-10131269.475215625,1562984.3540953137],[-10133715.460120313,1562984.3540953137]]]]},"properties":{"x":4049,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1565430.3390000015],[-10133715.460120313,1567876.3239046894],[-10131269.475215625,1567876.3239046894],[-10131269.475215625,1565430.3390000015],[-10133715.460120313,1565430.3390000015]]]]},"properties":{"x":4049,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1567876.3239046894],[-10133715.460120313,1570322.3088093735],[-10131269.475215625,1570322.3088093735],[-10131269.475215625,1567876.3239046894],[-10133715.460120313,1567876.3239046894]]]]},"properties":{"x":4049,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1570322.3088093735],[-10133715.460120313,1572768.2937140614],[-10131269.475215625,1572768.2937140614],[-10131269.475215625,1570322.3088093735],[-10133715.460120313,1570322.3088093735]]]]},"properties":{"x":4049,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1572768.2937140614],[-10133715.460120313,1575214.2786187492],[-10131269.475215625,1575214.2786187492],[-10131269.475215625,1572768.2937140614],[-10133715.460120313,1572768.2937140614]]]]},"properties":{"x":4049,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1575214.2786187492],[-10133715.460120313,1577660.263523437],[-10131269.475215625,1577660.263523437],[-10131269.475215625,1575214.2786187492],[-10133715.460120313,1575214.2786187492]]]]},"properties":{"x":4049,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1577660.263523437],[-10133715.460120313,1580106.248428125],[-10131269.475215625,1580106.248428125],[-10131269.475215625,1577660.263523437],[-10133715.460120313,1577660.263523437]]]]},"properties":{"x":4049,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1580106.248428125],[-10133715.460120313,1582552.2333328128],[-10131269.475215625,1582552.2333328128],[-10131269.475215625,1580106.248428125],[-10133715.460120313,1580106.248428125]]]]},"properties":{"x":4049,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1582552.2333328128],[-10133715.460120313,1584998.2182375006],[-10131269.475215625,1584998.2182375006],[-10131269.475215625,1582552.2333328128],[-10133715.460120313,1582552.2333328128]]]]},"properties":{"x":4049,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1584998.2182375006],[-10133715.460120313,1587444.2031421885],[-10131269.475215625,1587444.2031421885],[-10131269.475215625,1584998.2182375006],[-10133715.460120313,1584998.2182375006]]]]},"properties":{"x":4049,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1587444.2031421885],[-10133715.460120313,1589890.1880468763],[-10131269.475215625,1589890.1880468763],[-10131269.475215625,1587444.2031421885],[-10133715.460120313,1587444.2031421885]]]]},"properties":{"x":4049,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1589890.1880468763],[-10133715.460120313,1592336.1729515642],[-10131269.475215625,1592336.1729515642],[-10131269.475215625,1589890.1880468763],[-10133715.460120313,1589890.1880468763]]]]},"properties":{"x":4049,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1592336.1729515642],[-10133715.460120313,1594782.1578562483],[-10131269.475215625,1594782.1578562483],[-10131269.475215625,1592336.1729515642],[-10133715.460120313,1592336.1729515642]]]]},"properties":{"x":4049,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1594782.1578562483],[-10133715.460120313,1597228.1427609362],[-10131269.475215625,1597228.1427609362],[-10131269.475215625,1594782.1578562483],[-10133715.460120313,1594782.1578562483]]]]},"properties":{"x":4049,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1597228.1427609362],[-10133715.460120313,1599674.127665624],[-10131269.475215625,1599674.127665624],[-10131269.475215625,1597228.1427609362],[-10133715.460120313,1597228.1427609362]]]]},"properties":{"x":4049,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1599674.127665624],[-10133715.460120313,1602120.1125703119],[-10131269.475215625,1602120.1125703119],[-10131269.475215625,1599674.127665624],[-10133715.460120313,1599674.127665624]]]]},"properties":{"x":4049,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1602120.1125703119],[-10133715.460120313,1604566.0974749997],[-10131269.475215625,1604566.0974749997],[-10131269.475215625,1602120.1125703119],[-10133715.460120313,1602120.1125703119]]]]},"properties":{"x":4049,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1604566.0974749997],[-10133715.460120313,1607012.0823796876],[-10131269.475215625,1607012.0823796876],[-10131269.475215625,1604566.0974749997],[-10133715.460120313,1604566.0974749997]]]]},"properties":{"x":4049,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1607012.0823796876],[-10133715.460120313,1609458.0672843754],[-10131269.475215625,1609458.0672843754],[-10131269.475215625,1607012.0823796876],[-10133715.460120313,1607012.0823796876]]]]},"properties":{"x":4049,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1609458.0672843754],[-10133715.460120313,1611904.0521890633],[-10131269.475215625,1611904.0521890633],[-10131269.475215625,1609458.0672843754],[-10133715.460120313,1609458.0672843754]]]]},"properties":{"x":4049,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1611904.0521890633],[-10133715.460120313,1614350.0370937511],[-10131269.475215625,1614350.0370937511],[-10131269.475215625,1611904.0521890633],[-10133715.460120313,1611904.0521890633]]]]},"properties":{"x":4049,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1614350.0370937511],[-10133715.460120313,1616796.021998439],[-10131269.475215625,1616796.021998439],[-10131269.475215625,1614350.0370937511],[-10133715.460120313,1614350.0370937511]]]]},"properties":{"x":4049,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1616796.021998439],[-10133715.460120313,1619242.0069031268],[-10131269.475215625,1619242.0069031268],[-10131269.475215625,1616796.021998439],[-10133715.460120313,1616796.021998439]]]]},"properties":{"x":4049,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1619242.0069031268],[-10133715.460120313,1621687.991807811],[-10131269.475215625,1621687.991807811],[-10131269.475215625,1619242.0069031268],[-10133715.460120313,1619242.0069031268]]]]},"properties":{"x":4049,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1621687.991807811],[-10133715.460120313,1624133.9767124988],[-10131269.475215625,1624133.9767124988],[-10131269.475215625,1621687.991807811],[-10133715.460120313,1621687.991807811]]]]},"properties":{"x":4049,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10133715.460120313,1624133.9767124988],[-10133715.460120313,1626579.9616171867],[-10131269.475215625,1626579.9616171867],[-10131269.475215625,1624133.9767124988],[-10133715.460120313,1624133.9767124988]]]]},"properties":{"x":4049,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1562984.3540953137],[-10131269.475215625,1565430.3390000015],[-10128823.490310939,1565430.3390000015],[-10128823.490310939,1562984.3540953137],[-10131269.475215625,1562984.3540953137]]]]},"properties":{"x":4050,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1565430.3390000015],[-10131269.475215625,1567876.3239046894],[-10128823.490310939,1567876.3239046894],[-10128823.490310939,1565430.3390000015],[-10131269.475215625,1565430.3390000015]]]]},"properties":{"x":4050,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1567876.3239046894],[-10131269.475215625,1570322.3088093735],[-10128823.490310939,1570322.3088093735],[-10128823.490310939,1567876.3239046894],[-10131269.475215625,1567876.3239046894]]]]},"properties":{"x":4050,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1570322.3088093735],[-10131269.475215625,1572768.2937140614],[-10128823.490310939,1572768.2937140614],[-10128823.490310939,1570322.3088093735],[-10131269.475215625,1570322.3088093735]]]]},"properties":{"x":4050,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1572768.2937140614],[-10131269.475215625,1575214.2786187492],[-10128823.490310939,1575214.2786187492],[-10128823.490310939,1572768.2937140614],[-10131269.475215625,1572768.2937140614]]]]},"properties":{"x":4050,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1575214.2786187492],[-10131269.475215625,1577660.263523437],[-10128823.490310939,1577660.263523437],[-10128823.490310939,1575214.2786187492],[-10131269.475215625,1575214.2786187492]]]]},"properties":{"x":4050,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1577660.263523437],[-10131269.475215625,1580106.248428125],[-10128823.490310939,1580106.248428125],[-10128823.490310939,1577660.263523437],[-10131269.475215625,1577660.263523437]]]]},"properties":{"x":4050,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1580106.248428125],[-10131269.475215625,1582552.2333328128],[-10128823.490310939,1582552.2333328128],[-10128823.490310939,1580106.248428125],[-10131269.475215625,1580106.248428125]]]]},"properties":{"x":4050,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1582552.2333328128],[-10131269.475215625,1584998.2182375006],[-10128823.490310939,1584998.2182375006],[-10128823.490310939,1582552.2333328128],[-10131269.475215625,1582552.2333328128]]]]},"properties":{"x":4050,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1584998.2182375006],[-10131269.475215625,1587444.2031421885],[-10128823.490310939,1587444.2031421885],[-10128823.490310939,1584998.2182375006],[-10131269.475215625,1584998.2182375006]]]]},"properties":{"x":4050,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1587444.2031421885],[-10131269.475215625,1589890.1880468763],[-10128823.490310939,1589890.1880468763],[-10128823.490310939,1587444.2031421885],[-10131269.475215625,1587444.2031421885]]]]},"properties":{"x":4050,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1589890.1880468763],[-10131269.475215625,1592336.1729515642],[-10128823.490310939,1592336.1729515642],[-10128823.490310939,1589890.1880468763],[-10131269.475215625,1589890.1880468763]]]]},"properties":{"x":4050,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1592336.1729515642],[-10131269.475215625,1594782.1578562483],[-10128823.490310939,1594782.1578562483],[-10128823.490310939,1592336.1729515642],[-10131269.475215625,1592336.1729515642]]]]},"properties":{"x":4050,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1594782.1578562483],[-10131269.475215625,1597228.1427609362],[-10128823.490310939,1597228.1427609362],[-10128823.490310939,1594782.1578562483],[-10131269.475215625,1594782.1578562483]]]]},"properties":{"x":4050,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1597228.1427609362],[-10131269.475215625,1599674.127665624],[-10128823.490310939,1599674.127665624],[-10128823.490310939,1597228.1427609362],[-10131269.475215625,1597228.1427609362]]]]},"properties":{"x":4050,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1599674.127665624],[-10131269.475215625,1602120.1125703119],[-10128823.490310939,1602120.1125703119],[-10128823.490310939,1599674.127665624],[-10131269.475215625,1599674.127665624]]]]},"properties":{"x":4050,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1602120.1125703119],[-10131269.475215625,1604566.0974749997],[-10128823.490310939,1604566.0974749997],[-10128823.490310939,1602120.1125703119],[-10131269.475215625,1602120.1125703119]]]]},"properties":{"x":4050,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1604566.0974749997],[-10131269.475215625,1607012.0823796876],[-10128823.490310939,1607012.0823796876],[-10128823.490310939,1604566.0974749997],[-10131269.475215625,1604566.0974749997]]]]},"properties":{"x":4050,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1607012.0823796876],[-10131269.475215625,1609458.0672843754],[-10128823.490310939,1609458.0672843754],[-10128823.490310939,1607012.0823796876],[-10131269.475215625,1607012.0823796876]]]]},"properties":{"x":4050,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1609458.0672843754],[-10131269.475215625,1611904.0521890633],[-10128823.490310939,1611904.0521890633],[-10128823.490310939,1609458.0672843754],[-10131269.475215625,1609458.0672843754]]]]},"properties":{"x":4050,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1611904.0521890633],[-10131269.475215625,1614350.0370937511],[-10128823.490310939,1614350.0370937511],[-10128823.490310939,1611904.0521890633],[-10131269.475215625,1611904.0521890633]]]]},"properties":{"x":4050,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1614350.0370937511],[-10131269.475215625,1616796.021998439],[-10128823.490310939,1616796.021998439],[-10128823.490310939,1614350.0370937511],[-10131269.475215625,1614350.0370937511]]]]},"properties":{"x":4050,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1616796.021998439],[-10131269.475215625,1619242.0069031268],[-10128823.490310939,1619242.0069031268],[-10128823.490310939,1616796.021998439],[-10131269.475215625,1616796.021998439]]]]},"properties":{"x":4050,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1619242.0069031268],[-10131269.475215625,1621687.991807811],[-10128823.490310939,1621687.991807811],[-10128823.490310939,1619242.0069031268],[-10131269.475215625,1619242.0069031268]]]]},"properties":{"x":4050,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1621687.991807811],[-10131269.475215625,1624133.9767124988],[-10128823.490310939,1624133.9767124988],[-10128823.490310939,1621687.991807811],[-10131269.475215625,1621687.991807811]]]]},"properties":{"x":4050,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10131269.475215625,1624133.9767124988],[-10131269.475215625,1626579.9616171867],[-10128823.490310939,1626579.9616171867],[-10128823.490310939,1624133.9767124988],[-10131269.475215625,1624133.9767124988]]]]},"properties":{"x":4050,"y":8856,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1562984.3540953137],[-10128823.490310939,1565430.3390000015],[-10126377.505406251,1565430.3390000015],[-10126377.505406251,1562984.3540953137],[-10128823.490310939,1562984.3540953137]]]]},"properties":{"x":4051,"y":8831,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1565430.3390000015],[-10128823.490310939,1567876.3239046894],[-10126377.505406251,1567876.3239046894],[-10126377.505406251,1565430.3390000015],[-10128823.490310939,1565430.3390000015]]]]},"properties":{"x":4051,"y":8832,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1567876.3239046894],[-10128823.490310939,1570322.3088093735],[-10126377.505406251,1570322.3088093735],[-10126377.505406251,1567876.3239046894],[-10128823.490310939,1567876.3239046894]]]]},"properties":{"x":4051,"y":8833,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1570322.3088093735],[-10128823.490310939,1572768.2937140614],[-10126377.505406251,1572768.2937140614],[-10126377.505406251,1570322.3088093735],[-10128823.490310939,1570322.3088093735]]]]},"properties":{"x":4051,"y":8834,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1572768.2937140614],[-10128823.490310939,1575214.2786187492],[-10126377.505406251,1575214.2786187492],[-10126377.505406251,1572768.2937140614],[-10128823.490310939,1572768.2937140614]]]]},"properties":{"x":4051,"y":8835,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1575214.2786187492],[-10128823.490310939,1577660.263523437],[-10126377.505406251,1577660.263523437],[-10126377.505406251,1575214.2786187492],[-10128823.490310939,1575214.2786187492]]]]},"properties":{"x":4051,"y":8836,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1577660.263523437],[-10128823.490310939,1580106.248428125],[-10126377.505406251,1580106.248428125],[-10126377.505406251,1577660.263523437],[-10128823.490310939,1577660.263523437]]]]},"properties":{"x":4051,"y":8837,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1580106.248428125],[-10128823.490310939,1582552.2333328128],[-10126377.505406251,1582552.2333328128],[-10126377.505406251,1580106.248428125],[-10128823.490310939,1580106.248428125]]]]},"properties":{"x":4051,"y":8838,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1582552.2333328128],[-10128823.490310939,1584998.2182375006],[-10126377.505406251,1584998.2182375006],[-10126377.505406251,1582552.2333328128],[-10128823.490310939,1582552.2333328128]]]]},"properties":{"x":4051,"y":8839,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1584998.2182375006],[-10128823.490310939,1587444.2031421885],[-10126377.505406251,1587444.2031421885],[-10126377.505406251,1584998.2182375006],[-10128823.490310939,1584998.2182375006]]]]},"properties":{"x":4051,"y":8840,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1587444.2031421885],[-10128823.490310939,1589890.1880468763],[-10126377.505406251,1589890.1880468763],[-10126377.505406251,1587444.2031421885],[-10128823.490310939,1587444.2031421885]]]]},"properties":{"x":4051,"y":8841,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1589890.1880468763],[-10128823.490310939,1592336.1729515642],[-10126377.505406251,1592336.1729515642],[-10126377.505406251,1589890.1880468763],[-10128823.490310939,1589890.1880468763]]]]},"properties":{"x":4051,"y":8842,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1592336.1729515642],[-10128823.490310939,1594782.1578562483],[-10126377.505406251,1594782.1578562483],[-10126377.505406251,1592336.1729515642],[-10128823.490310939,1592336.1729515642]]]]},"properties":{"x":4051,"y":8843,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1594782.1578562483],[-10128823.490310939,1597228.1427609362],[-10126377.505406251,1597228.1427609362],[-10126377.505406251,1594782.1578562483],[-10128823.490310939,1594782.1578562483]]]]},"properties":{"x":4051,"y":8844,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1597228.1427609362],[-10128823.490310939,1599674.127665624],[-10126377.505406251,1599674.127665624],[-10126377.505406251,1597228.1427609362],[-10128823.490310939,1597228.1427609362]]]]},"properties":{"x":4051,"y":8845,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1599674.127665624],[-10128823.490310939,1602120.1125703119],[-10126377.505406251,1602120.1125703119],[-10126377.505406251,1599674.127665624],[-10128823.490310939,1599674.127665624]]]]},"properties":{"x":4051,"y":8846,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1602120.1125703119],[-10128823.490310939,1604566.0974749997],[-10126377.505406251,1604566.0974749997],[-10126377.505406251,1602120.1125703119],[-10128823.490310939,1602120.1125703119]]]]},"properties":{"x":4051,"y":8847,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1604566.0974749997],[-10128823.490310939,1607012.0823796876],[-10126377.505406251,1607012.0823796876],[-10126377.505406251,1604566.0974749997],[-10128823.490310939,1604566.0974749997]]]]},"properties":{"x":4051,"y":8848,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1607012.0823796876],[-10128823.490310939,1609458.0672843754],[-10126377.505406251,1609458.0672843754],[-10126377.505406251,1607012.0823796876],[-10128823.490310939,1607012.0823796876]]]]},"properties":{"x":4051,"y":8849,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1609458.0672843754],[-10128823.490310939,1611904.0521890633],[-10126377.505406251,1611904.0521890633],[-10126377.505406251,1609458.0672843754],[-10128823.490310939,1609458.0672843754]]]]},"properties":{"x":4051,"y":8850,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1611904.0521890633],[-10128823.490310939,1614350.0370937511],[-10126377.505406251,1614350.0370937511],[-10126377.505406251,1611904.0521890633],[-10128823.490310939,1611904.0521890633]]]]},"properties":{"x":4051,"y":8851,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1614350.0370937511],[-10128823.490310939,1616796.021998439],[-10126377.505406251,1616796.021998439],[-10126377.505406251,1614350.0370937511],[-10128823.490310939,1614350.0370937511]]]]},"properties":{"x":4051,"y":8852,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1616796.021998439],[-10128823.490310939,1619242.0069031268],[-10126377.505406251,1619242.0069031268],[-10126377.505406251,1616796.021998439],[-10128823.490310939,1616796.021998439]]]]},"properties":{"x":4051,"y":8853,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1619242.0069031268],[-10128823.490310939,1621687.991807811],[-10126377.505406251,1621687.991807811],[-10126377.505406251,1619242.0069031268],[-10128823.490310939,1619242.0069031268]]]]},"properties":{"x":4051,"y":8854,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1621687.991807811],[-10128823.490310939,1624133.9767124988],[-10126377.505406251,1624133.9767124988],[-10126377.505406251,1621687.991807811],[-10128823.490310939,1621687.991807811]]]]},"properties":{"x":4051,"y":8855,"zoom":14,"isSquare":true}},{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-10128823.490310939,1624133.9767124988],[-10128823.490310939,1626579.9616171867],[-10126377.505406251,1626579.9616171867],[-10126377.505406251,1624133.9767124988],[-10128823.490310939,1624133.9767124988]]]]},"properties":{"x":4051,"y":8856,"zoom":14,"isSquare":true}}]}}
diff --git a/tests/backend/helpers/test_files/canned_draft_project.json b/tests/backend/helpers/test_files/canned_draft_project.json
deleted file mode 100644
index 01dce9f5ae..0000000000
--- a/tests/backend/helpers/test_files/canned_draft_project.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
- "areaOfInterest": {
- "type": "FeatureCollection",
- "features": [
- {
- "id": "de744f407ca8d92a7298ad2a13d362f5",
- "type": "Feature",
- "properties": {},
- "geometry": {
- "coordinates": [
- [
- [
- 84.767265,
- 27.808938
- ],
- [
- 84.774481,
- 27.808117
- ],
- [
- 84.774327,
- 27.803786
- ],
- [
- 84.765719,
- 27.805017
- ],
- [
- 84.767265,
- 27.808938
- ]
- ]
- ],
- "type": "Polygon"
- }
- }
- ]
- },
- "projectName": "Test",
- "organisation": 23,
- "tasks": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "properties": {
- "x": 753,
- "y": 594,
- "zoom": 10,
- "isSquare": false
- },
- "geometry": {
- "type": "MultiPolygon",
- "coordinates": [
- [
- [
- [
- 84.767265,
- 27.808938
- ],
- [
- 84.774481,
- 27.808117
- ],
- [
- 84.774327,
- 27.803786
- ],
- [
- 84.765719,
- 27.805017
- ],
- [
- 84.767265,
- 27.808938
- ]
- ]
- ]
- ]
- }
- }
- ]
- },
- "arbitraryTasks": false
-}
diff --git a/tests/backend/helpers/test_files/canned_kml_project.json b/tests/backend/helpers/test_files/canned_kml_project.json
deleted file mode 100644
index 79d4c43455..0000000000
--- a/tests/backend/helpers/test_files/canned_kml_project.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "areaOfInterest": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "geometry": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -4.65996216497632,
- 55.95041925350509,
- 0
- ],
- [
- -4.95173413390339,
- 56.262794514545504,
- 0
- ],
- [
- -4.67367146099783,
- 56.2434516969104,
- 0
- ],
- [
- -4.66709656284914,
- 56.2435936767028,
- 0
- ],
- [
- -4.0046243330544,
- 56.03981437664169,
- 0
- ],
- [
- -4.35742797997559,
- 55.48727395069889,
- 0
- ],
- [
- -4.65996216497632,
- 55.95041925350509,
- 0
- ]
- ]
- ]
- },
- "properties": null
- }
- ]
- },
- "projectName": "kml",
- "tasks": null,
- "arbitraryTasks": true
-}
diff --git a/tests/backend/helpers/test_files/canned_project_detail.json b/tests/backend/helpers/test_files/canned_project_detail.json
deleted file mode 100644
index 3affb09ed3..0000000000
--- a/tests/backend/helpers/test_files/canned_project_detail.json
+++ /dev/null
@@ -1,180 +0,0 @@
-{
- "projectId": 8653,
- "status": "PUBLISHED",
- "projectPriority": "URGENT",
- "areaOfInterest": {
- "type": "MultiPolygon",
- "coordinates": [
- [
- [
- [
- 83.771175,
- 28.095768
- ],
- [
- 83.773586,
- 28.095757
- ],
- [
- 83.773428,
- 28.094146
- ],
- [
- 83.770834,
- 28.094479
- ],
- [
- 83.771175,
- 28.095768
- ]
- ]
- ]
- ]
- },
- "aoiBBOX": [
- 83.770834,
- 28.094146,
- 83.773586,
- 28.095768
- ],
- "tasks": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "geometry": {
- "type": "MultiPolygon",
- "coordinates": [
- [
- [
- [
- 83.771175,
- 28.095768
- ],
- [
- 83.773586,
- 28.095757
- ],
- [
- 83.773428,
- 28.094146
- ],
- [
- 83.770834,
- 28.094479
- ],
- [
- 83.771175,
- 28.095768
- ]
- ]
- ]
- ]
- },
- "properties": {
- "taskId": 1,
- "taskX": 48018,
- "taskY": 38100,
- "taskZoom": 16,
- "taskIsSquare": false,
- "taskStatus": "READY",
- "lockedBy": null
- }
- }
- ]
- },
- "defaultLocale": "en",
- "projectInfo": {
- "locale": "en",
- "name": "Test",
- "shortDescription": "",
- "description": "",
- "instructions": "",
- "perTaskInstructions": ""
- },
- "projectInfoLocales": [
- {
- "locale": "en",
- "name": "Test",
- "shortDescription": "Test short description",
- "description": "Test description",
- "instructions": "Testing detailed instructions",
- "perTaskInstructions": "Tests"
- }
- ],
- "difficulty": "EASY",
- "mappingPermission": "ANY",
- "validationPermission": "LEVEL",
- "enforceRandomTaskSelection": false,
- "private": false,
- "changesetComment": "#hot-tm-stage-project-8653",
- "osmchaFilterId": null,
- "dueDate": null,
- "imagery": null,
- "idPresets": null,
- "rapidPowerUser": false,
- "mappingTypes": [
- "ROADS",
- "BUILDINGS"
- ],
- "campaigns": [],
- "organisation": 23,
- "organisationName": "Kathmandu Living Labs",
- "organisationSlug": "KLL",
- "organisationLogo": "https://cdn.hotosm.org/tasking-manager/uploads/1652896455106_main-logo.png",
- "countryTag": [
- "Nepal"
- ],
- "licenseId": null,
- "allowedUsernames": [],
- "priorityAreas": [
- {
- "coordinates": [
- [
- [
- 83.77175831878799,
- 28.095285381948983
- ],
- [
- 83.77256705935366,
- 28.095301973647963
- ],
- [
- 83.77252317420658,
- 28.094837405100535
- ],
- [
- 83.77168935641481,
- 28.094876119222604
- ],
- [
- 83.77175831878799,
- 28.095285381948983
- ]
- ]
- ],
- "type": "Polygon"
- }
- ],
- "created": "2022-05-19T04:59:47.310401Z",
- "lastUpdated": "2022-05-19T04:59:47.305580Z",
- "author": "Thinkwhere Test",
- "activeMappers": 0,
- "percentMapped": 0,
- "percentValidated": 0,
- "percentBadImagery": 0,
- "taskCreationMode": "GRID",
- "teams": [],
- "mappingEditors": [
- "ID",
- "JOSM",
- "CUSTOM"
- ],
- "validationEditors": [
- "ID",
- "JOSM",
- "CUSTOM"
- ],
- "interests": [],
- "extraIdParams": ""
-}
diff --git a/tests/backend/helpers/test_files/clipped_feature_collection.json b/tests/backend/helpers/test_files/clipped_feature_collection.json
deleted file mode 100644
index c81c2f4eb2..0000000000
--- a/tests/backend/helpers/test_files/clipped_feature_collection.json
+++ /dev/null
@@ -1,1145 +0,0 @@
-{
- "type":"FeatureCollection",
- "features":[
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275034.3899838,
- 2828857.9792994
- ],
- [
- 1275046.0685966,
- 2828857.9792994
- ],
- [
- 1275046.0685966,
- 2828781.5422711
- ],
- [
- 1275016.6455452,
- 2828781.5422711
- ],
- [
- 1275034.3899838,
- 2828857.9792994
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278824,
- "y":299152,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275046.0685966,
- 2828908.286806
- ],
- [
- 1275046.0685966,
- 2828857.9792994
- ],
- [
- 1275034.3899838,
- 2828857.9792994
- ],
- [
- 1275046.0685966,
- 2828908.286806
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278824,
- "y":299153,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275046.0685966,
- 2828781.5422711
- ],
- [
- 1275046.0685966,
- 2828857.9792994
- ],
- [
- 1275122.5056249,
- 2828857.9792994
- ],
- [
- 1275122.5056249,
- 2828781.5422711
- ],
- [
- 1275046.0685966,
- 2828781.5422711
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278825,
- "y":299152,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275052.1344223,
- 2828934.4163276
- ],
- [
- 1275122.5056249,
- 2828934.4163276
- ],
- [
- 1275122.5056249,
- 2828857.9792994
- ],
- [
- 1275046.0685966,
- 2828857.9792994
- ],
- [
- 1275046.0685966,
- 2828908.286806
- ],
- [
- 1275052.1344223,
- 2828934.4163276
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278825,
- "y":299153,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275069.8788608,
- 2829010.8533559
- ],
- [
- 1275122.5056249,
- 2829010.8533559
- ],
- [
- 1275122.5056249,
- 2828934.4163276
- ],
- [
- 1275052.1344223,
- 2828934.4163276
- ],
- [
- 1275069.8788608,
- 2829010.8533559
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278825,
- "y":299154,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275087.6232994,
- 2829087.2903842
- ],
- [
- 1275122.5056249,
- 2829087.2903842
- ],
- [
- 1275122.5056249,
- 2829010.8533559
- ],
- [
- 1275069.8788608,
- 2829010.8533559
- ],
- [
- 1275087.6232994,
- 2829087.2903842
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278825,
- "y":299155,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275122.5056249,
- 2828781.5422711
- ],
- [
- 1275122.5056249,
- 2828857.9792994
- ],
- [
- 1275198.9426532,
- 2828857.9792994
- ],
- [
- 1275198.9426532,
- 2828781.5422711
- ],
- [
- 1275122.5056249,
- 2828781.5422711
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278826,
- "y":299152,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275122.5056249,
- 2828857.9792994
- ],
- [
- 1275122.5056249,
- 2828934.4163276
- ],
- [
- 1275198.9426532,
- 2828934.4163276
- ],
- [
- 1275198.9426532,
- 2828857.9792994
- ],
- [
- 1275122.5056249,
- 2828857.9792994
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278826,
- "y":299153,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275122.5056249,
- 2828934.4163276
- ],
- [
- 1275122.5056249,
- 2829010.8533559
- ],
- [
- 1275198.9426532,
- 2829010.8533559
- ],
- [
- 1275198.9426532,
- 2828934.4163276
- ],
- [
- 1275122.5056249,
- 2828934.4163276
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278826,
- "y":299154,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275122.5056249,
- 2829010.8533559
- ],
- [
- 1275122.5056249,
- 2829087.2903842
- ],
- [
- 1275198.9426532,
- 2829087.2903842
- ],
- [
- 1275198.9426532,
- 2829010.8533559
- ],
- [
- 1275122.5056249,
- 2829010.8533559
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278826,
- "y":299155,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275275.3796814,
- 2828783.0982896
- ],
- [
- 1275200.6907704,
- 2828781.5422711
- ],
- [
- 1275198.9426532,
- 2828781.5422711
- ],
- [
- 1275198.9426532,
- 2828857.9792994
- ],
- [
- 1275275.3796814,
- 2828857.9792994
- ],
- [
- 1275275.3796814,
- 2828783.0982896
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278827,
- "y":299152,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275198.9426532,
- 2828857.9792994
- ],
- [
- 1275198.9426532,
- 2828934.4163276
- ],
- [
- 1275275.3796814,
- 2828934.4163276
- ],
- [
- 1275275.3796814,
- 2828857.9792994
- ],
- [
- 1275198.9426532,
- 2828857.9792994
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278827,
- "y":299153,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275198.9426532,
- 2828934.4163276
- ],
- [
- 1275198.9426532,
- 2829010.8533559
- ],
- [
- 1275275.3796814,
- 2829010.8533559
- ],
- [
- 1275275.3796814,
- 2828934.4163276
- ],
- [
- 1275198.9426532,
- 2828934.4163276
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278827,
- "y":299154,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275198.9426532,
- 2829010.8533559
- ],
- [
- 1275198.9426532,
- 2829087.2903842
- ],
- [
- 1275275.3796814,
- 2829087.2903842
- ],
- [
- 1275275.3796814,
- 2829010.8533559
- ],
- [
- 1275198.9426532,
- 2829010.8533559
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278827,
- "y":299155,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275581.1277945,
- 2829087.2903842
- ],
- [
- 1275581.1277945,
- 2829163.7274125
- ],
- [
- 1275657.5648228,
- 2829163.7274125
- ],
- [
- 1275657.5648228,
- 2829087.2903842
- ],
- [
- 1275581.1277945,
- 2829087.2903842
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278832,
- "y":299156,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275581.1277945,
- 2829163.7274125
- ],
- [
- 1275581.1277945,
- 2829240.1644407
- ],
- [
- 1275657.5648228,
- 2829240.1644407
- ],
- [
- 1275657.5648228,
- 2829163.7274125
- ],
- [
- 1275581.1277945,
- 2829163.7274125
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278832,
- "y":299157,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275581.1277945,
- 2829306.6212479
- ],
- [
- 1275657.5648228,
- 2829305.5596227
- ],
- [
- 1275657.5648228,
- 2829240.1644407
- ],
- [
- 1275581.1277945,
- 2829240.1644407
- ],
- [
- 1275581.1277945,
- 2829306.6212479
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278832,
- "y":299158,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275657.5648228,
- 2829087.2903842
- ],
- [
- 1275657.5648228,
- 2829163.7274125
- ],
- [
- 1275734.0018511,
- 2829163.7274125
- ],
- [
- 1275734.0018511,
- 2829087.2903842
- ],
- [
- 1275657.5648228,
- 2829087.2903842
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278833,
- "y":299156,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275657.5648228,
- 2829163.7274125
- ],
- [
- 1275657.5648228,
- 2829240.1644407
- ],
- [
- 1275734.0018511,
- 2829240.1644407
- ],
- [
- 1275734.0018511,
- 2829163.7274125
- ],
- [
- 1275657.5648228,
- 2829163.7274125
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278833,
- "y":299157,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275734.0018511,
- 2829304.4979975
- ],
- [
- 1275734.0018511,
- 2829240.1644407
- ],
- [
- 1275657.5648228,
- 2829240.1644407
- ],
- [
- 1275657.5648228,
- 2829305.5596227
- ],
- [
- 1275734.0018511,
- 2829304.4979975
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278833,
- "y":299158,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275734.0018511,
- 2829087.2903842
- ],
- [
- 1275734.0018511,
- 2829163.7274125
- ],
- [
- 1275810.4388793,
- 2829163.7274125
- ],
- [
- 1275810.4388793,
- 2829087.2903842
- ],
- [
- 1275734.0018511,
- 2829087.2903842
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278834,
- "y":299156,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275734.0018511,
- 2829163.7274125
- ],
- [
- 1275734.0018511,
- 2829240.1644407
- ],
- [
- 1275810.4388793,
- 2829240.1644407
- ],
- [
- 1275810.4388793,
- 2829163.7274125
- ],
- [
- 1275734.0018511,
- 2829163.7274125
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":true,
- "x":278834,
- "y":299157,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275810.4388793,
- 2829303.4363723
- ],
- [
- 1275810.4388793,
- 2829240.1644407
- ],
- [
- 1275734.0018511,
- 2829240.1644407
- ],
- [
- 1275734.0018511,
- 2829304.4979975
- ],
- [
- 1275810.4388793,
- 2829303.4363723
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278834,
- "y":299158,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275810.4388793,
- 2829087.2903842
- ],
- [
- 1275810.4388793,
- 2829163.7274125
- ],
- [
- 1275856.8401371,
- 2829163.7274125
- ],
- [
- 1275872.7042755,
- 2829087.2903842
- ],
- [
- 1275810.4388793,
- 2829087.2903842
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278835,
- "y":299156,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275856.8401371,
- 2829163.7274125
- ],
- [
- 1275810.4388793,
- 2829163.7274125
- ],
- [
- 1275810.4388793,
- 2829240.1644407
- ],
- [
- 1275840.9759988,
- 2829240.1644407
- ],
- [
- 1275856.8401371,
- 2829163.7274125
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278835,
- "y":299157,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275827.8945302,
- 2829303.1939328
- ],
- [
- 1275840.9759988,
- 2829240.1644407
- ],
- [
- 1275810.4388793,
- 2829240.1644407
- ],
- [
- 1275810.4388793,
- 2829303.4363723
- ],
- [
- 1275827.8945302,
- 2829303.1939328
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278835,
- "y":299158,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275886.8759076,
- 2828795.8377961
- ],
- [
- 1275886.8759076,
- 2828857.9792994
- ],
- [
- 1275920.2974494,
- 2828857.9792994
- ],
- [
- 1275932.995444,
- 2828796.7986204
- ],
- [
- 1275886.8759076,
- 2828795.8377961
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278836,
- "y":299152,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275886.8759076,
- 2828934.4163276
- ],
- [
- 1275904.4330133,
- 2828934.4163276
- ],
- [
- 1275920.2974494,
- 2828857.9792994
- ],
- [
- 1275886.8759076,
- 2828857.9792994
- ],
- [
- 1275886.8759076,
- 2828934.4163276
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278836,
- "y":299153,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275886.8759076,
- 2829010.8533559
- ],
- [
- 1275888.5685772,
- 2829010.8533559
- ],
- [
- 1275904.4330133,
- 2828934.4163276
- ],
- [
- 1275886.8759076,
- 2828934.4163276
- ],
- [
- 1275886.8759076,
- 2829010.8533559
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278836,
- "y":299154,
- "zoom":19
- }
- },
- {
- "type":"Feature",
- "geometry":{
- "type":"MultiPolygon",
- "coordinates":[
- [
- [
- [
- 1275886.8759076,
- 2829019.00887
- ],
- [
- 1275888.5685772,
- 2829010.8533559
- ],
- [
- 1275886.8759076,
- 2829010.8533559
- ],
- [
- 1275886.8759076,
- 2829019.00887
- ]
- ]
- ]
- ]
- },
- "properties":{
- "isSquare":false,
- "x":278836,
- "y":299155,
- "zoom":19
- }
- }
- ]
-}
diff --git a/tests/backend/helpers/test_files/feature_collection.json b/tests/backend/helpers/test_files/feature_collection.json
deleted file mode 100644
index 79c474a2fc..0000000000
--- a/tests/backend/helpers/test_files/feature_collection.json
+++ /dev/null
@@ -1,1145 +0,0 @@
-{
- "features": [
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1274969.631568361,
- 2828781.5422710925
- ],
- [
- 1274969.631568361,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828781.5422710925
- ],
- [
- 1274969.631568361,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278824,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1274969.631568361,
- 2828857.9792993665
- ],
- [
- 1274969.631568361,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1274969.631568361,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278824,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2828781.5422710925
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828781.5422710925
- ],
- [
- 1275046.0685966313,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2829010.853355907
- ],
- [
- 1275046.0685966313,
- 2829087.290384181
- ],
- [
- 1275122.5056249015,
- 2829087.290384181
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275046.0685966313,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2828781.5422710925
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828781.5422710925
- ],
- [
- 1275122.5056249015,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2829087.290384181
- ],
- [
- 1275198.9426531754,
- 2829087.290384181
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2828781.5422710925
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275275.3796814457,
- 2828857.9792993665
- ],
- [
- 1275275.3796814457,
- 2828781.5422710925
- ],
- [
- 1275198.9426531754,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275275.3796814457,
- 2828934.4163276367
- ],
- [
- 1275275.3796814457,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275275.3796814457,
- 2829010.853355907
- ],
- [
- 1275275.3796814457,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2829087.290384181
- ],
- [
- 1275275.3796814457,
- 2829087.290384181
- ],
- [
- 1275275.3796814457,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275581.1277945302,
- 2829087.290384181
- ],
- [
- 1275581.1277945302,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829087.290384181
- ],
- [
- 1275581.1277945302,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278832,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275581.1277945302,
- 2829163.727412451
- ],
- [
- 1275581.1277945302,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275581.1277945302,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278832,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275581.1277945302,
- 2829240.1644407213
- ],
- [
- 1275581.1277945302,
- 2829316.601468995
- ],
- [
- 1275657.5648228042,
- 2829316.601468995
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275581.1277945302,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278832,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275657.5648228042,
- 2829087.290384181
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829087.290384181
- ],
- [
- 1275657.5648228042,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278833,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278833,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829316.601468995
- ],
- [
- 1275734.0018510744,
- 2829316.601468995
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278833,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275734.0018510744,
- 2829087.290384181
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829087.290384181
- ],
- [
- 1275734.0018510744,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278834,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278834,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829316.601468995
- ],
- [
- 1275810.4388793446,
- 2829316.601468995
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278834,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275810.4388793446,
- 2829087.290384181
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275886.8759076186,
- 2829163.727412451
- ],
- [
- 1275886.8759076186,
- 2829087.290384181
- ],
- [
- 1275810.4388793446,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278835,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275886.8759076186,
- 2829240.1644407213
- ],
- [
- 1275886.8759076186,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278835,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829316.601468995
- ],
- [
- 1275886.8759076186,
- 2829316.601468995
- ],
- [
- 1275886.8759076186,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278835,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2828781.5422710925
- ],
- [
- 1275886.8759076186,
- 2828857.9792993665
- ],
- [
- 1275963.3129358888,
- 2828857.9792993665
- ],
- [
- 1275963.3129358888,
- 2828781.5422710925
- ],
- [
- 1275886.8759076186,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2828857.9792993665
- ],
- [
- 1275886.8759076186,
- 2828934.4163276367
- ],
- [
- 1275963.3129358888,
- 2828934.4163276367
- ],
- [
- 1275963.3129358888,
- 2828857.9792993665
- ],
- [
- 1275886.8759076186,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2828934.4163276367
- ],
- [
- 1275886.8759076186,
- 2829010.853355907
- ],
- [
- 1275963.3129358888,
- 2829010.853355907
- ],
- [
- 1275963.3129358888,
- 2828934.4163276367
- ],
- [
- 1275886.8759076186,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2829010.853355907
- ],
- [
- 1275886.8759076186,
- 2829087.290384181
- ],
- [
- 1275963.3129358888,
- 2829087.290384181
- ],
- [
- 1275963.3129358888,
- 2829010.853355907
- ],
- [
- 1275886.8759076186,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- }
- ],
- "type": "FeatureCollection"
-}
diff --git a/tests/backend/helpers/test_files/feature_collection_one_multipolygon.json b/tests/backend/helpers/test_files/feature_collection_one_multipolygon.json
deleted file mode 100644
index 5f38017036..0000000000
--- a/tests/backend/helpers/test_files/feature_collection_one_multipolygon.json
+++ /dev/null
@@ -1,1563 +0,0 @@
-{
- "features": [
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1274969.631568361,
- 2828781.5422710925
- ],
- [
- 1274969.631568361,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828781.5422710925
- ],
- [
- 1274969.631568361,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278824,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1274969.631568361,
- 2828857.9792993665
- ],
- [
- 1274969.631568361,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1274969.631568361,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278824,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2828781.5422710925
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828781.5422710925
- ],
- [
- 1275046.0685966313,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275046.0685966313,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275046.0685966313,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2829010.853355907
- ],
- [
- 1275046.0685966313,
- 2829087.290384181
- ],
- [
- 1275122.5056249015,
- 2829087.290384181
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275046.0685966313,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275046.0685966313,
- 2829087.290384181
- ],
- [
- 1275046.0685966313,
- 2829163.727412451
- ],
- [
- 1275122.5056249015,
- 2829163.727412451
- ],
- [
- 1275122.5056249015,
- 2829087.290384181
- ],
- [
- 1275046.0685966313,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278825,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2828781.5422710925
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828781.5422710925
- ],
- [
- 1275122.5056249015,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275122.5056249015,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275122.5056249015,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2829087.290384181
- ],
- [
- 1275198.9426531754,
- 2829087.290384181
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275122.5056249015,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275122.5056249015,
- 2829087.290384181
- ],
- [
- 1275122.5056249015,
- 2829163.727412451
- ],
- [
- 1275198.9426531754,
- 2829163.727412451
- ],
- [
- 1275198.9426531754,
- 2829087.290384181
- ],
- [
- 1275122.5056249015,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278826,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2828781.5422710925
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275275.3796814457,
- 2828857.9792993665
- ],
- [
- 1275275.3796814457,
- 2828781.5422710925
- ],
- [
- 1275198.9426531754,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275275.3796814457,
- 2828934.4163276367
- ],
- [
- 1275275.3796814457,
- 2828857.9792993665
- ],
- [
- 1275198.9426531754,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275275.3796814457,
- 2829010.853355907
- ],
- [
- 1275275.3796814457,
- 2828934.4163276367
- ],
- [
- 1275198.9426531754,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2829087.290384181
- ],
- [
- 1275275.3796814457,
- 2829087.290384181
- ],
- [
- 1275275.3796814457,
- 2829010.853355907
- ],
- [
- 1275198.9426531754,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275198.9426531754,
- 2829087.290384181
- ],
- [
- 1275198.9426531754,
- 2829163.727412451
- ],
- [
- 1275275.3796814457,
- 2829163.727412451
- ],
- [
- 1275275.3796814457,
- 2829087.290384181
- ],
- [
- 1275198.9426531754,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278827,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275504.69076626,
- 2829010.853355907
- ],
- [
- 1275504.69076626,
- 2829087.290384181
- ],
- [
- 1275581.1277945302,
- 2829087.290384181
- ],
- [
- 1275581.1277945302,
- 2829010.853355907
- ],
- [
- 1275504.69076626,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278831,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275504.69076626,
- 2829087.290384181
- ],
- [
- 1275504.69076626,
- 2829163.727412451
- ],
- [
- 1275581.1277945302,
- 2829163.727412451
- ],
- [
- 1275581.1277945302,
- 2829087.290384181
- ],
- [
- 1275504.69076626,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278831,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275504.69076626,
- 2829163.727412451
- ],
- [
- 1275504.69076626,
- 2829240.1644407213
- ],
- [
- 1275581.1277945302,
- 2829240.1644407213
- ],
- [
- 1275581.1277945302,
- 2829163.727412451
- ],
- [
- 1275504.69076626,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278831,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275504.69076626,
- 2829240.1644407213
- ],
- [
- 1275504.69076626,
- 2829316.601468995
- ],
- [
- 1275581.1277945302,
- 2829316.601468995
- ],
- [
- 1275581.1277945302,
- 2829240.1644407213
- ],
- [
- 1275504.69076626,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278831,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275581.1277945302,
- 2829010.853355907
- ],
- [
- 1275581.1277945302,
- 2829087.290384181
- ],
- [
- 1275657.5648228042,
- 2829087.290384181
- ],
- [
- 1275657.5648228042,
- 2829010.853355907
- ],
- [
- 1275581.1277945302,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278832,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275581.1277945302,
- 2829087.290384181
- ],
- [
- 1275581.1277945302,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829087.290384181
- ],
- [
- 1275581.1277945302,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278832,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275581.1277945302,
- 2829163.727412451
- ],
- [
- 1275581.1277945302,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275581.1277945302,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278832,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275581.1277945302,
- 2829240.1644407213
- ],
- [
- 1275581.1277945302,
- 2829316.601468995
- ],
- [
- 1275657.5648228042,
- 2829316.601468995
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275581.1277945302,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278832,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275657.5648228042,
- 2829010.853355907
- ],
- [
- 1275657.5648228042,
- 2829087.290384181
- ],
- [
- 1275734.0018510744,
- 2829087.290384181
- ],
- [
- 1275734.0018510744,
- 2829010.853355907
- ],
- [
- 1275657.5648228042,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278833,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275657.5648228042,
- 2829087.290384181
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829087.290384181
- ],
- [
- 1275657.5648228042,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278833,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275657.5648228042,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275657.5648228042,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278833,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275657.5648228042,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829316.601468995
- ],
- [
- 1275734.0018510744,
- 2829316.601468995
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275657.5648228042,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278833,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275734.0018510744,
- 2829010.853355907
- ],
- [
- 1275734.0018510744,
- 2829087.290384181
- ],
- [
- 1275810.4388793446,
- 2829087.290384181
- ],
- [
- 1275810.4388793446,
- 2829010.853355907
- ],
- [
- 1275734.0018510744,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278834,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275734.0018510744,
- 2829087.290384181
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829087.290384181
- ],
- [
- 1275734.0018510744,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278834,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275734.0018510744,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275734.0018510744,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278834,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275734.0018510744,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829316.601468995
- ],
- [
- 1275810.4388793446,
- 2829316.601468995
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275734.0018510744,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278834,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275810.4388793446,
- 2829010.853355907
- ],
- [
- 1275810.4388793446,
- 2829087.290384181
- ],
- [
- 1275886.8759076186,
- 2829087.290384181
- ],
- [
- 1275886.8759076186,
- 2829010.853355907
- ],
- [
- 1275810.4388793446,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278835,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275810.4388793446,
- 2829087.290384181
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275886.8759076186,
- 2829163.727412451
- ],
- [
- 1275886.8759076186,
- 2829087.290384181
- ],
- [
- 1275810.4388793446,
- 2829087.290384181
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278835,
- "y": 299156,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275810.4388793446,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275886.8759076186,
- 2829240.1644407213
- ],
- [
- 1275886.8759076186,
- 2829163.727412451
- ],
- [
- 1275810.4388793446,
- 2829163.727412451
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278835,
- "y": 299157,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275810.4388793446,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829316.601468995
- ],
- [
- 1275886.8759076186,
- 2829316.601468995
- ],
- [
- 1275886.8759076186,
- 2829240.1644407213
- ],
- [
- 1275810.4388793446,
- 2829240.1644407213
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278835,
- "y": 299158,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2828781.5422710925
- ],
- [
- 1275886.8759076186,
- 2828857.9792993665
- ],
- [
- 1275963.3129358888,
- 2828857.9792993665
- ],
- [
- 1275963.3129358888,
- 2828781.5422710925
- ],
- [
- 1275886.8759076186,
- 2828781.5422710925
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299152,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2828857.9792993665
- ],
- [
- 1275886.8759076186,
- 2828934.4163276367
- ],
- [
- 1275963.3129358888,
- 2828934.4163276367
- ],
- [
- 1275963.3129358888,
- 2828857.9792993665
- ],
- [
- 1275886.8759076186,
- 2828857.9792993665
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299153,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2828934.4163276367
- ],
- [
- 1275886.8759076186,
- 2829010.853355907
- ],
- [
- 1275963.3129358888,
- 2829010.853355907
- ],
- [
- 1275963.3129358888,
- 2828934.4163276367
- ],
- [
- 1275886.8759076186,
- 2828934.4163276367
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299154,
- "zoom": 19
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 1275886.8759076186,
- 2829010.853355907
- ],
- [
- 1275886.8759076186,
- 2829087.290384181
- ],
- [
- 1275963.3129358888,
- 2829087.290384181
- ],
- [
- 1275963.3129358888,
- 2829010.853355907
- ],
- [
- 1275886.8759076186,
- 2829010.853355907
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": true,
- "x": 278836,
- "y": 299155,
- "zoom": 19
- },
- "type": "Feature"
- }
- ],
- "type": "FeatureCollection"
-}
diff --git a/tests/backend/helpers/test_files/multi_polygon.json b/tests/backend/helpers/test_files/multi_polygon.json
deleted file mode 100644
index 0806502ef9..0000000000
--- a/tests/backend/helpers/test_files/multi_polygon.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "coordinates": [
- [
- [
- [
- 1275275.379681445,
- 2828783.098289569
- ],
- [
- 1275200.690770448,
- 2828781.542271093
- ],
- [
- 1275016.64554516,
- 2828781.542271093
- ],
- [
- 1275087.623299365,
- 2829087.290384181
- ],
- [
- 1275275.379681445,
- 2829087.290384181
- ],
- [
- 1275275.379681445,
- 2828783.098289569
- ]
- ]
- ],
- [
- [
- [
- 1275581.12779453,
- 2829306.621247852
- ],
- [
- 1275827.894530152,
- 2829303.193932765
- ],
- [
- 1275872.704275511,
- 2829087.290384181
- ],
- [
- 1275581.12779453,
- 2829087.290384181
- ],
- [
- 1275581.12779453,
- 2829306.621247852
- ]
- ]
- ],
- [
- [
- [
- 1275886.875907619,
- 2829019.008869979
- ],
- [
- 1275932.995444044,
- 2828796.798620377
- ],
- [
- 1275886.875907619,
- 2828795.837796132
- ],
- [
- 1275886.875907619,
- 2829019.008869979
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
-}
diff --git a/tests/backend/helpers/test_files/multi_polygon_dissolved.json b/tests/backend/helpers/test_files/multi_polygon_dissolved.json
deleted file mode 100644
index 08c86cf7fa..0000000000
--- a/tests/backend/helpers/test_files/multi_polygon_dissolved.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "coordinates": [
- [
- [
- [
- 1275886.875907619,
- 2829019.008869979
- ],
- [
- 1275932.995444044,
- 2828796.798620377
- ],
- [
- 1275886.875907619,
- 2828795.837796132
- ],
- [
- 1275886.875907619,
- 2829019.008869979
- ]
- ]
- ],
- [
- [
- [
- 1275275.379681445,
- 2828783.098289569
- ],
- [
- 1275200.690770448,
- 2828781.542271093
- ],
- [
- 1275016.64554516,
- 2828781.542271093
- ],
- [
- 1275087.623299365,
- 2829087.290384181
- ],
- [
- 1275275.379681445,
- 2829087.290384181
- ],
- [
- 1275275.379681445,
- 2828783.098289569
- ]
- ]
- ],
- [
- [
- [
- 1275581.12779453,
- 2829306.621247852
- ],
- [
- 1275827.894530152,
- 2829303.193932765
- ],
- [
- 1275872.704275511,
- 2829087.290384181
- ],
- [
- 1275581.12779453,
- 2829087.290384181
- ],
- [
- 1275581.12779453,
- 2829306.621247852
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
-}
diff --git a/tests/backend/helpers/test_files/non_square_project_aoi.json b/tests/backend/helpers/test_files/non_square_project_aoi.json
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/tests/backend/helpers/test_files/non_square_split_results.json b/tests/backend/helpers/test_files/non_square_split_results.json
deleted file mode 100644
index 67ef17f98b..0000000000
--- a/tests/backend/helpers/test_files/non_square_split_results.json
+++ /dev/null
@@ -1,214 +0,0 @@
-[
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 152.401608,
- -31.9521622
- ],
- [
- 151.875,
- -31.9521622
- ],
- [
- 151.875,
- -31.3112796
- ],
- [
- 152.401608,
- -31.3112796
- ],
- [
- 152.401608,
- -31.9521622
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": false,
- "x": null,
- "y": null,
- "zoom": null
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 151.875,
- -31.3112796
- ],
- [
- 151.875,
- -30.7512778
- ],
- [
- 152.401608,
- -30.7512778
- ],
- [
- 152.401608,
- -31.3112796
- ],
- [
- 151.875,
- -31.3112796
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": false,
- "x": null,
- "y": null,
- "zoom": null
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 152.9646946,
- -31.3112796
- ],
- [
- 152.9646946,
- -31.3148763
- ],
- [
- 152.9409267,
- -31.3605527
- ],
- [
- 152.9495622,
- -31.4453842
- ],
- [
- 152.9052747,
- -31.4771805
- ],
- [
- 152.8577388,
- -31.5734156
- ],
- [
- 152.8042608,
- -31.6695516
- ],
- [
- 152.7329569,
- -31.8160937
- ],
- [
- 152.673537,
- -31.8817097
- ],
- [
- 152.5951471,
- -31.9521622
- ],
- [
- 152.401608,
- -31.9521622
- ],
- [
- 152.401608,
- -31.3112796
- ],
- [
- 152.9646946,
- -31.3112796
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": false,
- "x": null,
- "y": null,
- "zoom": null
- },
- "type": "Feature"
- },
- {
- "geometry": {
- "coordinates": [
- [
- [
- [
- 153.0026299,
- -30.7512778
- ],
- [
- 153.0122306,
- -30.80077
- ],
- [
- 153.0419406,
- -30.8568964
- ],
- [
- 153.0894765,
- -30.91299
- ],
- [
- 153.0478825,
- -30.994522
- ],
- [
- 153.0419406,
- -31.0658054
- ],
- [
- 153.0003466,
- -31.1268629
- ],
- [
- 152.9646946,
- -31.223457
- ],
- [
- 152.9646946,
- -31.3112796
- ],
- [
- 152.401608,
- -31.3112796
- ],
- [
- 152.401608,
- -30.7512778
- ],
- [
- 153.0026299,
- -30.7512778
- ]
- ]
- ]
- ],
- "type": "MultiPolygon"
- },
- "properties": {
- "isSquare": false,
- "x": null,
- "y": null,
- "zoom": null
- },
- "type": "Feature"
- }
-]
diff --git a/tests/backend/helpers/test_files/non_square_task.json b/tests/backend/helpers/test_files/non_square_task.json
deleted file mode 100644
index c88d7cd023..0000000000
--- a/tests/backend/helpers/test_files/non_square_task.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "type": "Feature",
- "geometry": {
- "type": "MultiPolygon",
- "coordinates": [
- [
- [
- [153.002629854192, -30.7512777712788],
- [153.012230588, -30.800769981],
- [153.041940554, -30.8568964],
- [153.0894765, -30.912989989],
- [153.047882548, -30.994521987],
- [153.041940554, -31.065805365],
- [153.000346602, -31.126862915],
- [152.964694643, -31.223457045],
- [152.964694643, -31.314876311],
- [152.94092667, -31.360552708],
- [152.949562214, -31.445384196],
- [152.905274711, -31.47718046],
- [152.857738766, -31.573415644],
- [152.804260827, -31.669551593],
- [152.732956909, -31.816093707],
- [152.673536977, -31.881709671],
- [152.595147099906, -31.9521622328954],
- [151.874999972795, -31.9521622328954],
- [151.874999972795, -30.7512777712788],
- [153.002629854192, -30.7512777712788]
- ]
- ]
- ]
- },
- "properties": {
- "x": 236,
- "y": 104,
- "zoom": 8,
- "isSquare": false
- }
-}
diff --git a/tests/backend/helpers/test_files/osm_sample.xml b/tests/backend/helpers/test_files/osm_sample.xml
deleted file mode 100644
index e047ba76d7..0000000000
--- a/tests/backend/helpers/test_files/osm_sample.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
Test comment
") - mock_send_message.assert_called_once() - - # get - def test_get_chat_messages_of_non_existent_project_fails(self): - """ - Test that endpoint returns 404 when retrieving the chat of a non-existent project - """ - response = self.client.get(self.non_existent_url) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], PROJECT_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], PROJECT_NOT_FOUND_SUB_CODE) - - def test_get_project_chat_messages_passes(self): - """ - Test that endpoint returns 200 when retrieving the task chat of an existing project - """ - response = self.client.get(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body, {"chat": [], "pagination": None}) - # to do: add comments and test again - - -class TestCommentsProjectsRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_author_token = generate_encoded_token(self.test_author.id) - self.test_user = return_canned_user(username="test_user", id=10000) - self.test_user.create() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.test_comment = self.create_project_chat(self.test_author) - self.endpoint_url = ( - f"/api/v2/projects/{self.test_project.id}/comments/{self.test_comment.id}/" - ) - self.non_existent_url = f"/api/v2/projects/{self.test_project.id}/comments/100/" - - def create_project_chat(self, user): - """ - Helper method to create a project chat for a user for testing - ---------------- - :param user: User object - :return: Comment object - """ - chat_dto = ChatMessageDTO() - chat_dto.message = "Test Message" - chat_dto.user_id = user.id - chat_dto.project_id = self.test_project.id - chat_dto.timestamp = "2022-06-30T05:45:06.198755Z" - chat_dto.username = user.username - comments = ChatService.post_message( - chat_dto, self.test_project.id, self.test_author.id - ) - return comments.chat[0] - - # delete - def test_delete_comment_returns_401_if_user_not_logged_in(self): - """ - Test that endpoint returns 401 when deleting a comment of a project by an unauthenticated user - """ - # Act - response = self.client.delete(self.endpoint_url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_delete_non_existent_comment_fails(self): - """Test that endpoint returns 404 when deleting a non-existent comment""" - # Act - response = self.client.delete( - self.non_existent_url, headers={"Authorization": self.test_author_token} - ) - response_body = response.get_json() - error_details = response_body["error"] - # Assert - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], MESSAGE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], MESSAGE_NOT_FOUND_SUB_CODE) - - def test_returns_403_if_user_not_allowed_to_delete_comment(self): - """ - Test that endpoint returns 403 when deleting a comment - by a user who is not allowed i.e. not the comment author or PM. - """ - # Act - response = self.client.delete( - self.endpoint_url, headers={"Authorization": self.test_user_token} - ) - # Assert - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual(response_body["Error"], " User not allowed to delete message") - self.assertEqual(response_body["SubCode"], "DeletePermissionError") - - def test_comment_can_be_deleted_by_author(self): - """Test that endpoint returns 200 when deleting a comment of a project by the comment author""" - # Arrange - # Let's create a comment by the test user and delete it using the test user - test_comment = self.create_project_chat(self.test_user) - endpoint_url = ( - f"/api/v2/projects/{self.test_project.id}/comments/{test_comment.id}/" - ) - # Act - response = self.client.delete( - endpoint_url, headers={"Authorization": self.test_user_token} - ) - response_body = response.get_json() - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "Comment deleted") - with self.assertRaises(NotFound): - ChatService.get_project_chat_by_id(self.test_project.id, test_comment.id) - - def test_pm_can_delete_any_comment(self): - """Test that endpoint returns 200 when deleting a comment of a project by the PM""" - # Arrange - # Let's create a comment by the test user and delete it using the test author - test_comment = self.create_project_chat(self.test_user) - endpoint_url = ( - f"/api/v2/projects/{self.test_project.id}/comments/{test_comment.id}/" - ) - # Act - response = self.client.delete( - endpoint_url, headers={"Authorization": self.test_author_token} - ) - response_body = response.get_json() - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "Comment deleted") - with self.assertRaises(NotFound): - ChatService.get_project_chat_by_id(self.test_project.id, test_comment.id) - - -class TestCommentsTasksRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_author_token = generate_encoded_token(self.test_author.id) - self.endpoint_url = f"/api/v2/projects/{self.test_project.id}/comments/tasks/1/" - self.non_existent_url = "/api/v2/projects/99/comments/tasks/1/" - - # post - def test_post_comment_to_task_chat_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when an unauthenticated user posts a comment to the task chat - """ - response = self.client.post(self.endpoint_url, json={"comment": TEST_MESSAGE}) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_post_comment_to_task_chat_by_blocked_user_fails(self): - """ - Test that endpoint returns 403 when a blocked user posts a comment to the task chat - """ - # setup - self.test_user = return_canned_user("test_user", 33333) - self.test_user.create() - self.test_user.role = UserRole.READ_ONLY.value - # action - response = self.client.post( - self.endpoint_url, - headers={"Authorization": generate_encoded_token(self.test_user.id)}, - json={"comment": TEST_MESSAGE}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual(response_body["Error"], "User is on read only mode") - self.assertEqual(response_body["SubCode"], "ReadOnly") - - def test_post_comment_to_task_chat_using_an_invalid_request_fails(self): - """ - Test that endpoint returns 400 when an invalid request to post a comment to the task chat is made - """ - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.test_author_token}, - json={"message": TEST_MESSAGE}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual(response_body["Error"], "Unable to add comment") - self.assertEqual(response_body["SubCode"], "InvalidData") - - def test_post_comment_to_task_chat_of_non_existent_project_fails(self): - """ - Test that endpoint returns 404 when user fails to post a comment to a non-existent project task chat - """ - response = self.client.post( - self.non_existent_url, - headers={"Authorization": self.test_author_token}, - json={"comment": TEST_MESSAGE}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], PROJECT_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], PROJECT_NOT_FOUND_SUB_CODE) - - def test_post_comment_to_task_chat_passes(self): - """ - Test that endpoint returns 201 when user successfully posts a comment to the task chat - """ - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.test_author_token}, - json={"comment": TEST_MESSAGE}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 201) - self.assertEqual(response_body["taskId"], 1) - - # GET method: no tests - # Reason: not fully implemented - # backend/api/comments/resources.py L228 diff --git a/tests/backend/integration/api/countries/__init__.py b/tests/backend/integration/api/countries/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/countries/test_resources.py b/tests/backend/integration/api/countries/test_resources.py deleted file mode 100644 index f4805bca06..0000000000 --- a/tests/backend/integration/api/countries/test_resources.py +++ /dev/null @@ -1,28 +0,0 @@ -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import create_canned_project - -TEST_COUNTRY = "Test Country" - - -class TestCountriesRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, _ = create_canned_project() - self.endpoint_url = "/api/v2/countries/" - - def test_get_all_country_tags_passes(self): - """ - Test that endpoint returns 200 when getting all country tags successfully - """ - response1 = self.client.get(self.endpoint_url) - response_body1 = response1.get_json() - self.assertEqual(response1.status_code, 200) - self.assertEqual(len(response_body1["tags"]), 0) - self.assertEqual(response_body1["tags"], []) - # set up: add at least one country tag and test that - self.test_project.country = [TEST_COUNTRY] - response2 = self.client.get(self.endpoint_url) - response_body2 = response2.get_json() - self.assertEqual(response2.status_code, 200) - self.assertEqual(len(response_body2["tags"]), 1) - self.assertEqual(response_body2["tags"], [TEST_COUNTRY]) diff --git a/tests/backend/integration/api/interests/__init__.py b/tests/backend/integration/api/interests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/interests/test_resources.py b/tests/backend/integration/api/interests/test_resources.py deleted file mode 100644 index e345906057..0000000000 --- a/tests/backend/integration/api/interests/test_resources.py +++ /dev/null @@ -1,335 +0,0 @@ -from backend.exceptions import get_message_from_sub_code -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - add_manager_to_organisation, - create_canned_interest, - create_canned_organisation, - create_canned_user, - generate_encoded_token, -) - -TEST_INTEREST_NAME = "test_interest" -NEW_INTEREST_NAME = "New Interest" -INTEREST_NOT_FOUND_SUB_CODE = "INTEREST_NOT_FOUND" -INTEREST_NOT_FOUND_MESSAGE = get_message_from_sub_code(INTEREST_NOT_FOUND_SUB_CODE) - - -class TestInterestsAllAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_organisation = create_canned_organisation() - self.test_user = create_canned_user() - self.test_interest = create_canned_interest() - self.session_token = generate_encoded_token(self.test_user.id) - self.endpoint_url = "/api/v2/interests/" - - # post - def test_create_a_new_interest_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 during creation of new interest by an unauthenticated user - """ - response = self.client.post(self.endpoint_url, json={"name": NEW_INTEREST_NAME}) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_create_a_new_interest_by_non_admin_fails(self): - """ - Test that endpoint returns 403 during creation of new interest by non admin - """ - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"name": NEW_INTEREST_NAME}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual( - response_body["Error"], "InterestsAllAPI POST: User not a Org Manager" - ) - self.assertEqual(response_body["SubCode"], "UserNotPermitted") - - def test_create_a_new_interest_using_invalid_data_fails(self): - """ - Test that endpoint returns 400 during creation of new interest with bad/wrong request data - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"interest_name": NEW_INTEREST_NAME}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual(response_body["SubCode"], "InvalidData") - - def test_create_an_already_existing_interest_by_organisation_admin_fails(self): - """ - Test that endpoint returns 400 when admin creates a new interest that already exists - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"name": TEST_INTEREST_NAME}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual( - response_body["Error"], f"Value '{TEST_INTEREST_NAME}' already exists" - ) - self.assertEqual(response_body["SubCode"], "NameExists") - - def test_create_a_new_interest_by_organisation_admin_passes(self): - """ - Test that endpoint returns 200 after successful creation of new interest by admin - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"name": NEW_INTEREST_NAME}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["name"], NEW_INTEREST_NAME) - - def test_create_a_new_interest_with_empty_name_fails(self): - """ - Test that endpoint returns 400 when admin creates a new interest with empty name - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"name": ""}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual(response_body["SubCode"], "InvalidData") - - # get - def test_get_all_interest_passes(self): - """ - Test that endpoint returns 200 when retrieving list of interests - """ - response = self.client.get(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["interests"]), 1) - self.assertEqual(response_body["interests"][0]["name"], TEST_INTEREST_NAME) - - -class TestInterestsRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_organisation = create_canned_organisation() - self.test_user = create_canned_user() - self.test_interest = create_canned_interest() - self.session_token = generate_encoded_token(self.test_user.id) - self.endpoint_url = f"/api/v2/interests/{self.test_interest.id}/" - self.non_existent_interest_url = "/api/v2/interests/99/" - - # get - def test_get_an_interest_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when fetching an interest by an unauthenticated user - """ - response = self.client.get(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_get_an_interest_by_non_admin_fails(self): - """ - Test that endpoint returns 403 when fetching an interest by non admin - """ - response = self.client.get( - self.endpoint_url, - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual( - response_body["Error"], "InterestsRestAPI GET: User not a Org Manager" - ) - self.assertEqual(response_body["SubCode"], "UserNotPermitted") - - def test_get_a_non_existent_interest_fails(self): - """ - Test that endpoint returns 404 when fetching a non-existent interest by admin - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.get( - self.non_existent_interest_url, - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], INTEREST_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], INTEREST_NOT_FOUND_SUB_CODE) - - def test_get_an_existing_interest_by_organisation_admin_passes(self): - """ - Test that endpoint returns 200 when fetching an existing interest by admin - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.get( - self.endpoint_url, - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["name"], TEST_INTEREST_NAME) - - # patch - def test_update_an_interest_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when updating an interest by an unauthenticated user - """ - response = self.client.patch( - self.endpoint_url, json={"name": NEW_INTEREST_NAME} - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_update_an_interest_by_non_admin_fails(self): - """ - Test that endpoint returns 403 when updating an interest by non admin - """ - response = self.client.patch( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"name": NEW_INTEREST_NAME}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual( - response_body["Error"], "InterestsRestAPI PATCH: User not a Org Manager" - ) - self.assertEqual(response_body["SubCode"], "UserNotPermitted") - - def test_update_a_non_existent_interest_fails(self): - """ - Test that endpoint returns 404 when updating a non-existent interest by admin - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.patch( - self.non_existent_interest_url, - headers={"Authorization": self.session_token}, - json={"name": NEW_INTEREST_NAME}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], INTEREST_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], INTEREST_NOT_FOUND_SUB_CODE) - - def test_update_an_existent_interest_with_invalid_data_fails(self): - """ - Test that endpoint returns 400 when updating an interest using invalid request data - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.patch( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"interest_name": NEW_INTEREST_NAME}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual(response_body["SubCode"], "InvalidData") - - def test_update_an_interest_with_empty_name_fails(self): - """ - Test that endpoint returns 400 when updating an interest with empty name - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.patch( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"name": ""}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual(response_body["SubCode"], "InvalidData") - - def test_update_an_existing_interest_by_organisation_admin_passes(self): - """ - Test that endpoint returns 200 when updating an existing interest by admin - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.patch( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={"name": NEW_INTEREST_NAME}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["name"], NEW_INTEREST_NAME) - - # delete - def test_delete_an_interest_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when deleting an interest by an unauthenticated user - """ - response = self.client.delete(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_delete_an_interest_by_non_admin_fails(self): - """ - Test that endpoint returns 403 when deleting an interest by non admin - """ - response = self.client.delete( - self.endpoint_url, - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual( - response_body["Error"], "InterestsRestAPI DELETE: User not a Org Manager" - ) - self.assertEqual(response_body["SubCode"], "UserNotPermitted") - - def test_delete_a_non_existent_interest_fails(self): - """ - Test that endpoint returns 404 when deleting a non-existent interest by admin - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.delete( - self.non_existent_interest_url, - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], INTEREST_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], INTEREST_NOT_FOUND_SUB_CODE) - - def test_delete_an_existing_interest_by_organisation_admin_passes(self): - """ - Test that endpoint returns 200 when deleting an existing interest by admin - """ - # setup: make test user organisation admin - add_manager_to_organisation(self.test_organisation, self.test_user) - response = self.client.delete( - self.endpoint_url, - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "Interest deleted") diff --git a/tests/backend/integration/api/issues/__init__.py b/tests/backend/integration/api/issues/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/issues/test_resources.py b/tests/backend/integration/api/issues/test_resources.py deleted file mode 100644 index 46b6bf8e55..0000000000 --- a/tests/backend/integration/api/issues/test_resources.py +++ /dev/null @@ -1,216 +0,0 @@ -from backend.exceptions import get_message_from_sub_code -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_mapping_issue, - create_canned_user, - generate_encoded_token, -) - -TEST_ISSUE_NAME = "Test Issue" -TEST_ISSUE_DESCRIPTION = "Test issue description" -ISSUE_NOT_FOUND_SUB_CODE = "ISSUE_CATEGORY_NOT_FOUND" -ISSUE_NOT_FOUND_MESSAGE = get_message_from_sub_code(ISSUE_NOT_FOUND_SUB_CODE) - - -class TestIssuesRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.test_issue_id = create_canned_mapping_issue() - self.url = f"/api/v2/tasks/issues/categories/{self.test_issue_id}/" - self.non_existent_url = "/api/v2/tasks/issues/categories/99/" - - # get - def test_get_existing_issue_passes(self): - """ - Test that endpoint returns 200 to successfully get an existing issue - """ - response = self.client.get(self.url) - response_json = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_json["name"], TEST_ISSUE_NAME) - - def test_get_non_existent_issue_fails(self): - """ - Test that endpoint returns 404 to get a non existent issue - """ - response = self.client.get(self.non_existent_url) - response_json = response.get_json() - error_details = response_json["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], ISSUE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], ISSUE_NOT_FOUND_SUB_CODE) - - # patch - def test_update_issue_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 to update an issue by an unauthenticated user - """ - response = self.client.patch( - self.url, - json={"description": TEST_ISSUE_DESCRIPTION, "name": TEST_ISSUE_NAME}, - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_json["SubCode"], "InvalidToken") - - def test_update_issue_with_invalid_request_data_fails(self): - """ - Test that endpoint returns 400 to update an issue with an invalid request - """ - response = self.client.patch( - self.url, - headers={"Authorization": self.test_user_token}, - json={"issue_description": TEST_ISSUE_DESCRIPTION, "issue_name": ""}, - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual( - response_json["Error"], "Unable to update mapping issue category" - ) - self.assertEqual(response_json["SubCode"], "InvalidData") - - def test_update_non_existent_issue_fails(self): - """ - Test that endpoint returns 404 to update a non existent issue - """ - response = self.client.patch( - self.non_existent_url, - headers={"Authorization": self.test_user_token}, - json={"description": TEST_ISSUE_DESCRIPTION, "name": TEST_ISSUE_NAME}, - ) - response_json = response.get_json() - error_details = response_json["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], ISSUE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], ISSUE_NOT_FOUND_SUB_CODE) - - def test_update_mapping_issue_passes(self): - """ - Test that endpoint returns 200 to successfully update an issue - """ - response = self.client.patch( - self.url, - headers={"Authorization": self.test_user_token}, - json={ - "name": "New issue name", - "description": TEST_ISSUE_DESCRIPTION, - }, - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertNotEqual(response_json["name"], TEST_ISSUE_NAME) - self.assertEqual(response_json["name"], "New issue name") - self.assertEqual(response_json["description"], TEST_ISSUE_DESCRIPTION) - - # delete - def test_delete_issue_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 to delete an issue by an unauthenticated user - """ - response = self.client.delete( - self.url, - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_json["SubCode"], "InvalidToken") - - def test_delete_non_existent_issue_fails(self): - """ - Test that endpoint returns 404 to delete a non-existent issue - """ - response = self.client.delete( - self.non_existent_url, headers={"Authorization": self.test_user_token} - ) - response_json = response.get_json() - error_details = response_json["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], ISSUE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], ISSUE_NOT_FOUND_SUB_CODE) - - def test_delete_mapping_issue_passes(self): - """ - Test that endpoint returns 200 to successfully delete an issue - """ - response = self.client.delete( - self.url, headers={"Authorization": self.test_user_token} - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_json["Success"], "Mapping-issue category deleted") - - -class TestIssuesAllAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.url = "/api/v2/tasks/issues/categories/" - - # get - def test_get_all_issues_passes(self): - """ - Test that endpoint returns 200 to successfully retrieve all issues - """ - # Act: no issues - response = self.client.get(self.url) - response_json = response.get_json() - # test - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_json["categories"]), 0) - self.assertEqual(response_json["categories"], []) - - # Act: add 1 issue - self.test_issue = create_canned_mapping_issue() - response = self.client.get(self.url) - response_json = response.get_json() - # test - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_json["categories"]), 1) - self.assertEqual(response_json["categories"][0]["name"], TEST_ISSUE_NAME) - - # post - def test_create_issue_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 to create a new issue by an unauthenticated user - """ - response = self.client.post( - self.url, - json={"description": TEST_ISSUE_DESCRIPTION, "name": TEST_ISSUE_NAME}, - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_json["SubCode"], "InvalidToken") - - def test_update_issue_with_invalid_request_data_fails(self): - """ - Test that endpoint returns 400 to create a new issue with an invalid request - """ - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_token}, - json={"issue_description": TEST_ISSUE_DESCRIPTION, "issue_name": ""}, - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual( - response_json["Error"], "Unable to create a new mapping issue category" - ) - self.assertEqual(response_json["SubCode"], "InvalidData") - - def test_create_mapping_issue_passes(self): - """ - Test that endpoint returns 200 to successfully create a new issue - """ - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_token}, - json={ - "name": TEST_ISSUE_NAME, - "description": TEST_ISSUE_DESCRIPTION, - }, - ) - response_json = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_json["categoryId"], 1) diff --git a/tests/backend/integration/api/licenses/__init__.py b/tests/backend/integration/api/licenses/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/licenses/test_actions.py b/tests/backend/integration/api/licenses/test_actions.py deleted file mode 100644 index ce20ef4cb4..0000000000 --- a/tests/backend/integration/api/licenses/test_actions.py +++ /dev/null @@ -1,55 +0,0 @@ -from backend.exceptions import get_message_from_sub_code -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_license, - create_canned_user, - generate_encoded_token, -) - -LICENSE_NOT_FOUND_SUB_CODE = "LICENSE_NOT_FOUND" -LICENSE_NOT_FOUND_MESSAGE = get_message_from_sub_code(LICENSE_NOT_FOUND_SUB_CODE) - - -class TestLicensesActionsAcceptAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.test_license_id = create_canned_license() - self.endpoint_url = ( - f"/api/v2/licenses/{self.test_license_id}/actions/accept-for-me/" - ) - - def test_accept_license_terms_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when an unauthenticated user accepts license terms - """ - response = self.client.post(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_accept_terms_of_non_existent_license_fails(self): - """ - Test that endpoint returns 404 when user accepts terms of a non-existent license - """ - response = self.client.post( - "/api/v2/licenses/99/actions/accept-for-me/", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], LICENSE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], LICENSE_NOT_FOUND_SUB_CODE) - - def test_accept_license_terms_by_authenticated_user_passes(self): - """ - Test that endpoint returns 200 when authenticated user accepts existing license terms - """ - response = self.client.post( - self.endpoint_url, headers={"Authorization": self.test_user_token} - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "Terms Accepted") diff --git a/tests/backend/integration/api/licenses/test_resources.py b/tests/backend/integration/api/licenses/test_resources.py deleted file mode 100644 index c34be1b019..0000000000 --- a/tests/backend/integration/api/licenses/test_resources.py +++ /dev/null @@ -1,240 +0,0 @@ -from backend.exceptions import get_message_from_sub_code -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_license, - create_canned_user, - generate_encoded_token, -) - -TEST_LICENSE_NAME = "test_license" -TEST_LICENSE_DESCRIPTION = "test license" -TEST_LICENSE_PLAINTEXT = "test license" -NEW_LICENSE_DESCRIPTION = "A new test license" -NEW_LICENSE_NAME = "New License" -LICENSE_NOT_FOUND_SUB_CODE = "LICENSE_NOT_FOUND" -LICENSE_NOT_FOUND_MESSAGE = get_message_from_sub_code(LICENSE_NOT_FOUND_SUB_CODE) - - -class TestLicensesRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.test_license_id = create_canned_license() - self.single_licence_url = f"/api/v2/licenses/{self.test_license_id}/" - self.all_licences_url = "/api/v2/licenses/" - self.non_existent_url = "/api/v2/licenses/99/" - - # post - def test_create_new_license_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when unauthenticated user creates a new license - """ - response = self.client.post( - self.all_licences_url, - json={ - "description": NEW_LICENSE_DESCRIPTION, - "name": NEW_LICENSE_NAME, - "plainText": "", - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_create_new_license_with_invalid_request_fails(self): - """ - Test that endpoint returns 400 when creating a new license with invalid data - """ - response = self.client.post( - self.all_licences_url, - headers={"Authorization": self.test_user_token}, - json={ - "license_description": [NEW_LICENSE_DESCRIPTION], - "license_name": NEW_LICENSE_NAME, - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual(response_body["Error"], "Unable to create new mapping license") - self.assertEqual(response_body["SubCode"], "InvalidData") - - def test_create_new_license_by_authenticated_user_passes(self): - """ - Test that endoint returns 201 when authenticated user creates new license - """ - response = self.client.post( - self.all_licences_url, - headers={"Authorization": self.test_user_token}, - json={ - "description": NEW_LICENSE_DESCRIPTION, - "name": NEW_LICENSE_NAME, - "plainText": "", - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 201) - self.assertEqual(response_body, {"licenseId": 2}) - - # get - def test_get_non_existent_license_fails(self): - """ - Test that endpoint returns 404 when retrieving a non existent license - """ - response = self.client.get(self.non_existent_url) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], LICENSE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], LICENSE_NOT_FOUND_SUB_CODE) - - def test_get_license_passes(self): - """ - Test that endpoint returns 200 when retrieving an existing license - """ - response = self.client.get(self.single_licence_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["name"], TEST_LICENSE_NAME) - self.assertEqual(response_body["description"], TEST_LICENSE_DESCRIPTION) - self.assertEqual(response_body["plainText"], TEST_LICENSE_PLAINTEXT) - - # patch - def test_update_license_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when unauthenticated user updates a license - """ - response = self.client.patch( - self.single_licence_url, - json={ - "description": NEW_LICENSE_DESCRIPTION, - "name": NEW_LICENSE_NAME, - "plainText": "", - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_update_license_with_invalid_request_fails(self): - """ - Test that endpoint returns 400 when user updates a license with invalid request data - """ - response = self.client.patch( - self.single_licence_url, - headers={"Authorization": self.test_user_token}, - json={ - "license_description": [NEW_LICENSE_DESCRIPTION], - "license_name": NEW_LICENSE_NAME, - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual(response_body["SubCode"], "InvalidData") - - def test_update_non_existent_license_by_authenticated_user_fails(self): - """ - Test that endoint returns 404 when authenticated user updates non-existent license - """ - response = self.client.patch( - self.non_existent_url, - headers={"Authorization": self.test_user_token}, - json={ - "description": NEW_LICENSE_DESCRIPTION, - "name": NEW_LICENSE_NAME, - "plainText": "", - }, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], LICENSE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], LICENSE_NOT_FOUND_SUB_CODE) - - def test_update_license_by_authenticated_user_passes(self): - """ - Test that endoint returns 200 when authenticated user updates existing license - """ - response = self.client.patch( - self.single_licence_url, - headers={"Authorization": self.test_user_token}, - json={ - "description": NEW_LICENSE_DESCRIPTION, - "name": NEW_LICENSE_NAME, - "plainText": "", - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertNotEqual(response_body["name"], TEST_LICENSE_NAME) - self.assertNotEqual(response_body["description"], TEST_LICENSE_DESCRIPTION) - self.assertNotEqual(response_body["plainText"], TEST_LICENSE_PLAINTEXT) - # updated info - self.assertEqual(response_body["name"], NEW_LICENSE_NAME) - self.assertEqual(response_body["description"], NEW_LICENSE_DESCRIPTION) - self.assertEqual(response_body["plainText"], "") - - # delete - def test_delete_license_by_unauthenticated_user_fails(self): - """ - Test that endpoint returns 401 when unauthenticated user deletes a license - """ - response = self.client.delete(self.single_licence_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_delete_non_existent_license_by_authenticated_user_fails(self): - """ - Test that endoint returns 404 when authenticated user deletes non-existent license - """ - response = self.client.delete( - self.non_existent_url, - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], LICENSE_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], LICENSE_NOT_FOUND_SUB_CODE) - - def test_delete_license_by_authenticated_user_passes(self): - """ - Test that endoint returns 200 when authenticated user deletes existing license - """ - response = self.client.delete( - self.single_licence_url, - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "License deleted") - - -class TestLicensesAllAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.endpoint_url = "/api/v2/licenses/" - - def test_get_all_licenses_(self): - """ - Test that endoint returns 200 when retrieving existing licenses - """ - response = self.client.get(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["licenses"]), 0) - self.assertEqual(response_body["licenses"], []) - # setup: add license - self.test_license_id = create_canned_license() - response = self.client.get(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["licenses"]), 1) - licenses = response_body["licenses"][0] - self.assertEqual(licenses["licenseId"], 1) - self.assertEqual(licenses["name"], TEST_LICENSE_NAME) - self.assertEqual(licenses["description"], TEST_LICENSE_DESCRIPTION) - self.assertEqual(licenses["plainText"], TEST_LICENSE_PLAINTEXT) diff --git a/tests/backend/integration/api/notifications/__init__.py b/tests/backend/integration/api/notifications/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/notifications/test_actions.py b/tests/backend/integration/api/notifications/test_actions.py deleted file mode 100644 index f71839a4c5..0000000000 --- a/tests/backend/integration/api/notifications/test_actions.py +++ /dev/null @@ -1,52 +0,0 @@ -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_message, - create_canned_user, - generate_encoded_token, -) - -TEST_SUBJECT = "Test subject" -TEST_MESSAGE = "This is a test message" - - -class TestNotificationsActionsDeleteMultipleAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_message_one = create_canned_message( - subject=TEST_SUBJECT, message=TEST_MESSAGE - ) - self.test_message_two = create_canned_message( - subject=TEST_SUBJECT, message=TEST_MESSAGE - ) - self.test_message_one.from_user_id = self.test_user.id - self.test_message_two.from_user_id = self.test_user.id - self.test_user_token = generate_encoded_token(self.test_user.id) - self.url = "/api/v2/notifications/delete-multiple/" - - # delete - def test_delete_multiple_messages_returns_401(self): - """ - Test that endpoint returns 401 for unauthenticated user deleting multiple messages - """ - response = self.client.delete( - self.url, - json={"messageIds": [self.test_message_one.id, self.test_message_two.id]}, - ) - response_body = response.get_json() - - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_delete_multiple_messages_returns_200(self): - """ - Test that endpoint returns 200 for authenticated user deleting multiple messages - """ - response = self.client.delete( - self.url, - headers={"Authorization": self.test_user_token}, - json={"messageIds": [self.test_message_one.id, self.test_message_two.id]}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "Messages deleted") diff --git a/tests/backend/integration/api/notifications/test_resources.py b/tests/backend/integration/api/notifications/test_resources.py deleted file mode 100644 index 794d2b0348..0000000000 --- a/tests/backend/integration/api/notifications/test_resources.py +++ /dev/null @@ -1,477 +0,0 @@ -from datetime import datetime, timedelta - -from backend.exceptions import get_message_from_sub_code -from backend.models.postgis.message import MessageType -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_message, - create_canned_notification, - create_canned_project, - create_canned_user, - generate_encoded_token, - return_canned_user, -) - -TEST_SUBJECT = "Test subject" -TEST_MESSAGE = "This is a test message" -NOT_FOUND_SUB_CODE = "MESSAGE_NOT_FOUND" -NOT_FOUND_MESSAGE = get_message_from_sub_code(NOT_FOUND_SUB_CODE) -OLDER_TEST_SUBJECT = "Older Test Subject" -OLDER_TEST_MESSAGE = "This is an older test message" - - -class TestNotificationsRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_message = create_canned_message( - subject=TEST_SUBJECT, message=TEST_MESSAGE - ) - self.test_sender = create_canned_user() - self.test_receiver = return_canned_user("Test user", 11111) - self.test_receiver.create() - self.test_message.from_user_id = self.test_sender.id - self.test_message.to_user_id = self.test_receiver.id - - self.test_sender_token = generate_encoded_token(self.test_sender.id) - self.test_receiver_token = generate_encoded_token(self.test_receiver.id) - self.url = f"/api/v2/notifications/{self.test_message.id}/" - self.non_existent_url = "/api/v2/notifications/9999999/" - - def test_get_message_returns_401(self): - """ - Test that endpoint returns 401 when an unauthenticated user accesses a particular message - """ - response = self.client.get(self.url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_get_message_returns_403(self): - """ - Test that endpoint returns 403 when one user accesses another user's messages - """ - response = self.client.get( - self.url, - headers={"Authorization": self.test_sender_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual(response_body["SubCode"], "AccessOtherUserMessage") - - def test_get_message_returns_404(self): - """ - Test that endpoint returns 404 when a user accesses a non-existent message - """ - response = self.client.get( - self.non_existent_url, - headers={"Authorization": self.test_sender_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], NOT_FOUND_SUB_CODE) - - def test_get_message_returns_200(self): - """ - Test that endpoint returns 200 when a user successfully accesses their existent message - """ - response = self.client.get( - self.url, - headers={"Authorization": self.test_receiver_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["subject"], TEST_SUBJECT) - self.assertEqual(response_body["message"], TEST_MESSAGE) - self.assertEqual(response_body["fromUsername"], self.test_sender.username) - - def test_delete_message_returns_401(self): - """ - Test that endpoint returns 401 when an unauthenticated user deletes a message - """ - response = self.client.delete(self.url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_delete_message_returns_403(self): - """ - Test that endpoint returns 403 when a user deletes another user's message - """ - response = self.client.delete( - self.url, - headers={"Authorization": self.test_sender_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual(response_body["SubCode"], "AccessOtherUserMessage") - - def test_delete_message_returns_404(self): - """ - Test that endpoint returns 404 when a user deletes a non-existent message - """ - response = self.client.delete( - self.non_existent_url, - headers={"Authorization": self.test_sender_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], NOT_FOUND_SUB_CODE) - - def test_delete_message_returns_200(self): - """ - Test that endpoint returns 200 when a user successfully deletes their existent message - """ - response = self.client.delete( - self.url, - headers={"Authorization": self.test_receiver_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "Message deleted") - - -class TestNotificationsAllAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.url = "/api/v2/notifications/" - - def test_get_message_notifications_returns_401(self): - """ - Test that endpoint returns 401 when an unauthenticated user accesses messsage notifications - """ - response = self.client.get(self.url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_get_messages_no_query_params_returns_200(self): - """ - Test that endpoint returns 200 when authenticated user accesses their messsage notifications - """ - response = self.client.get( - self.url, - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 0) - self.assertEqual(response_body["userMessages"], []) - - # setup - add a broadcast message - self.test_message = create_canned_message( - subject=TEST_SUBJECT, - message=TEST_MESSAGE, - message_type=MessageType.BROADCAST.value, - ) - self.test_message.to_user_id = self.test_user.id - response = self.client.get( - self.url, - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["pagination"]["page"], 1) - self.assertEqual(response_body["pagination"]["pages"], 1) - self.assertEqual(response_body["pagination"]["perPage"], 10) - self.assertEqual(len(response_body["userMessages"]), 1) - user_messages = response_body["userMessages"][0] - self.assertEqual(user_messages["subject"], TEST_SUBJECT) - self.assertEqual(user_messages["message"], TEST_MESSAGE) - self.assertEqual(user_messages["messageType"], MessageType.BROADCAST.name) - - def test_get_messages_with_query_params_returns_200(self): - """ - Test that endpoint returns 200 when authenticated user accesses their messsage notifications - depending on the query parameter filters - """ - # SETUP:- add a broadcast message - self.test_message = create_canned_message( - subject=TEST_SUBJECT, - message=TEST_MESSAGE, - message_type=MessageType.BROADCAST.value, - ) - self.test_message.to_user_id = self.test_user.id - self.test_message.date = datetime.utcnow() - - # ?from= - # no messages expected since user is not the sender - # ACT - response = self.client.get( - f"{self.url}?from={self.test_user.username}", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 0) - # SETUP: set user as sender of the message - self.test_message.from_user_id = self.test_user.id - # ACT - response = self.client.get( - f"{self.url}?from={self.test_user.username}", - headers={"Authorization": self.test_user_token}, - ) - # 1 message expected since user is the sender - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 1) - - # ?project= - # setup: project - self.test_project, _ = create_canned_project() - # no messages expected since message is not affiliated to any project - # ACT - response = self.client.get( - f"{self.url}?project={self.test_project.id}", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 0) - # SETUP: project affiliation - self.test_message.project_id = self.test_project.id - # 1 message expected since message is affiliated to a project - # ACT - response = self.client.get( - f"{self.url}?project={self.test_project.id}", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 1) - - # ?taskId= - # no messages expected since message is not affiliated to any task - # ACT - response = self.client.get( - f"{self.url}?taskId=1", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 0) - # SETUP: task affiliation - self.test_message.task_id = 1 - # 1 message expected since message is affiliated to a project - # ACT - response = self.client.get( - f"{self.url}?taskId=1", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 1) - - # ?project=&taskId= - # no messages expected since message is not affiliated to unknown task in the project - # ACT - response = self.client.get( - f"{self.url}?project={self.test_project.id}&taskId=1111", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 0) - # 1 message expected since message is affiliated to task 1 in the project - # ACT - response = self.client.get( - f"{self.url}?project={self.test_project.id}&taskId=1", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 1) - - # ?messageType= - # ?messageType=1 - no message expected - # ACT - response = self.client.get( - f"{self.url}?messageType=1", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 0) - # ?messageType=2 - 1 message expected - # ACT - response = self.client.get( - f"{self.url}?messageType=2", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 1) - # ?messageType=1,2,3,4,5 - 1 message expected - # ACT - response = self.client.get( - f"{self.url}?messageType=1,2,3,4,5", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body["userMessages"]), 1) - - # ?status - self.test_message.read = False # SETUP: unread message - # ?status=unread - # ACT - response = self.client.get( - f"{self.url}?status=unread", - headers={"Authorization": self.test_user_token}, - ) - unread_response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(unread_response_body["userMessages"]), 1) - # ?status=read - # ACT - response = self.client.get( - f"{self.url}?status=read", - headers={"Authorization": self.test_user_token}, - ) - read_response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(read_response_body["userMessages"]), 0) - - # SETUP: add older message - self.test_older_message = create_canned_message( - subject=OLDER_TEST_SUBJECT, - message=OLDER_TEST_MESSAGE, - message_type=MessageType.MENTION_NOTIFICATION.value, - ) - self.test_older_message.date = datetime.utcnow() - timedelta(days=6) - self.test_older_message.to_user_id = self.test_user.id - - # ?sortBy=date - # ACT - response = self.client.get( - f"{self.url}?sortBy=date", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - user_messages = response_body["userMessages"] - self.assertEqual(len(user_messages), 2) - # 1st message - self.assertEqual(user_messages[0]["subject"], TEST_SUBJECT) - self.assertEqual(user_messages[0]["message"], TEST_MESSAGE) - self.assertEqual(user_messages[0]["messageType"], MessageType.BROADCAST.name) - # 2nd message - self.assertEqual(user_messages[1]["subject"], OLDER_TEST_SUBJECT) - self.assertEqual(user_messages[1]["message"], OLDER_TEST_MESSAGE) - self.assertEqual( - user_messages[1]["messageType"], MessageType.MENTION_NOTIFICATION.name - ) - - # ?sortDirection - # ?sortDirection=desc - Descending order - # ACT - response = self.client.get( - f"{self.url}?sortDirection=desc", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - user_messages = response_body["userMessages"] - self.assertEqual(len(user_messages), 2) - self.assertGreater(user_messages[0]["sentDate"], user_messages[1]["sentDate"]) - # 1st message - self.assertEqual(user_messages[0]["subject"], TEST_SUBJECT) - self.assertEqual(user_messages[0]["message"], TEST_MESSAGE) - self.assertEqual(user_messages[0]["messageType"], MessageType.BROADCAST.name) - # 2nd message - self.assertEqual(user_messages[1]["subject"], OLDER_TEST_SUBJECT) - self.assertEqual(user_messages[1]["message"], OLDER_TEST_MESSAGE) - self.assertEqual( - user_messages[1]["messageType"], MessageType.MENTION_NOTIFICATION.name - ) - - # ?sortDirection=asc - Ascending order - # ACT - response = self.client.get( - f"{self.url}?sortDirection=asc", - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - user_messages = response_body["userMessages"] - self.assertEqual(len(user_messages), 2) - self.assertLess(user_messages[0]["sentDate"], user_messages[1]["sentDate"]) - # 1st message - self.assertEqual(user_messages[0]["subject"], OLDER_TEST_SUBJECT) - self.assertEqual(user_messages[0]["message"], OLDER_TEST_MESSAGE) - self.assertEqual( - user_messages[0]["messageType"], MessageType.MENTION_NOTIFICATION.name - ) - # 2nd message - self.assertEqual(user_messages[1]["subject"], TEST_SUBJECT) - self.assertEqual(user_messages[1]["message"], TEST_MESSAGE) - self.assertEqual(user_messages[1]["messageType"], MessageType.BROADCAST.name) - - -class TestNotificationsQueriesCountUnreadAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.url = "/api/v2/notifications/queries/own/count-unread/" - self.test_message = create_canned_message( - subject=TEST_SUBJECT, message=TEST_MESSAGE - ) - self.test_message.to_user_id = self.test_user.id - - def test_get_unread_count_returns_401(self): - """ - Test that endpoint returns 401 when an unauthenticated user wants to get the unread count - """ - response = self.client.get(self.url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_get_unread_count_returns_200(self): - """ - Test that endpoint returns 200 when an authenticated user successfully gets their unread count - """ - response = self.client.get( - self.url, - headers={"Authorization": self.test_user_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body, {"newMessages": True, "unread": 1}) - - -class TestNotificationsQueriesPostUnreadAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_user_token = generate_encoded_token(self.test_user.id) - self.test_notification = create_canned_notification( - user_id=self.test_user.id, unread_count=1, date=datetime.today() - ) - self.url = "/api/v2/notifications/queries/own/post-unread/" - - def test_post_unread_count_returns_401(self): - """ - Test that endpoint returns 401 when there is no user whose unread count should be updated - """ - response = self.client.post(self.url) - response_body = response.get_json() - self.assertEqual(response.status_code, 401) - self.assertEqual(response_body["SubCode"], "InvalidToken") - - def test_post_unread_count_returns_200(self): - """ - Test that endpoint returns 200 after updating an authenticated user's unread count - """ - response = self.client.post( - self.url, headers={"Authorization": self.test_user_token} - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body, 1) diff --git a/tests/backend/integration/api/organisations/__init__.py b/tests/backend/integration/api/organisations/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/organisations/test_campaigns.py b/tests/backend/integration/api/organisations/test_campaigns.py deleted file mode 100644 index 883baac9f2..0000000000 --- a/tests/backend/integration/api/organisations/test_campaigns.py +++ /dev/null @@ -1,162 +0,0 @@ -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_organisation, - create_canned_project, - generate_encoded_token, - return_canned_campaign, - return_canned_user, -) -from tests.backend.integration.api.campaigns.test_resources import ( - CAMPAIGN_NOT_FOUND_MESSAGE, - CAMPAIGN_NOT_FOUND_SUB_CODE, -) - -CAMPAIGN_NAME = "New Campaign" -CAMPAIGN_ID = 2 - - -class TestOrganisationsCampaignsAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_org = create_canned_organisation() - self.endpoint_url = f"/api/v2/organisations/{self.test_org.id}/campaigns/" - self.test_campaign = return_canned_campaign() - self.test_campaign.create() - self.test_project, self.test_author = create_canned_project() - self.test_user = return_canned_user("test_user", 11111111) - self.test_user.create() - self.test_org.managers = [self.test_author] - self.test_org.campaign = [self.test_campaign] - self.test_org.save() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.test_user_session_token = generate_encoded_token(self.test_user.id) - - # post - def test_add_already_assigned_campaign_to_same_org_fails(self): - """ - Test that the endpoint returns 400 if the campaign had already been assigned to the organisation - """ - response = self.client.post( - f"/api/v2/organisations/{self.test_org.id}/campaigns/{self.test_campaign.id}/", - json={ - "logo": None, - "name": "Test Campaign", - "organisations": [self.test_org.id], - "url": None, - }, - headers={"Authorization": self.test_author_session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 400) - self.assertEqual( - response_body["Error"], "Campaign 1 is already assigned to organisation 23." - ) - self.assertEqual(response_body["SubCode"], "CampaignAlreadyAssigned") - - def test_assign_org_new_campaign_passes(self): - """ - Test that the endpoint returns 200 when a new campaign is assigned to the organisation - """ - new_campaign = return_canned_campaign( - id=2, name=CAMPAIGN_NAME, description=None, logo=None - ) - new_campaign.create() - response = self.client.post( - f"/api/v2/organisations/{self.test_org.id}/campaigns/{new_campaign.id}/", - json={ - "logo": None, - "name": CAMPAIGN_NAME, - "organisations": [self.test_org.id], - "url": None, - }, - headers={"Authorization": self.test_author_session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual( - response_body["Success"], - "campaign with id 2 assigned for organisation with id 23", - ) - - def test_non_org_admin_assigns_new_campaign_to_org_fails(self): - """ - Test that the endpoint returns 403 when a non admin tries to add a new campaign to an organisation - """ - new_campaign = return_canned_campaign( - id=2, name=CAMPAIGN_NAME, description=None, logo=None - ) - new_campaign.create() - response = self.client.post( - f"/api/v2/organisations/{self.test_org.id}/campaigns/{new_campaign.id}/", - json={ - "logo": None, - "name": CAMPAIGN_NAME, - "organisations": [self.test_org.id], - "url": None, - }, - headers={"Authorization": self.test_user_session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual( - response_body["Error"], "User is not a manager of the organisation" - ) - self.assertEqual(response_body["SubCode"], "UserNotPermitted") - - # get - def test_get_organisation_campaigns_passes(self): - """ - Test that the endpoint returns 200 when retrieving organisation campaigns - """ - response = self.client.get(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual( - response_body, {"campaigns": [{"id": 1, "name": "Test Campaign"}]} - ) - - # def test_get_non_existent_organisation_campaigns_fails(self): - # """ - # Test that the endpoint returns 404 when retrieving campaigns for non existent organisation - # """ - # response = self.client.get(f"/api/v2/organisations/111111/campaigns/") - # self.assertEqual(response.status_code, 404) - - # delete - def test_delete_organisation_campaign_by_admin_passes(self): - """Test that the endpoint returns 200 and unassigns a campaign from an organisation""" - response = self.client.delete( - f"/api/v2/organisations/{self.test_org.id}/campaigns/{self.test_campaign.id}/", - headers={"Authorization": self.test_author_session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual( - response_body, - {"Success": "Organisation and campaign unassociated successfully"}, - ) - - def test_delete_organisation_campaign_non_admin_fails(self): - """Test that the endpoint returns 403 when a non admin attempts to delete an organisation campaign""" - response = self.client.delete( - f"/api/v2/organisations/{self.test_org.id}/campaigns/{self.test_campaign.id}/", - headers={"Authorization": self.test_user_session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual( - response_body["Error"], "User is not a manager of the organisation" - ) - self.assertEqual(response_body["SubCode"], "UserNotPermitted") - - def test_delete_non_existent_organisation_campaign_fails(self): - """Tests that the endpoint returns 404 when the org admin deletes a non existent campaign""" - response = self.client.delete( - f"/api/v2/organisations/{self.test_org.id}/campaigns/5/", - headers={"Authorization": self.test_author_session_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], CAMPAIGN_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], CAMPAIGN_NOT_FOUND_SUB_CODE) diff --git a/tests/backend/integration/api/organisations/test_resources.py b/tests/backend/integration/api/organisations/test_resources.py deleted file mode 100644 index 2fba3124e8..0000000000 --- a/tests/backend/integration/api/organisations/test_resources.py +++ /dev/null @@ -1,392 +0,0 @@ -import base64 - -from backend.exceptions import get_message_from_sub_code -from backend.services.users.authentication_service import AuthenticationService -from tests.backend.base import BaseTestCase, db -from tests.backend.helpers.test_helpers import ( - add_manager_to_organisation, - create_canned_organisation, - create_canned_project, - create_canned_user, - generate_encoded_token, - return_canned_user, -) - -TEST_USER_ID = 777777 -TEST_USERNAME = "Thinkwhere Test" -ORG_NOT_FOUND_SUB_CODE = "ORGANISATION_NOT_FOUND" -ORG_NOT_FOUND_MESSAGE = get_message_from_sub_code(ORG_NOT_FOUND_SUB_CODE) - - -class TestOrganisationAllAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.endpoint_url = "/api/v2/organisations/" - self.test_project, self.test_author = create_canned_project() - self.test_org = create_canned_organisation() - add_manager_to_organisation(self.test_org, self.test_author) - self.test_project.organisation = self.test_org - db.session.commit() - - def test_get_all_organisations_returns_required_fields(self): - """Test endpoint returns all required fields""" - - response = self.client.get(self.endpoint_url) - response_body = response.json["organisations"] - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body), 1) - self.assertEqual(response_body[0]["organisationId"], self.test_org.id) - # omitManager is enabled by default but user must be authenticated to get org managers in response - with self.assertRaises(KeyError): - response_body[0]["managers"] - self.assertEqual(response_body[0]["name"], self.test_org.name) - self.assertEqual(response_body[0]["campaigns"], None) - # As omitOrgStats is set to true by default, stats field should not be included in response - with self.assertRaises(KeyError): - response_body[0]["stats"] - - def test_get_all_organisations_doesnt_returns_manager_if_omit_manager_set_true( - self, - ): - """Test managers are not returned is omitManagers is set to True""" - - response = self.client.get(f"{self.endpoint_url}?omitManagers=True") - response_body = response.json["organisations"] - with self.assertRaises(KeyError): - response_body[0]["managers"] - - def test_get_all_org_includes_managers_if_user_is_authenticated(self): - """Test managers are included if user is authenticated""" - - session_token = AuthenticationService.generate_session_token_for_user( - self.test_author.id - ) - session_token = base64.b64encode(session_token.encode("utf-8")) - session_token = "Token " + session_token.decode("utf-8") - response = self.client.get( - self.endpoint_url, headers={"Authorization": session_token} - ) - - response_body = response.json["organisations"] - self.assertEqual( - response_body[0]["managers"][0]["username"], self.test_author.username - ) - - def test_get_all_org_raises_error_if_filter_by_manager_id__on_unauthenticated_request( - self, - ): - "Test 403 is returned if filter by manager id on unauthenticated request" - - response = self.client.get(f"{self.endpoint_url}?manager_user_id=2") - self.assertEqual(response.status_code, 403) - - def test_get_all_org_includes_stats_if_omit_stats_set_false(self): - """Test stats are not returned is omitOrgStats is set to False""" - - response = self.client.get( - f"{self.endpoint_url}?omitOrgStats=False", - ) - response_body = response.json["organisations"] - - self.assertEqual(response_body[0]["stats"]["projects"]["draft"], 1) - - -class TestOrganisationsBySlugRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = create_canned_user() - self.test_org = create_canned_organisation() - self.session_token = generate_encoded_token(self.test_user.id) - self.endpoint_url = f"/api/v2/organisations/{self.test_org.slug}/" - - def test_get_org_by_slug_by_without_token_passes(self): - """ - Test that endpoint returns 200 and and organisation details - """ - response = self.client.get(self.endpoint_url) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body), 12) - self.assertEqual(response_body["organisationId"], self.test_org.id) - self.assertEqual(response_body["name"], self.test_org.name) - self.assertEqual(response_body["slug"], self.test_org.slug) - self.assertEqual(response_body["name"], self.test_org.name) - self.assertEqual(response_body["logo"], None) - self.assertEqual(response_body["description"], None) - self.assertEqual(response_body["url"], None) - self.assertEqual(response_body["teams"], []) - self.assertEqual(response_body["campaigns"], None) - self.assertEqual(response_body["type"], "FREE") - self.assertEqual(response_body["subscriptionTier"], None) - - def test_get_org_by_slug_by_authorised_user_and_omitManagerList_is_false_passes( - self, - ): - """ - Test that endpoint returns 200 and organisation details including manager details - """ - add_manager_to_organisation(self.test_org, self.test_user) - response = self.client.get( - self.endpoint_url, headers={"Authorization": self.session_token} - ) # by default, omitManagerList=False" - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body), 12) - self.assertEqual(response_body["organisationId"], self.test_org.id) - # Manager list included - self.assertEqual(len(response_body["managers"]), 1) - self.assertEqual( - response_body["managers"], - [{"username": TEST_USERNAME, "pictureUrl": None}], - ) - - def test_get_org_by_slug_by_authorised_user_and_omitManagerList_is_true_passes( - self, - ): - """ - Test that endpoint returns 200 and organisation details excluding manager details - """ - add_manager_to_organisation(self.test_org, self.test_user) - response = self.client.get( - f"{self.endpoint_url}?omitManagerList=True", - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response_body), 12) - self.assertEqual(response_body["organisationId"], self.test_org.id) - # Manager list omitted - self.assertEqual(len(response_body["managers"]), 0) - self.assertEqual(response_body["managers"], []) - - def test_get_non_existent_org_by_slug_fails(self): - """ - Test that endpoint returns 404 when queried for non existent organisation - """ - response = self.client.get("/api/v2/organisations/random-organisation/") - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], ORG_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], ORG_NOT_FOUND_SUB_CODE) - - -class TestOrganisationsRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_org = create_canned_organisation() - self.test_org.managers = [self.test_author] - self.test_org.save() - self.endpoint_url = "/api/v2/organisations/" - self.session_token = generate_encoded_token(self.test_author.id) - - # post method tests - def test_create_org_by_unauthenticated_user_fails(self): - """ - Tests that endpoint returns 401 when unauthenticated user tries to create a new org - """ - response = self.client.post( - self.endpoint_url, - json={"name": "New Org", "slug": "new-org", "managers": ["Test User"]}, - ) - self.assertEqual(response.status_code, 401) - - def test_create_org_with_non_admin_fails(self): - """ - Tests that endpoint returns 403 when non admin tries to create a new org - """ - response = self.client.post( - self.endpoint_url, - headers={"Authorization": self.session_token}, - json={ - "name": "New Org", - "slug": "new-org", - "logo": None, - "managers": [TEST_USERNAME], - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual( - response_body["Error"], "Only admin users can create organisations." - ) - self.assertEqual(response_body["SubCode"], "OnlyAdminAccess") - - # get organisation - def test_get_org_when_omitManagerList_is_false_passes(self): - """ - Test that endpoint returns 200 while retrieving an organisation by id when omitManagersList is false - """ - response = self.client.get( - f"{self.endpoint_url}{self.test_org.id}/", - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["organisationId"], 23) - self.assertEqual(len(response_body["managers"]), 1) - self.assertEqual( - response_body["managers"], - [{"username": TEST_USERNAME, "pictureUrl": None}], - ) - - def test_get_non_existent_org_fails(self): - """ - Test that endpoint returns 404 when queried for non-existent org by id - """ - response = self.client.get( - f"{self.endpoint_url}99/", - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], ORG_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], ORG_NOT_FOUND_SUB_CODE) - - # delete method tests - def test_delete_org_by_admin_user_passes(self): - """ - Test that endpoint returns 200 after deleting existing organisation by org admin - """ - response = self.client.delete( - f"{self.endpoint_url}{self.test_org.id}/", - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body["Success"], "Organisation deleted") - - def test_delete_item_by_non_admin_user_fails(self): - """ - Test that endpoint returns 403 when deleting existing organisation by non org admin - """ - non_admin = return_canned_user(username="Random User", id=2222) - non_admin.create() - non_admin_token = generate_encoded_token(non_admin.id) - response = self.client.delete( - f"/api/v2/organisations/{self.test_org.id}/", - headers={"Authorization": non_admin_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual(response_body["Error"], "User is not an admin for the org") - self.assertEqual(response_body["SubCode"], "UserNotOrgAdmin") - - def test_delete_org_with_projects_fails(self): - """ - Test that endpoint returns 403 when trying to delete organisation with projects - """ - self.test_project.organisation = self.test_org - self.test_project.save() - response = self.client.delete( - f"{self.endpoint_url}{self.test_org.id}/", - headers={"Authorization": self.session_token}, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual(response_body["Error"], "Organisation has some projects") - self.assertEqual(response_body["SubCode"], "OrgHasProjects") - - # patch - def test_update_org_details_by_admin_passes(self): - """ - Tests that endpoint returns 200 when admin successfully updates an organisation's details - """ - response = self.client.patch( - f"{self.endpoint_url}{self.test_org.id}/", - headers={"Authorization": self.session_token}, - json={ - "name": "HOT", - "slug": "hot", - "logo": None, - "managers": [TEST_USERNAME], - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 200) - self.assertEqual(response_body, {"Status": "Updated"}) - - def test_update_org_details_by_non_admin_fails(self): - """ - Tests that endpoint returns 403 when non admin tries to update an organisation's details - """ - non_admin = return_canned_user(username="New User", id=444) - non_admin.create() - non_admin_token = generate_encoded_token(non_admin.id) - response = self.client.patch( - f"{self.endpoint_url}{self.test_org.id}/", - headers={"Authorization": non_admin_token}, - json={ - "name": "HOT", - "slug": "hot", - "logo": None, - "managers": [TEST_USERNAME], - }, - ) - response_body = response.get_json() - self.assertEqual(response.status_code, 403) - self.assertEqual(response_body["Error"], "User is not an admin for the org") - self.assertEqual(response_body["SubCode"], "UserNotOrgAdmin") - - def test_update_org_details_with_invalid_data_fails(self): - """ - Tests that endpoint returns 400 when admin tries to update an organisation's details using invalid keys - """ - response = self.client.patch( - f"{self.endpoint_url}{self.test_org.id}/", - headers={"Authorization": self.session_token}, - json={ - "org_name": "HOT", - "org_slug": "hot", - "org_logo": None, - }, - ) - self.assertEqual(response.status_code, 400) - - -class TestOrganisationsStatsAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_org = create_canned_organisation() - self.test_project, self.test_author = create_canned_project() - self.test_org.save() - self.test_project.organisation = self.test_org - self.test_project.save() - self.endpoint_url = f"/api/v2/organisations/{self.test_org.id}/statistics/" - - def test_get_org_statistics_passes(self): - """ - Tests that endpoint returns 200 when retrieving an organisation's statistics - """ - response = self.client.get(self.endpoint_url) - self.assertEqual(response.status_code, 200) - response_body = response.get_json() - self.assertEqual( - response_body["projects"], - {"draft": 1, "published": 0, "archived": 0, "recent": 0, "stale": 0}, - ) - self.assertEqual( - response_body["activeTasks"], - { - "badImagery": 0, - "invalidated": 0, - "lockedForMapping": 0, - "lockedForValidation": 0, - "mapped": 0, - "ready": 0, - "validated": 0, - }, - ) - - def test_get_non_existent_org_statistics_fails(self): - """ - Tests that endpoint returns 404 when retrieving a non existent organisation's statistics - """ - response = self.client.get("/api/v2/organisations/99/statistics/") - response_body = response.get_json() - error_details = response_body["error"] - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["message"], ORG_NOT_FOUND_MESSAGE) - self.assertEqual(error_details["sub_code"], ORG_NOT_FOUND_SUB_CODE) diff --git a/tests/backend/integration/api/projects/__init__.py b/tests/backend/integration/api/projects/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/projects/test_actions.py b/tests/backend/integration/api/projects/test_actions.py deleted file mode 100644 index 973c2d6b49..0000000000 --- a/tests/backend/integration/api/projects/test_actions.py +++ /dev/null @@ -1,435 +0,0 @@ -import json -from unittest.mock import patch - -import geojson - -from backend.models.postgis.statuses import ( - TaskStatus, - TeamMemberFunctions, - TeamRoles, - UserRole, -) -from backend.models.postgis.task import Task -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - add_manager_to_organisation, - add_user_to_team, - assign_team_to_project, - create_canned_organisation, - create_canned_project, - create_canned_team, - create_canned_user, - generate_encoded_token, - get_canned_json, - return_canned_user, -) - - -class TestProjectActionsIntersectingTilesAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.url = "/api/v2/projects/actions/intersecting-tiles/" - self.test_user = create_canned_user() - self.test_user_access_token = generate_encoded_token(self.test_user.id) - - def test_returns_401_if_not_authenticated(self): - """Test that the endpoint returns 401 if the user is not authenticated""" - # Act - response = self.client.post(self.url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_returns_400_if_invalid_data(self): - """Test that the endpoint returns 400 if the data is invalid""" - # Act - response = self.client.post( - self.url, - json={"grid": "invalid"}, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 400) - - def test_returns_clipped_grid_if_clip_to_aoi_set_true(self): - """Test that the endpoint returns a clipped grid if clipToAoi is set to true""" - # Arrange - payload = get_canned_json("test_grid.json") - payload["clipToAoi"] = True - expected_response = geojson.loads( - json.dumps(get_canned_json("clipped_feature_collection.json")) - ) - # Act - response = self.client.post( - self.url, - json=payload, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertDeepAlmostEqual(expected_response, geojson.loads(response.text)) - - def test_returns_not_clipped_grid_if_clip_to_aoi_set_false(self): - """Test that the endpoint returns a not clipped grid if clipToAoi is set to false""" - # Arrange - payload = get_canned_json("test_grid.json") - payload["clipToAoi"] = False - expected_response = geojson.loads( - json.dumps(get_canned_json("feature_collection.json")) - ) - # Act - response = self.client.post( - self.url, - json=payload, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertDeepAlmostEqual(expected_response, geojson.loads(response.text)) - - def test_raises_invalid_geojson_exception_if_invalid_aoi(self): - """Test that the endpoint raises an InvalidGeoJson exception if the grid is invalid""" - # Arrange - payload = get_canned_json("test_grid.json") - payload["areaOfInterest"]["features"] = [] - # Act - response = self.client.post( - self.url, - json=payload, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "MustHaveFeatures") - - def test_raises_invalid_geojson_exception_if_self_intersecting_aoi(self): - """Test that the endpoint raises an InvalidGeoJson exception if the aoi is self intersecting""" - # Arrange - payload = get_canned_json("self_intersecting_aoi.json") - # Act - response = self.client.post( - self.url, - json=payload, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "SelfIntersectingAOI") - - -class TestProjectsActionsMessageContributorsAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.url = ( - f"/api/v2/projects/{self.test_project.id}/actions/message-contributors/" - ) - self.test_message = "Test message" - self.test_subject = "Test subject" - self.test_user = return_canned_user("Test User", 1111111) - self.test_user.create() - self.test_user_access_token = generate_encoded_token(self.test_user.id) - self.test_author_access_token = generate_encoded_token(self.test_author.id) - - def test_returns_401_if_not_authenticated(self): - """Test that the endpoint returns 401 if the user is not authenticated""" - # Act - response = self.client.post(self.url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_returns_404_if_project_not_found(self): - """Test that the endpoint returns 404 if the project is not found""" - # Act - response = self.client.post( - "/api/v2/projects/999/actions/message-contributors/", - json={"message": self.test_message, "subject": self.test_subject}, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_403_if_user_dont_have_PM_permissions(self): - """Test that the endpoint returns 403 if the user is not the project author""" - # Act - response = self.client.post( - self.url, - json={"message": self.test_message, "subject": self.test_subject}, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 403) - - def test_returns_400_if_invalid_data(self): - """Test that the endpoint returns 400 if the data is invalid""" - # Act - response = self.client.post( - self.url, - json={"subject": self.test_subject}, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 400) - - @patch("threading.Thread.start") - def test_sends_message_to_contributors_is_allowed_to_project_author( - self, mock_thread - ): - """Test that the endpoint sends a message to the project contributors""" - # Arrange - # Add a contributor to the project - task = Task.get(2, self.test_project.id) - task.lock_task_for_mapping(self.test_user.id) - task.unlock_task(self.test_user.id, TaskStatus.MAPPED) - # Mock the thread start method to avoid application context issues - mock_thread.return_value = None - # Act - response = self.client.post( - self.url, - json={"message": self.test_message, "subject": self.test_subject}, - headers={"Authorization": self.test_author_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(mock_thread.call_count, 1) - - @patch("threading.Thread.start") - def test_sends_message_to_contributors_is_allowed_to_organisation_manager( - self, mock_thread - ): - """Test that the endpoint sends a message to the project contributors""" - # Arrange - test_organisation = create_canned_organisation() - self.test_project.organisation = test_organisation - add_manager_to_organisation(test_organisation, self.test_user) - # Add a contributor to the project - task = Task.get(2, self.test_project.id) - task.lock_task_for_mapping(self.test_user.id) - task.unlock_task(self.test_user.id, TaskStatus.MAPPED) - # Mock the thread start method to avoid application context issues - mock_thread.return_value = None - # Act - response = self.client.post( - self.url, - json={"message": self.test_message, "subject": self.test_subject}, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(mock_thread.call_count, 1) - - @patch("threading.Thread.start") - def test_sends_message_to_contributors_is_allowed_to_admin(self, mock_thread): - """Test that the endpoint sends a message to the project contributors""" - # Arrange - self.test_user.role = UserRole.ADMIN.value - # Add a contributor to the project - task = Task.get(2, self.test_project.id) - task.lock_task_for_mapping(self.test_user.id) - task.unlock_task(self.test_user.id, TaskStatus.MAPPED) - # Mock the thread start method to avoid application context issues - mock_thread.return_value = None - # Act - response = self.client.post( - self.url, - json={"message": self.test_message, "subject": self.test_subject}, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(mock_thread.call_count, 1) - - @patch("threading.Thread.start") - def test_sends_message_to_contributors_is_allowed_to_project_team_members_with_PM_permission( - self, mock_thread - ): - """Test that the endpoint sends a message to the project contributors""" - # Arrange - test_organisation = create_canned_organisation() - self.test_project.organisation = test_organisation - test_team = create_canned_team() - add_user_to_team( - test_team, self.test_user, TeamMemberFunctions.MEMBER.value, True - ) - assign_team_to_project( - self.test_project, test_team, TeamRoles.PROJECT_MANAGER.value - ) - # Add a contributor to the project - task = Task.get(2, self.test_project.id) - task.lock_task_for_mapping(self.test_user.id) - task.unlock_task(self.test_user.id, TaskStatus.MAPPED) - # Mock the thread start method to avoid application context issues - mock_thread.return_value = None - # Act - response = self.client.post( - self.url, - json={"message": self.test_message, "subject": self.test_subject}, - headers={"Authorization": self.test_user_access_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(mock_thread.call_count, 1) - - -class TestProjectsActionsTransferAPI(BaseTestCase): - """Tests for the transfer project endpoint""" - - def setUp(self): - super().setUp() - self.test_user = return_canned_user("test_user_1", 111111) - self.test_user.create() - self.test_user_access_token = generate_encoded_token(self.test_user.id) - self.test_project, self.test_author = create_canned_project() - self.test_author_access_token = generate_encoded_token(self.test_author.id) - self.url = ( - f"/api/v2/projects/{self.test_project.id}/actions/transfer-ownership/" - ) - self.test_organisation = create_canned_organisation() - self.test_project.organisation = self.test_organisation - self.test_project.save() - - def test_returns_401_if_unauthorized(self): - """Test that the endpoint returns 401 if the user is not logged in""" - # Act - response = self.client.post(self.url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_returns_404_if_project_does_not_exist(self): - """Test that the endpoint returns 404 if the project does not exist""" - # Act - response = self.client.post( - "/api/v2/projects/1111111/actions/transfer-ownership/", - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user"}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_403_if_user_is_not_project_admin_org_manager_project_author(self): - """Test that the endpoint returns 403 if the user is not the project owner""" - # Arrange - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user_1"}, - ) - # Assert - self.assertEqual(response.status_code, 403) - - def test_returns_403_if_new_owner_is_not_admin_or_manager_of_org_project_is_in_( - self, - ): - """Test returns 403 if the new owner is not admin or a manager of the organisation the project is in""" - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user_1"}, - ) - # Assert - self.assertEqual(response.status_code, 403) - - def test_returns_404_if_new_owner_does_not_exist(self): - """Test that the endpoint returns 404 if the new owner does not exist""" - # Arrange - self.test_user.role = UserRole.ADMIN.value - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user_2"}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - # Patch the thread start method to avoid application context issues - @patch("threading.Thread.start") - def test_returns_200_if_new_owner_is_admin_or_manager_of_org_project_is_in( - self, mock_thread - ): - """Test that the endpoint returns 200 if the new owner is an admin of the organisation the project is in""" - # Test new owner is admin - # Arrange - self.test_user.role = UserRole.ADMIN.value - test_user_2 = return_canned_user("test_user_2", 222222) - test_user_2.role = UserRole.ADMIN.value - test_user_2.create() - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user_2"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(self.test_project.author_id, test_user_2.id) - - # Test new owner is manager of org project is in - # Arrange - test_user_2.role = UserRole.MAPPER.value - test_user_2.save() - add_manager_to_organisation(self.test_organisation, test_user_2) - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user_2"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(self.test_project.author_id, test_user_2.id) - - @patch("threading.Thread.start") - def test_returns_200_if_requesting_user_is_project_author(self, mock_thread): - """Test that the endpoint returns 200 if the requesting user is the project author""" - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_author_access_token}, - json={"username": "test_user_1"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(self.test_project.author_id, self.test_user.id) - - @patch("threading.Thread.start") - def test_returns_200_if_requesting_user_is_org_manager(self, mock_thread): - """Test that the endpoint returns 200 if the requesting user is an org manager""" - # Test org manager - # Arrange - test_user_2 = return_canned_user("test_user_2", 222222) - test_user_2.role = UserRole.ADMIN.value - test_user_2.create() - add_manager_to_organisation(self.test_organisation, self.test_user) - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user_2"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(self.test_project.author_id, test_user_2.id) - - @patch("threading.Thread.start") - def test_returns_200_if_requesting_user_is_admin(self, mock_thread): - """Test that the endpoint returns 200 if the requesting user is an admin""" - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - test_user_2 = return_canned_user("test_user_2", 222222) - test_user_2.role = UserRole.ADMIN.value - test_user_2.create() - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_user_access_token}, - json={"username": "test_user_2"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(self.test_project.author_id, test_user_2.id) diff --git a/tests/backend/integration/api/projects/test_activities.py b/tests/backend/integration/api/projects/test_activities.py deleted file mode 100644 index 9ae1cf4754..0000000000 --- a/tests/backend/integration/api/projects/test_activities.py +++ /dev/null @@ -1,107 +0,0 @@ -from backend.models.postgis.task import Task, TaskAction, TaskStatus -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import create_canned_project - - -class TestProjectsLastActivitiesAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.url = f"/api/v2/projects/{self.test_project.id}/activities/latest/" - - def test_returns_404_if_project_does_not_exist(self): - """ - Test that the API returns a 404 if the project does not exist - """ - # Act - response = self.client.get("/api/v2/projects/999/activities/latest/") - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_200_if_project_exists(self): - """ - Test that the API returns a 200 if the project exists - """ - # Arrange - task_2 = Task.get(2, self.test_project.id) - # Lock the task for mapping - task_2.lock_task_for_mapping(self.test_author.id) - # Unlock the task - task_2.unlock_task(self.test_author.id, new_state=TaskStatus.MAPPED) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["activity"]), self.test_project.total_tasks) - self.assertEqual(response.json["activity"][1]["taskId"], 2) - self.assertEqual(response.json["activity"][1]["taskStatus"], "MAPPED") - self.assertEqual( - response.json["activity"][1]["actionBy"], self.test_author.username - ) - - -class TestProjectsActivitiesAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.url = f"/api/v2/projects/{self.test_project.id}/activities/" - - def test_returns_404_if_project_does_not_exist(self): - """ - Test that the API returns a 404 if the project does not exist - """ - # Act - response = self.client.get("/api/v2/projects/999/activities/") - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_200_if_project_exists(self): - """ - Test that the API returns a 200 if the project exists - """ - # Arrange - task_2 = Task.get(2, self.test_project.id) - # Lock the task for mapping - task_2.lock_task_for_mapping(self.test_author.id) - # Unlock the task - task_2.unlock_task(self.test_author.id, new_state=TaskStatus.MAPPED) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(list(response.json.keys()), ["pagination", "activity"]) - self.assertEqual( - set(response.json["activity"][0].keys()), - set( - [ - "historyId", - "taskId", - "action", - "actionText", - "actionBy", - "actionDate", - "actionBy", - "pictureUrl", - "issues", - ] - ), - ) - # Since we performed two actions above on task 2 i.e. Locked for mapping and Mapped - self.assertEqual(len(response.json["activity"]), 2) - self.assertEqual(response.json["activity"][0]["taskId"], 2) - self.assertEqual( - response.json["activity"][0]["action"], TaskAction.STATE_CHANGE.name - ) - self.assertEqual( - response.json["activity"][0]["actionText"], TaskStatus.MAPPED.name - ) - self.assertEqual( - response.json["activity"][0]["actionBy"], self.test_author.username - ) - self.assertEqual(response.json["activity"][1]["taskId"], 2) - self.assertEqual( - response.json["activity"][1]["action"], TaskAction.LOCKED_FOR_MAPPING.name - ) - self.assertEqual( - response.json["activity"][1]["actionBy"], self.test_author.username - ) diff --git a/tests/backend/integration/api/projects/test_campaign.py b/tests/backend/integration/api/projects/test_campaign.py deleted file mode 100644 index e633a95a5d..0000000000 --- a/tests/backend/integration/api/projects/test_campaign.py +++ /dev/null @@ -1,211 +0,0 @@ -from backend.models.dtos.campaign_dto import CampaignProjectDTO -from backend.services.campaign_service import CampaignService -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_project, - generate_encoded_token, - return_canned_campaign, - return_canned_user, -) - - -class TestGetProjectsCampaignsAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_campaign = return_canned_campaign() - self.test_campaign.create() - self.test_project, self.test_author = create_canned_project() - self.url = f"/api/v2/projects/{self.test_project.id}/campaigns/" - - def test_404_if_project_not_found(self): - # Act - response = self.client.get("/api/v2/projects/999999/campaigns/") - # Assert - self.assertEqual(response.status_code, 404) - - def test_200_if_project_found(self): - # Arrange - campaign_dto = CampaignProjectDTO() - campaign_dto.campaign_id = self.test_campaign.id - campaign_dto.project_id = self.test_project.id - CampaignService.create_campaign_project(campaign_dto) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["campaigns"]), 1) - self.assertEqual(response.json["campaigns"][0]["id"], campaign_dto.campaign_id) - self.assertEqual(response.json["campaigns"][0]["name"], self.test_campaign.name) - - -class TestCAddCampaignProjectAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_campaign = return_canned_campaign() - self.test_campaign.create() - self.test_project, self.test_author = create_canned_project() - self.test_user = return_canned_user("test_user", 11111111) - self.test_user.create() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.test_user_session_token = generate_encoded_token(self.test_user.id) - self.url = f"/api/v2/projects/{self.test_project.id}/campaigns/{self.test_campaign.id}/" - - def test_401_if_not_logged_in(self): - """Test that a user who is not logged in cannot assign a campaign to a project""" - # Act - response = self.client.post(self.url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_403_if_not_project_manager(self): - """Test that a user who is not a project manager cannot assign a campaign to a project""" - # Act - response = self.client.post( - self.url, headers={"Authorization": self.test_user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 403) - - def test_404_if_project_not_found(self): - """Test that a user who is a project manager cannot assign a campaign to a non-existent project""" - # Act - response = self.client.post( - f"/api/v2/projects/999999/campaigns/{self.test_campaign.id}/", - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_404_if_campaign_not_found(self): - """Test that a user who is a project manager cannot assign a non-existent campaign to a project""" - # Act - response = self.client.post( - f"/api/v2/projects/{self.test_project.id}/campaigns/999999/", - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_200_if_campaign_added(self): - """Test that a user who is a project manager can assign a campaign to a project""" - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - project_campaigns = CampaignService.get_project_campaigns_as_dto( - self.test_project.id - )["campaigns"] - self.assertEqual(response.status_code, 200) - self.assertEqual(project_campaigns[0]["id"], self.test_campaign.id) - self.assertEqual(project_campaigns[0]["name"], self.test_campaign.name) - - def test_200_if_campaign_already_added(self): - """Test that a user who is a project manager can assign a campaign to a project""" - # Arrange - campaign_dto = CampaignProjectDTO() - campaign_dto.campaign_id = self.test_campaign.id - campaign_dto.project_id = self.test_project.id - CampaignService.create_campaign_project(campaign_dto) - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - - def test_200_if_campaign_already_added_to_another_project(self): - """Test that a user who is a project manager can assign a campaign to a project""" - # Arrange - test_project_2, _ = create_canned_project() - campaign_dto = CampaignProjectDTO() - campaign_dto.campaign_id = self.test_campaign.id - campaign_dto.project_id = test_project_2.id - CampaignService.create_campaign_project(campaign_dto) - # Act - response = self.client.post( - self.url, - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - - -class TestDeleteCampaignProjectAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_campaign = return_canned_campaign() - self.test_campaign.create() - self.test_project, self.test_author = create_canned_project() - self.test_user = return_canned_user("test_user", 11111111) - self.test_user.create() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.test_user_session_token = generate_encoded_token(self.test_user.id) - self.url = f"/api/v2/projects/{self.test_project.id}/campaigns/{self.test_campaign.id}/" - - def test_401_if_not_logged_in(self): - """Test that a user who is not logged in cannot remove a campaign from a project""" - # Act - response = self.client.delete(self.url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_403_if_not_project_manager(self): - """Test that a user who is not a project manager cannot remove a campaign from a project""" - # Act - response = self.client.delete( - self.url, headers={"Authorization": self.test_user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 403) - - def test_404_if_project_not_found(self): - """Test that a user who is a project manager cannot remove a campaign from a non-existent project""" - # Act - response = self.client.delete( - f"/api/v2/projects/999999/campaigns/{self.test_campaign.id}/", - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_404_if_campaign_not_found(self): - """Test that a user who is a project manager cannot remove a non-existent campaign from a project""" - # Act - response = self.client.delete( - f"/api/v2/projects/{self.test_project.id}/campaigns/999999/", - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_404_if_campaign_not_assigned_to_project(self): - """Test cannot remove a campaign from a project that it is not assigned to""" - # Act - response = self.client.delete( - self.url, - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_200_if_campaign_removed(self): - """Test that a user who is a project manager can remove a campaign from a project""" - # Arrange - campaign_dto = CampaignProjectDTO() - campaign_dto.campaign_id = self.test_campaign.id - campaign_dto.project_id = self.test_project.id - CampaignService.create_campaign_project(campaign_dto) - # Act - response = self.client.delete( - self.url, - headers={"Authorization": self.test_author_session_token}, - ) - # Assert - project_campaigns = CampaignService.get_project_campaigns_as_dto( - self.test_project.id - )["campaigns"] - self.assertEqual(response.status_code, 200) - self.assertEqual(len(project_campaigns), 0) diff --git a/tests/backend/integration/api/projects/test_contributions.py b/tests/backend/integration/api/projects/test_contributions.py deleted file mode 100644 index e893082098..0000000000 --- a/tests/backend/integration/api/projects/test_contributions.py +++ /dev/null @@ -1,176 +0,0 @@ -from datetime import datetime - -from backend.models.postgis.task import Task, TaskStatus -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import create_canned_project, return_canned_user - - -class TestProjectsContributionsAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.url = f"/api/v2/projects/{self.test_project.id}/contributions/" - - def test_returns_404_if_project_does_not_exist(self): - # Act - response = self.client.get("/api/v2/projects/999999/contributions/") - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_200_if_project_exists(self): - # Arrange - task = Task.get(2, self.test_project.id) - # Lock the task for mapping - task.lock_task_for_mapping(self.test_author.id) - # Unlock the task - task.unlock_task(self.test_author.id, new_state=TaskStatus.MAPPED) - task_2 = Task.get(1, self.test_project.id) - # Lock the task for validation - task_2.lock_task_for_validating(self.test_author.id) - # Unlock the task - task_2.unlock_task(self.test_author.id, new_state=TaskStatus.VALIDATED) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - # Since Tasks 1,4 are mapped, 3 is set as bad imagery and Task 4 validated by the test user during test project - # creation. We expect test user to have 4 contributions - test_user_contribution = response.json["userContributions"][0] - self.assertEqual( - set(test_user_contribution.keys()), - set( - [ - "username", - "mappingLevel", - "pictureUrl", - "mapped", - "validated", - "badImagery", - "total", - "mappedTasks", - "validatedTasks", - "badImageryTasks", - "name", - "dateRegistered", - ] - ), - ) - self.assertEqual(test_user_contribution["username"], self.test_author.username) - self.assertEqual(test_user_contribution["mapped"], 3) - self.assertEqual(test_user_contribution["validated"], 2) - self.assertEqual(test_user_contribution["badImagery"], 1) - self.assertEqual(test_user_contribution["mappedTasks"], [4, 2, 1]) - self.assertEqual(test_user_contribution["badImageryTasks"], [3]) - self.assertEqual(test_user_contribution["validatedTasks"], [4, 1]) - - def test_return_empty_list_if_no_contributions(self): - task1 = Task.get(1, self.test_project.id) - task1.task_status = TaskStatus.READY.value - - task2 = Task.get(2, self.test_project.id) - task2.task_status = TaskStatus.READY.value - - task3 = Task.get(3, self.test_project.id) - task3.task_status = TaskStatus.READY.value - - task4 = Task.get(3, self.test_project.id) - task4.task_status = TaskStatus.READY.value - - response = self.client.get(self.url) - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["userContributions"]), 0) - self.assertEqual(response.json["userContributions"], []) - - def test_returns_list_of_all_contributors(self): - # Setup - # new test user - test_user = return_canned_user("test_user", 11111111) - test_user.create() - # contributions - # Invalidate task 1 by test author - task_1 = Task.get(1, self.test_project.id) - task_1.lock_task_for_validating(self.test_author.id) - task_1.unlock_task(self.test_author.id, new_state=TaskStatus.INVALIDATED) - # Lock task 2 for mapping by test user - task_2 = Task.get(2, self.test_project.id) - task_2.lock_task_for_mapping(test_user.id) - task_2.unlock_task(test_user.id, new_state=TaskStatus.BADIMAGERY) - # Act - response = self.client.get(self.url) - user_contributions_response = response.json["userContributions"] - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(user_contributions_response), 2) - # 1st contributor - # Tasks 3,4 are mapped and task 4 validated by test_author during project creation - self.assertEqual( - user_contributions_response[0]["username"], self.test_author.username - ) - self.assertEqual(user_contributions_response[0]["mapped"], 1) - self.assertEqual(user_contributions_response[0]["validated"], 1) - self.assertEqual(user_contributions_response[0]["badImagery"], 1) - self.assertEqual(user_contributions_response[0]["mappedTasks"], [4]) - self.assertEqual(user_contributions_response[0]["validatedTasks"], [4]) - self.assertEqual(user_contributions_response[0]["badImageryTasks"], [3]) - # 2nd contributor - self.assertEqual(user_contributions_response[1]["username"], test_user.username) - self.assertEqual(user_contributions_response[1]["mapped"], 0) - self.assertEqual(user_contributions_response[1]["badImagery"], 1) - self.assertEqual(user_contributions_response[1]["validated"], 0) - self.assertEqual(user_contributions_response[1]["mappedTasks"], []) - self.assertEqual(user_contributions_response[1]["validatedTasks"], []) - self.assertEqual(user_contributions_response[1]["badImageryTasks"], [2]) - - -class TestProjectsContributionsQueriesDayAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.url = f"/api/v2/projects/{self.test_project.id}/contributions/queries/day/" - - def test_returns_404_if_project_does_not_exist(self): - # Act - response = self.client.get("/api/v2/projects/999999/contributions/queries/day/") - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_200_if_project_exists(self): - # Arrange - # Since contribs_by_day calculates the contributions using - # TaskHistory all of the actions need to be registered in TaskHistory. - # Arrange - task_2 = Task.get(2, self.test_project.id) - # Lock the task for mapping - task_2.lock_task_for_mapping(self.test_author.id) - # Unlock the task - task_2.unlock_task(self.test_author.id, new_state=TaskStatus.MAPPED) - task_2.lock_task_for_validating(self.test_author.id) - # Unlock the task - task_2.unlock_task(self.test_author.id, new_state=TaskStatus.VALIDATED) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - # Since we only have history of today, we expect only one element in the stats array - self.assertEqual(len(response.json["stats"]), 1) - self.assertEqual( - set(response.json["stats"][0].keys()), - set( - [ - "date", - "mapped", - "validated", - "cumulative_mapped", - "cumulative_validated", - "total_tasks", - ] - ), - ) - self.assertEqual( - response.json["stats"][0]["date"], datetime.today().strftime("%Y-%m-%d") - ) - self.assertEqual(response.json["stats"][0]["mapped"], 1) - self.assertEqual(response.json["stats"][0]["validated"], 1) - self.assertEqual(response.json["stats"][0]["cumulative_mapped"], 1) - self.assertEqual(response.json["stats"][0]["cumulative_validated"], 1) - self.assertEqual(response.json["stats"][0]["total_tasks"], 4) diff --git a/tests/backend/integration/api/projects/test_favourites.py b/tests/backend/integration/api/projects/test_favourites.py deleted file mode 100644 index 2ece33287f..0000000000 --- a/tests/backend/integration/api/projects/test_favourites.py +++ /dev/null @@ -1,130 +0,0 @@ -from backend.services.project_service import ProjectService -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_project, - generate_encoded_token, -) - - -class TestValidateProjectFavouritedAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.url = f"/api/v2/projects/{self.test_project.id}/favorite/" - - def test_returns_401_if_no_token(self): - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(401, response.status_code) - - def test_returns_404_if_project_does_not_exist(self): - # Arrange - url = "/api/v2/projects/999/favorite/" - # Act - response = self.client.get( - url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(404, response.status_code) - - def test_returns_correct_favourite_status(self): - # Act - response = self.client.get( - self.url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(200, response.status_code) - self.assertEqual({"favorited": False}, response.json) - - # Arrange - ProjectService.favorite(self.test_project.id, self.test_author.id) - # Act - response = self.client.get( - self.url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(200, response.status_code) - self.assertEqual({"favorited": True}, response.json) - - -class SetProjectFavouriteAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.url = f"/api/v2/projects/{self.test_project.id}/favorite/" - - def test_returns_401_if_no_token(self): - # Act - response = self.client.post(self.url) - # Assert - self.assertEqual(401, response.status_code) - - def test_returns_404_if_project_does_not_exist(self): - # Arrange - url = "/api/v2/projects/99999/favorite/" - # Act - response = self.client.post( - url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(404, response.status_code) - - def test_returns_200_if_user_authenticated_and_project_exists(self): - # Act - response = self.client.post( - self.url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(200, response.status_code) - self.assertEqual( - ProjectService.is_favorited(self.test_project.id, self.test_author.id), True - ) - - -class UnsetProjectFavouriteAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.url = f"/api/v2/projects/{self.test_project.id}/favorite/" - - def test_returns_401_if_no_token(self): - # Act - response = self.client.delete(self.url) - # Assert - self.assertEqual(401, response.status_code) - - def test_returns_404_if_project_does_not_exist(self): - # Arrange - url = "/api/v2/projects/999999/favorite/" - # Act - response = self.client.delete( - url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(404, response.status_code) - - def test_returns_400_on_not_favourited_projects(self): - # Act - response = self.client.delete( - self.url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(400, response.status_code) - - def test_returns_200_if_project_unfavourited(self): - # Arrange - ProjectService.favorite(self.test_project.id, self.test_author.id) - # Act - response = self.client.delete( - self.url, headers={"Authorization": self.test_author_session_token} - ) - # Assert - self.assertEqual(200, response.status_code) - self.assertEqual( - ProjectService.is_favorited(self.test_project.id, self.test_author.id), - False, - ) diff --git a/tests/backend/integration/api/projects/test_resources.py b/tests/backend/integration/api/projects/test_resources.py deleted file mode 100644 index df70509542..0000000000 --- a/tests/backend/integration/api/projects/test_resources.py +++ /dev/null @@ -1,2321 +0,0 @@ -from datetime import datetime, timedelta - -import geojson - -from backend.exceptions import NotFound -from backend.models.dtos.campaign_dto import CampaignProjectDTO -from backend.models.dtos.project_dto import ( - DraftProjectDTO, - is_known_editor, - is_known_mapping_permission, - is_known_mapping_type, - is_known_project_difficulty, - is_known_project_priority, - is_known_project_status, - is_known_task_creation_mode, - is_known_validation_permission, -) -from backend.models.postgis.project import Project, ProjectDTO -from backend.models.postgis.statuses import ( - MappingPermission, - MappingTypes, - ProjectDifficulty, - ProjectPriority, - ProjectStatus, - TaskStatus, - TeamMemberFunctions, - TeamRoles, - UserRole, - ValidationPermission, -) -from backend.models.postgis.task import Task -from backend.services.campaign_service import CampaignService -from backend.services.interests_service import InterestService -from backend.services.mapping_service import MappingService -from backend.services.project_service import ProjectAdminService, ProjectService -from backend.services.validator_service import ValidatorService -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - add_manager_to_organisation, - add_user_to_team, - assign_team_to_project, - create_canned_interest, - create_canned_organisation, - create_canned_project, - create_canned_team, - generate_encoded_token, - get_canned_json, - return_canned_campaign, - return_canned_draft_project_json, - return_canned_organisation, - return_canned_team, - return_canned_user, - update_project_with_info, -) - -TEST_USER_USERNAME = "Test User" -TEST_USER_ID = 11111 - - -class TestDeleteProjectsRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.url = f"/api/v2/projects/{self.test_project.id}/" - self.test_user = return_canned_user( - username=TEST_USER_USERNAME, id=TEST_USER_ID - ) - self.test_user.create() - test_organistion = create_canned_organisation() - self.test_project.organisation = test_organistion - self.test_project.save() - self.author_session_token = generate_encoded_token(self.test_author.id) - self.user_session_token = generate_encoded_token(self.test_user.id) - - def test_delete_project_returns_401_without_token(self): - "Test returns 401 on request without session token." - # Act - response = self.client.delete(self.url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_delete_project_returns_403_on_if_request_by_unauthorized_user(self): - "Test Requesting user must have at least PM role on project" - # Arrange - # Reset all tasks to READY so that project can be deleted - ProjectAdminService.reset_all_tasks(self.test_project.id, self.test_user.id) - # Act - response = self.client.delete( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "UserPermissionError") - - def test_project_with_mapped_tasks_cannot_be_deleted(self): - "Test project with mapped tasks cannot be deleted" - # Arrange - # Only admin and org manager can delete project - add_manager_to_organisation(self.test_project.organisation, self.test_author) - # Act - response = self.client.delete( - self.url, headers={"Authorization": self.author_session_token} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "HasMappedTasks") - - def test_org_manager_can_delete_project(self): - "Test user with PM role can delete project" - - # Arrange - # Only admin and org manager can delete project - add_manager_to_organisation(self.test_project.organisation, self.test_author) - # Reset all tasks to READY so that project can be deleted - ProjectAdminService.reset_all_tasks(self.test_project.id, self.test_user.id) - - # Act - response = self.client.delete( - self.url, headers={"Authorization": self.author_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - with self.assertRaises(NotFound): - ProjectService.get_project_by_id(self.test_project.id) - - def test_admin_can_delete_project(self): - "Test project can be deleted by admins." - - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Reset all tasks to READY so that project can be deleted - ProjectAdminService.reset_all_tasks(self.test_project.id, self.test_user.id) - - # Act - response = self.client.delete( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - with self.assertRaises(NotFound): - ProjectService.get_project_by_id(self.test_project.id) - - -class TestCreateProjectsRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_user = return_canned_user( - username=TEST_USER_USERNAME, id=TEST_USER_ID - ) - self.test_user.create() - self.test_organisation = create_canned_organisation() - self.url = "/api/v2/projects/" - self.session_token = generate_encoded_token(self.test_user.id) - self.canned_project_json = return_canned_draft_project_json() - - @staticmethod - def assert_draft_project_response(project_response, expected_project): - "Test project response" - assert expected_project["organisation"] == project_response.organisation_id - # Only assert coordinates as the rest of the geometry is not converted before saving to db. - expected_aoi = [ - expected_project["areaOfInterest"]["features"][0]["geometry"]["coordinates"] - ] - assert ( - expected_aoi - == project_response.get_aoi_geometry_as_geojson()["coordinates"] - ) - assert project_response.status == ProjectStatus.DRAFT.value - assert expected_project["projectName"] == project_response.get_project_title( - "en" - ) - - def test_create_project_returns_401_without_token(self): - "Test returns 401 on request without session token." - # Act - response = self.client.post(self.url, json=self.canned_project_json) - # Assert - self.assertEqual(response.status_code, 401) - - def test_create_project_returns_403_on_if_request_by_unauthorized_user(self): - "Test Requesting user must have at least PM role on project" - # Act - response = self.client.post( - self.url, - json=self.canned_project_json, - headers={"Authorization": self.session_token}, - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "NotPermittedToCreate") - - def test_create_project_returns_400_if_invalid_json(self): - "Test returns 400 if invalid json" - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Act - response = self.client.post( - self.url, json={}, headers={"Authorization": self.session_token} - ) - # Assert - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "InvalidData") - - def test_org_manager_can_create_project(self): - "Test user with PM role can create project" - # Arrange - add_manager_to_organisation(self.test_organisation, self.test_user) - # Act - response = self.client.post( - self.url, - json=self.canned_project_json, - headers={"Authorization": self.session_token}, - ) - self.assertEqual(response.status_code, 201) - self.assertIn("projectId", response.json) - draft_project = ProjectService.get_project_by_id(response.json["projectId"]) - TestCreateProjectsRestAPI.assert_draft_project_response( - draft_project, self.canned_project_json - ) - - def test_admin_can_create_project(self): - "Test project can be created by admins." - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Act - response = self.client.post( - self.url, - json=self.canned_project_json, - headers={"Authorization": self.session_token}, - ) - # Assert - self.assertEqual(response.status_code, 201) - self.assertIn("projectId", response.json) - draft_project = ProjectService.get_project_by_id(response.json["projectId"]) - TestCreateProjectsRestAPI.assert_draft_project_response( - draft_project, self.canned_project_json - ) - - -class TestGetProjectsRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.url = f"/api/v2/projects/{self.test_project.id}/" - self.test_user = return_canned_user( - username=TEST_USER_USERNAME, id=TEST_USER_ID - ) - self.test_user.create() - test_organistion = create_canned_organisation() - self.test_project.organisation = test_organistion - self.test_project.save() - self.user_session_token = generate_encoded_token(self.test_user.id) - - @staticmethod - def assert_project_response(project_response, expected_project, assert_type="full"): - "Test project response" - assert expected_project.id == project_response["projectId"] - # Since some of the fields are not returned in summary mode we need to skip them - if assert_type != "summary": - assert geojson.loads( - geojson.dumps(project_response["areaOfInterest"]) - ).is_valid - assert ["type", "coordinates"] == list( - project_response["areaOfInterest"].keys() - ) - if assert_type == "notasks": - assert "tasks" not in project_response - else: - assert geojson.loads(geojson.dumps(project_response["tasks"])).is_valid - assert ( - is_known_task_creation_mode(project_response["taskCreationMode"]) - is None - ) - assert "activeMappers" in project_response - assert "interests" in project_response - assert "priorityAreas" in project_response - assert "projectInfoLocales" in project_response - - else: # assert fields that are returned in summary mode are present - assert "aoiCentroid" in project_response - assert "shortDescription" in project_response - assert "allowedUsernames" in project_response - # Since projectInfo is not present in notasks mode we need to skip it - if assert_type != "notasks": - assert ( - expected_project.get_project_title(expected_project.default_locale) - == project_response["projectInfo"]["name"] - ) - assert [ - "locale", - "name", - "shortDescription", - "description", - "instructions", - "perTaskInstructions", - ] == list(project_response["projectInfo"].keys()) - - # As these returns validation functions returns None for valid values assert that they are None - assert is_known_project_status(project_response["status"]) is None - assert is_known_project_priority(project_response["projectPriority"]) is None - assert is_known_project_difficulty(project_response["difficulty"]) is None - - for mapping_type in project_response["mappingTypes"]: - assert is_known_mapping_type(mapping_type) is None - - for editor in set( - project_response["mappingEditors"] + project_response["validationEditors"] - ): - assert is_known_editor(editor) is None - assert ( - is_known_mapping_permission(project_response["mappingPermission"]) is None - ) - assert ( - is_known_validation_permission(project_response["validationPermission"]) - is None - ) - - assert expected_project.private == project_response["private"] - assert ( - expected_project.changeset_comment == project_response["changesetComment"] - ) - assert expected_project.default_locale == project_response["defaultLocale"] - assert expected_project.organisation_id == project_response["organisation"] - assert expected_project.author.username == project_response["author"] - - assert "enforceRandomTaskSelection" in project_response - assert "osmchaFilterId" in project_response - assert "dueDate" in project_response - assert "imagery" in project_response - assert "idPresets" in project_response - assert "extraIdParams" in project_response - assert "rapidPowerUser" in project_response - assert "mappingTypes" in project_response - assert "campaigns" in project_response - assert "organisationName" in project_response - assert "organisationSlug" in project_response - assert "organisationLogo" in project_response - assert "countryTag" in project_response - assert "licenseId" in project_response - assert "allowedUsernames" in project_response - assert "created" in project_response - assert "lastUpdated" in project_response - assert "percentMapped" in project_response - assert "percentValidated" in project_response - assert "percentBadImagery" in project_response - assert "teams" in project_response - - def test_published_public_project_can_be_accessed_without_token(self): - "Test returns 200 on request by unauthenticated user." - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json["projectId"], self.test_project.id) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - - def test_draft_project_can_only_be_accessed_by_user_with_PM_permissions(self): - "Test draft project can only be accessed by user with PM permissions." - # Arrange - self.test_project.status = ProjectStatus.DRAFT.value - self.test_project.save() - - # Authenticated user with that is not a manager or admin - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "ProjectNotFetched") - - # Authenticated user with that is a admin - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - - # Authenticated user with that is a manager - self.test_user.role = UserRole.MAPPER.value - self.test_user.save() - add_manager_to_organisation(self.test_project.organisation, self.test_user) - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json["projectId"], self.test_project.id) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - - def test_private_project_requires_atleast_PM_permissions(self): - "Test provate project can only be accessed by user with PM permissions." - # Arrange - self.test_project.private = True - self.test_project.save() - - # Authenticated user with that is not a manager or admin - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "PrivateProject") - - # Authenticated user with that is a admin - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Act - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - - # Authenticated user with that is a organisation manager - # Arrange - self.test_user.role = UserRole.MAPPER.value # Reset user role to Mapper - self.test_user.save() - add_manager_to_organisation(self.test_project.organisation, self.test_user) - # Act - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - - # Authenticated user with that is a member of team associated with project - # Arrange - # Remove organisation from project - self.test_project.organisation = None - # Create a team and add user to it - test_team = create_canned_team() - test_user_1 = return_canned_user("TEST_USER_1", 222222) - test_user_1.create() - test_user_1_session_token = generate_encoded_token(test_user_1.id) - add_user_to_team(test_team, test_user_1, TeamMemberFunctions.MEMBER.value, True) - # Assign team to project - assign_team_to_project(self.test_project, test_team, TeamRoles.MAPPER.value) - # Act - response = self.client.get( - self.url, headers={"Authorization": test_user_1_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - - def test_get_project_returns_tasks_with_geometry_while_abbreviated_is_set_false( - self, - ): - "Test get project returns tasks with geometry while abbreviated is set false." - # Act - response = self.client.get( - f"{self.url}?abbreviated=false", - headers={"Authorization": self.user_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - for task in response.json["tasks"]["features"]: - self.assertIsNotNone(task["geometry"]) - - def test_get_project_returns_tasks_with_no_geometry_while_abbreviated_is_set_true( - self, - ): - "Test get project returns tasks with no geom while abbreviated is set true." - # Act - response = self.client.get( - f"{self.url}?abbreviated=true", - headers={"Authorization": self.user_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - for task in response.json["tasks"]["features"]: - self.assertIsNone(task["geometry"]) - - def test_get_project_returns_file_if_as_file_is_set_true(self): - "Test get project returns file if as_file is set true." - # Act - response = self.client.get( - f"{self.url}?as_file=true", - headers={"Authorization": self.user_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.headers["Content-Type"], "application/json") - self.assertEqual( - response.headers["Content-Disposition"], - f"attachment; filename=project_{self.test_project.id}.json", - ) - TestGetProjectsRestAPI.assert_project_response(response.json, self.test_project) - - -class TestPatchProjectRestAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.url = f"/api/v2/projects/{self.test_project.id}/" - self.test_user = return_canned_user( - username=TEST_USER_USERNAME, id=TEST_USER_ID - ) - self.test_user.create() - test_organistion = create_canned_organisation() - self.test_project.organisation = test_organistion - self.test_project.save() - self.author_session_token = generate_encoded_token(self.test_author.id) - self.user_session_token = generate_encoded_token(self.test_user.id) - self.project_update_body = get_canned_json("canned_project_detail.json") - self.project_update_body["projectId"] = self.test_project.id - - def test_patch_project_requires_authentication(self): - "Test patch project requires authentication." - # Act - response = self.client.patch(self.url) - # Assert - self.assertEqual(response.status_code, 401) - - def test_patch_project_returns_404_if_project_does_not_exist(self): - "Test patch project returns 404 if project does not exist." - # Act - response = self.client.patch( - "/api/v2/projects/1000/", headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_patch_project_returns_403_if_user_is_not_project_manager(self): - "Test patch project returns 403 if user is not project manager." - # Act - response = self.client.patch( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "UserPermissionError") - - def test_patch_project_returns_400_if_invalid_body(self): - "Test patch project returns 400 if invalid body." - # Act - response = self.client.patch( - self.url, - json={"message": "invalid body"}, - content_type="application/json", - headers={"Authorization": self.author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "InvalidData") - - def test_project_author_can_update_project(self): - "Test project author can update project." - # Act - response = self.client.patch( - self.url, - json=self.project_update_body, - content_type="application/json", - headers={"Authorization": self.author_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - updated_project = ProjectService.get_project_by_id(self.test_project.id) - TestGetProjectsRestAPI.assert_project_response( - self.project_update_body, updated_project - ) - - def test_member_of_team_with_PM_permission_can_update_project(self): - "Test member of team with PM permission can update project." - # Arrange - team = create_canned_team() - add_user_to_team(team, self.test_user, TeamMemberFunctions.MEMBER.value, True) - project_team = assign_team_to_project( - self.test_project, team, TeamRoles.PROJECT_MANAGER.value - ) - # Act - response = self.client.patch( - self.url, - json=self.project_update_body, - content_type="application/json", - headers={"Authorization": self.user_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - updated_project = ProjectService.get_project_by_id(self.test_project.id) - TestGetProjectsRestAPI.assert_project_response( - self.project_update_body, updated_project - ) - # Cleanup - project_team.delete() - - def test_member_of_team_with_non_PM_role_cannot_update_project(self): - """Test member of team with non PM permission can't update project.""" - # Arrange - team = create_canned_team() - add_user_to_team(team, self.test_user, TeamMemberFunctions.MEMBER.value, True) - project_team = assign_team_to_project( - self.test_project, team, TeamRoles.VALIDATOR.value - ) - # Act - response = self.client.patch( - self.url, - json=self.project_update_body, - content_type="application/json", - headers={"Authorization": self.user_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 403) - # Cleanup - project_team.delete() - - def test_user_with_admin_role_can_update_project(self): - "Test project can be updated by admins." - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Act - response = self.client.patch( - self.url, - json=self.project_update_body, - content_type="application/json", - headers={"Authorization": self.user_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - updated_project = ProjectService.get_project_by_id(self.test_project.id) - TestGetProjectsRestAPI.assert_project_response( - self.project_update_body, updated_project - ) - # Cleanup - self.test_user.role = UserRole.MAPPER.value - self.test_user.save() - - def test_org_manager_can_update_project(self): - "Test org manager can update project." - # Arrange - add_manager_to_organisation(self.test_project.organisation, self.test_user) - # Act - response = self.client.patch( - self.url, - json=self.project_update_body, - content_type="application/json", - headers={"Authorization": self.user_session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - updated_project = ProjectService.get_project_by_id(self.test_project.id) - TestGetProjectsRestAPI.assert_project_response( - self.project_update_body, updated_project - ) - - -class TestProjectsAllAPI(BaseTestCase): - """Tests for the projects/all endpoint.""" - - def setUp(self): - super().setUp() - self.url = "/api/v2/projects/" - self.test_project_1, self.test_author = create_canned_project() - self.test_project_1.status = ProjectStatus.PUBLISHED.value - self.test_project_1.save() - self.test_project_2, _ = create_canned_project() - self.test_project_2.status = ProjectStatus.PUBLISHED.value - self.test_project_2.private = True - self.test_project_2.save() - self.test_project_3, _ = create_canned_project() - self.test_project_3.status = ProjectStatus.DRAFT.value - self.test_project_3.save() - self.test_user = return_canned_user(username="Test User_2", id=11111) - self.test_user.create() - self.author_session_token = generate_encoded_token(self.test_author.id) - self.user_session_token = generate_encoded_token(self.test_user.id) - - def test_get_all_projects_can_be_accessed_without_token(self): - "Test get all projects can be accessed without token." - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - - def test_get_all_project_returns_published_public_projects_if_token_not_supplied( - self, - ): - "Test get all project returns published public projects if token not supplied." - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_get_all_projects_returns_user_permitted_published_projects_if_token_supplied( - self, - ): - "Test get all projects returns published projects on which user has permission if token supplied." - # Arrange - self.test_project_2.private = False - self.test_project_2.save() - # Act - response = self.client.get( - self.url, headers={"Authorization": self.author_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 2) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - self.assertEqual( - response.json["results"][1]["projectId"], self.test_project_2.id - ) - - def test_returns_projects_with_tasks_to_validate_if_action_set_to_validate(self): - """ - Test returns only projects that have tasks ready for validation and - they have permission to validate if action set to validate. - """ - # Arrange - self.test_project_2.private = False - # Since test_author is BEGINNER, they can only validate projects with validation permission ANY. - self.test_project_1.validation_permission = ValidationPermission.ANY.value - self.test_project_1.save() - self.test_project_2.validation_permission = ValidationPermission.ANY.value - self.test_project_2.save() - # Reset all tasks of test_project_2 so that there are no tasks ready to validate. - MappingService.map_all_tasks(self.test_project_2.id, self.test_author.id) - ValidatorService.validate_all_tasks(self.test_project_2.id, self.test_author.id) - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.author_session_token}, - query_string={"action": "validate"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - # Test_project_2 has no tasks to validate, it should not be returned even when user has permsiion to validate. - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_projects_with_tasks_to_map_if_action_set_to_map(self): - """ - Test returns only projects that have tasks ready for mapping and - they have permission to map if action set to map. - """ - # Arrange - self.test_project_2.private = False - # Since test_author is BEGINNER, they can only map projects with mapping permission ANY. - self.test_project_1.mapping_permission = MappingPermission.ANY.value - self.test_project_1.save() - self.test_project_2.mapping_permission = MappingPermission.ANY.value - self.test_project_2.save() - # Map all tasks of test_project_2 so that there are no tasks ready to map. - MappingService.map_all_tasks(self.test_project_2.id, self.test_author.id) - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"action": "map"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - # Test_project_2 has no tasks to map, it should not be returned even when user has permission to map. - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_all_projects_that_user_is_permitted_if_action_set_to_any(self): - """ - Test returns all projects that user has permission for if action set to any. - """ - # Arrange - self.test_project_2.private = False - # Since test_author is BEGINNER, they can only map projects with mapping permission ANY. - self.test_project_1.mapping_permission = MappingPermission.ANY.value - self.test_project_1.save() - self.test_project_2.mapping_permission = MappingPermission.ANY.value - self.test_project_2.save() - # Archive test_project_2 so that it is not returned if action set to any. - test_project_4 = Project.clone(self.test_project_2.id, self.test_author.id) - test_project_4.status = ProjectStatus.ARCHIVED.value - # Validate all tasks of test_project_2 to check finished projects are not returned if action set to any. - MappingService.map_all_tasks(self.test_project_2.id, self.test_author.id) - ValidatorService.validate_all_tasks(self.test_project_2.id, self.test_author.id) - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"action": "any"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 2) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - self.assertEqual( - response.json["results"][1]["projectId"], self.test_project_2.id - ) - - def test_returns_easy_projects_if_difficulty_set_to_easy(self): - """ - Test returns only projects with difficulty set to easy if difficulty set to easy. - """ - # Arrange - self.test_project_2.private = False - # Set difficulty of test_project_2 to easy. - self.test_project_2.difficulty = ProjectDifficulty.EASY.value - self.test_project_2.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"difficulty": "EASY"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_2.id - ) - - def test_returns_moderate_projects_if_difficulty_set_to_moderate(self): - """ - Test returns only projects with difficulty set to MODERATE if difficulty set to MODERATE. - Since we have set difficulty of proects to MODERATE during setup, we should get all user permitted projects. - """ - # Arrange - self.test_project_2.private = False - # Change difficulty of test_project_2 to easy so that it is not returned. - self.test_project_2.difficulty = ProjectDifficulty.EASY.value - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"difficulty": "MODERATE"}, - ) - # User is only permitted to map test_project_1 and test_project_2, since test_project_3 is DRAFT. - # So we should get only test_project_1 as it is the only project with difficulty set to MODERATE. - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_challenging_projects_if_difficulty_set_to_changelling(self): - """ - Test returns only projects with difficulty set to hard if difficulty set to challenging. - """ - # Arrange - self.test_project_2.private = False - # Set difficulty of test_project_2 to hard. - self.test_project_2.difficulty = ProjectDifficulty.CHALLENGING.value - self.test_project_2.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"difficulty": "CHALLENGING"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_2.id - ) - - def test_returns_all_projects_if_difficulty_set_to_all(self): - """ - Test returns all projects if difficulty set to all. - """ - # Arrange - self.test_project_2.private = False - # Set difficulty of test_project_2 to easy. - self.test_project_2.difficulty = ProjectDifficulty.EASY.value - self.test_project_2.save() - self.test_project_1.difficulty = ProjectDifficulty.MODERATE.value - self.test_project_1.save() - test_project_4 = Project.clone(self.test_project_2.id, self.test_author.id) - test_project_4.status = ProjectStatus.PUBLISHED.value - test_project_4.difficulty = ProjectDifficulty.CHALLENGING.value - test_project_4.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"difficulty": "ALL"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - # User is only permitted for test_project 1, 2 and 4, since test_project_3 is DRAFT. - self.assertEqual(len(response.json["results"]), 3) - self.assertNotIn( - self.test_project_3.id, [i["projectId"] for i in response.json["results"]] - ) - - def test_returns_sorted_projects_by_priority_if_sort_by_set_to_priority(self): - """ - Test returns sorted projects by priority if sort_by set to priority. - """ - # Arrange - # Set priority of test_project_1 to urgent. - self.test_project_1.priority = ProjectPriority.URGENT.value - self.test_project_1.save() - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.private = False - self.test_project_2.priority = ProjectPriority.HIGH.value - self.test_project_2.save() - # Set priority of test_project_1 to low and status to published. - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.priority = ProjectPriority.MEDIUM.value - self.test_project_3.save() - test_project_4 = Project.clone(self.test_project_2.id, self.test_author.id) - test_project_4.status = ProjectStatus.PUBLISHED.value - test_project_4.priority = ProjectPriority.LOW.value - test_project_4.save() - - # Test for descending order - # Act - response_desc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "priority", "orderByType": "DESC"}, - ) - # Assert - self.assertEqual(response_desc.status_code, 200) - self.assertEqual(len(response_desc.json["results"]), 4) - expected_desc_order = [ - test_project_4.id, - self.test_project_3.id, - self.test_project_2.id, - self.test_project_1.id, - ] - self.assertListEqual( - [i["projectId"] for i in response_desc.json["results"]], expected_desc_order - ) - - # Test for ascending order - # Act - response_asc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "priority", "orderByType": "ASC"}, - ) - # Assert - self.assertEqual(response_asc.status_code, 200) - self.assertEqual(len(response_asc.json["results"]), 4) - self.assertListEqual( - [i["projectId"] for i in response_asc.json["results"]], - expected_desc_order[::-1], - ) - - def test_returns_sorted_projects_by_difficulty_if_sort_by_set_to_difficulty(self): - """ - Test returns sorted projects by difficulty if sort_by set to difficulty. - """ - # Arrange - # Set difficulty of test_project_1 to easy. - self.test_project_1.difficulty = ProjectDifficulty.EASY.value - self.test_project_1.save() - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.private = False - self.test_project_2.difficulty = ProjectDifficulty.MODERATE.value - self.test_project_2.save() - # Set difficulty of test_project_1 to hard and status to published. - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.difficulty = ProjectDifficulty.CHALLENGING.value - self.test_project_3.save() - - # Test for descending order - # Act - response_desc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "difficulty", "orderByType": "DESC"}, - ) - # Assert - self.assertEqual(response_desc.status_code, 200) - self.assertEqual(len(response_desc.json["results"]), 3) - expected_desc_order = [ - self.test_project_3.id, - self.test_project_2.id, - self.test_project_1.id, - ] - self.assertListEqual( - [i["projectId"] for i in response_desc.json["results"]], expected_desc_order - ) - - # Test for ascending order - # Act - response_asc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "difficulty", "orderByType": "ASC"}, - ) - # Assert - self.assertEqual(response_asc.status_code, 200) - self.assertEqual(len(response_asc.json["results"]), 3) - self.assertListEqual( - [i["projectId"] for i in response_asc.json["results"]], - expected_desc_order[::-1], - ) - - def test_returns_sorted_projects_by_creation_date_if_sort_by_set_to_id(self): - """ - Test returns sorted projects by created_at if sort_by set to id. - """ - # Arrange - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.private = False - self.test_project_2.save() - # Set status of test_project_3 to published. - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - - # Test returns sorted projects by created_at in descending order. - # Act - response_desc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "id", "orderByType": "DESC"}, - ) - # Assert - self.assertEqual(response_desc.status_code, 200) - self.assertEqual(len(response_desc.json["results"]), 3) - expected_desc_order = [ - self.test_project_3.id, - self.test_project_2.id, - self.test_project_1.id, - ] - self.assertListEqual( - [i["projectId"] for i in response_desc.json["results"]], expected_desc_order - ) - - # Test returns sorted projects by created_at in ascending order. - # Act - response_asc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "id", "orderByType": "ASC"}, - ) - # Assert - self.assertEqual(response_asc.status_code, 200) - self.assertEqual(len(response_asc.json["results"]), 3) - self.assertListEqual( - [i["projectId"] for i in response_asc.json["results"]], - expected_desc_order[::-1], - ) - - def test_returns_sorted_projects_by_last_updated_date_if_sort_by_set_to_updated_at( - self, - ): - """ - Test returns sorted projects by last_updated_at if sort_by set to updated_at. - """ - # Arrange - self.test_project_1.last_updated = datetime.utcnow() - timedelta(days=1) - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.last_updated = datetime.utcnow() - timedelta(days=2) - self.test_project_2.private = False - self.test_project_2.save() - # Set status of test_project_3 to published. - self.test_project_3.last_updated = datetime.utcnow() - timedelta(days=3) - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - - # Test returns sorted projects by last_updated_in descending order. - # Act - response_desc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "last_updated", "orderByType": "DESC"}, - ) - # Assert - self.assertEqual(response_desc.status_code, 200) - self.assertEqual(len(response_desc.json["results"]), 3) - expected_desc_order = [ - self.test_project_1.id, - self.test_project_2.id, - self.test_project_3.id, - ] - self.assertListEqual( - [i["projectId"] for i in response_desc.json["results"]], expected_desc_order - ) - - # Test returns sorted projects by last_updated_in ascending order. - # Act - response_asc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "last_updated", "orderByType": "ASC"}, - ) - # Assert - self.assertEqual(response_asc.status_code, 200) - self.assertEqual(len(response_asc.json["results"]), 3) - self.assertListEqual( - [i["projectId"] for i in response_asc.json["results"]], - expected_desc_order[::-1], - ) - - def test_returns_sorted_projects_by_due_date_if_sort_by_set_to_due_date(self): - """ - Test returns sorted projects by due_date if sort_by set to due_date. - """ - # Arrange - self.test_project_1.due_date = datetime.utcnow() + timedelta(days=1) - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.due_date = datetime.utcnow() + timedelta(days=2) - self.test_project_2.private = False - self.test_project_2.save() - # Set status of test_project_3 to published. - self.test_project_3.due_date = datetime.utcnow() + timedelta(days=3) - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - - # Test returns sorted projects by descending order. - # Act - response_desc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "due_date", "orderByType": "DESC"}, - ) - # Assert - self.assertEqual(response_desc.status_code, 200) - self.assertEqual(len(response_desc.json["results"]), 3) - expected_desc_order = [ - self.test_project_3.id, - self.test_project_2.id, - self.test_project_1.id, - ] - self.assertListEqual( - [i["projectId"] for i in response_desc.json["results"]], expected_desc_order - ) - - # Test returns sorted projects by due_date in ascending order. - # Act - response_asc = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"orderBy": "due_date", "orderByType": "ASC"}, - ) - # Assert - self.assertEqual(response_asc.status_code, 200) - self.assertEqual(len(response_asc.json["results"]), 3) - self.assertListEqual( - [i["projectId"] for i in response_asc.json["results"]], - expected_desc_order[::-1], - ) - - def test_returns_projects_filter_by_statuses(self): - """ - Test returns projects filter by projectStatuses. - """ - # Arrange - self.test_project_1.status = ProjectStatus.DRAFT.value - self.test_project_1.save() - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.private = False - self.test_project_2.save() - # Set status of test_project_3 to archived. - self.test_project_3.status = ProjectStatus.ARCHIVED.value - self.test_project_3.save() - - # Act - response_pub = self.client.get( - self.url, - headers={"Authorization": self.author_session_token}, - query_string={"projectStatuses": [ProjectStatus.PUBLISHED.name]}, - ) - # Assert - self.assertEqual(response_pub.status_code, 200) - self.assertEqual(len(response_pub.json["results"]), 1) - self.assertEqual( - response_pub.json["results"][0]["projectId"], self.test_project_2.id - ) - - # Act - response_draft = self.client.get( - self.url, - headers={"Authorization": self.author_session_token}, - query_string={"projectStatuses": [ProjectStatus.DRAFT.name]}, - ) - # Assert - self.assertEqual(response_draft.status_code, 200) - self.assertEqual(len(response_draft.json["results"]), 1) - self.assertEqual( - response_draft.json["results"][0]["projectId"], self.test_project_1.id - ) - - # Act - response_archived = self.client.get( - self.url, - headers={"Authorization": self.author_session_token}, - query_string={"projectStatuses": [ProjectStatus.ARCHIVED.name]}, - ) - # Assert - self.assertEqual(response_archived.status_code, 200) - self.assertEqual(len(response_archived.json["results"]), 1) - self.assertEqual( - response_archived.json["results"][0]["projectId"], self.test_project_3.id - ) - - # Test multiple statuses returns all projects with those statuses. - # Act - response_all = self.client.get( - self.url, - headers={"Authorization": self.author_session_token}, - query_string={ - "projectStatuses": "PUBLISHED,DRAFT,ARCHIVED", - }, - ) - # Assert - self.assertEqual(response_all.status_code, 200) - self.assertEqual(len(response_all.json["results"]), 3) - self.assertListEqual( - [i["projectId"] for i in response_all.json["results"]], - [self.test_project_1.id, self.test_project_2.id, self.test_project_3.id], - ) - - @staticmethod - def create_cloned_project_with_mapping_types(project_id, author_id, mapping_types): - """ - Create a cloned project with mapping types. - """ - test_project = Project.clone(project_id, author_id) - test_project.mapping_types = mapping_types - test_project.status = ProjectStatus.PUBLISHED.value - test_project.save() - return test_project - - def test_returns_projects_filter_by_mapping_types(self): - """ - Test returns projects filter by mappingTypes. - """ - # Arrange - self.test_project_1.mapping_types = [MappingTypes.BUILDINGS.value] - self.test_project_1.save() - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.mapping_types = [MappingTypes.ROADS.value] - self.test_project_2.private = False - self.test_project_2.save() - # Set mapping type of test_project_3 to waterways. - self.test_project_3.mapping_types = [MappingTypes.WATERWAYS.value] - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - # Create a new project with other mapping type. - - test_project_4 = TestProjectsAllAPI.create_cloned_project_with_mapping_types( - self.test_project_3.id, self.test_author.id, [MappingTypes.LAND_USE.value] - ) - # Create a new project with land use mapping type. - test_project_5 = TestProjectsAllAPI.create_cloned_project_with_mapping_types( - self.test_project_3.id, self.test_author.id, [MappingTypes.OTHER.value] - ) - # Create a new project with all mapping types. - test_project_6 = TestProjectsAllAPI.create_cloned_project_with_mapping_types( - self.test_project_3.id, - self.test_author.id, - [ - MappingTypes.BUILDINGS.value, - MappingTypes.ROADS.value, - MappingTypes.WATERWAYS.value, - MappingTypes.LAND_USE.value, - MappingTypes.OTHER.value, - ], - ) - - # Act - response_buildings = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappingTypes": [MappingTypes.BUILDINGS.name]}, - ) - # Assert - self.assertEqual(response_buildings.status_code, 200) - self.assertEqual(len(response_buildings.json["results"]), 2) - self.assertListEqual( - [i["projectId"] for i in response_buildings.json["results"]], - [self.test_project_1.id, test_project_6.id], - ) - - # Act - response_roads = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappingTypes": [MappingTypes.ROADS.name]}, - ) - # Assert - self.assertEqual(response_roads.status_code, 200) - self.assertEqual(len(response_roads.json["results"]), 2) - self.assertListEqual( - [i["projectId"] for i in response_roads.json["results"]], - [self.test_project_2.id, test_project_6.id], - ) - - # Act - response_waterways = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappingTypes": [MappingTypes.WATERWAYS.name]}, - ) - # Assert - self.assertEqual(response_waterways.status_code, 200) - self.assertEqual(len(response_waterways.json["results"]), 2) - self.assertListEqual( - [i["projectId"] for i in response_waterways.json["results"]], - [self.test_project_3.id, test_project_6.id], - ) - - # Act - response_land_use = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappingTypes": [MappingTypes.LAND_USE.name]}, - ) - # Assert - self.assertEqual(response_land_use.status_code, 200) - self.assertEqual(len(response_land_use.json["results"]), 2) - self.assertListEqual( - [i["projectId"] for i in response_land_use.json["results"]], - [test_project_4.id, test_project_6.id], - ) - - # Act - response_other = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappingTypes": [MappingTypes.OTHER.name]}, - ) - # Assert - self.assertEqual(response_other.status_code, 200) - self.assertEqual(len(response_other.json["results"]), 2) - self.assertListEqual( - [i["projectId"] for i in response_other.json["results"]], - [test_project_5.id, test_project_6.id], - ) - - # Test filter by multiple mapping types returns projects with any of the mapping types in the list. - # Act - response_all = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappingTypes": "BUILDINGS,ROADS,WATERWAYS,LAND_USE,OTHER"}, - ) - # Assert - self.assertEqual(response_all.status_code, 200) - self.assertEqual(len(response_all.json["results"]), 6) - - # Test mappingTypesExact returns only projects with exact mapping types. - # Act - response_exact = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappingTypes": "BUILDINGS", "mappingTypesExact": "true"}, - ) - # Assert - self.assertEqual(response_exact.status_code, 200) - self.assertEqual(len(response_exact.json["results"]), 1) - self.assertEqual( - response_exact.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_projects_filtered_by_organisation(self): - # Arrange - test_org_1 = create_canned_organisation() - test_org_2 = return_canned_organisation(12, "test_org_2", "T2") - test_org_2.create() - - self.test_project_1.organisation_id = test_org_1.id - self.test_project_1.save() - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.private = False - self.test_project_2.organisation_id = test_org_2.id - self.test_project_2.save() - - # Test organisationId filters projects by organisation. - # Act - response_org_id = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"organisationId": test_org_1.id}, - ) - # Assert - self.assertEqual(response_org_id.status_code, 200) - self.assertEqual(len(response_org_id.json["results"]), 1) - self.assertEqual( - response_org_id.json["results"][0]["projectId"], self.test_project_1.id - ) - - # Test organisationName filters projects organisation. - # Act - response_org_name = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"organisationName": test_org_2.name}, - ) - # Assert - self.assertEqual(response_org_name.status_code, 200) - self.assertEqual(len(response_org_name.json["results"]), 1) - self.assertEqual( - response_org_name.json["results"][0]["projectId"], self.test_project_2.id - ) - - def test_returns_projects_filtered_by_campaign(self): - # Arrange - test_campaign_1 = return_canned_campaign(10, "test_campaign_1") - test_campaign_1.create() - test_campaign_2 = return_canned_campaign(12, "test_campaign_2") - test_campaign_2.create() - - campaign_dto = CampaignProjectDTO() - campaign_dto.campaign_id = test_campaign_1.id - campaign_dto.project_id = self.test_project_1.id - CampaignService.create_campaign_project(campaign_dto) - - campaign_dto.campaign_id = test_campaign_2.id - campaign_dto.project_id = self.test_project_2.id - CampaignService.create_campaign_project(campaign_dto) - # Set project_2 to be allowed for all users removing as private. - self.test_project_2.private = False - self.test_project_2.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"campaign": test_campaign_1.name}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_projects_filtered_by_search(self): - # Arrange - self.test_project_1.name = "test_project_1" - self.test_project_1.save() - test_project_4, _ = create_canned_project(name="test_project_4") - test_project_4.status = ProjectStatus.PUBLISHED.value - test_project_4.save() - - # Test text search by project name - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"textSearch": "test_project_4"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - # Since all other projects are named test by default on test_helpers, only project_4 should be returned. - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual(response.json["results"][0]["projectId"], test_project_4.id) - - # Test project search by project Id - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"textSearch": self.test_project_1.id}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_projects_filtered_by_country(self): - # Arrange - self.test_project_1.country = ["England"] - self.test_project_1.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"country": self.test_project_1.country}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_projects_filtering_by_last_updated_param(self): - # Arrange - self.test_project_1.last_updated = datetime.utcnow() - timedelta(minutes=10) - self.test_project_1.save() - self.test_project_2.private = False - self.test_project_2.last_updated = datetime.utcnow() - timedelta(days=2) - self.test_project_2.save() - self.test_project_3.last_updated = datetime.utcnow() - timedelta(days=3) - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - - # Test last updated from filterf returns projects updated after the date - # Act - response_from = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"lastUpdatedFrom": self.test_project_1.last_updated.date()}, - ) - # Assert - self.assertEqual(response_from.status_code, 200) - self.assertEqual(len(response_from.json["results"]), 1) - self.assertEqual( - response_from.json["results"][0]["projectId"], self.test_project_1.id - ) - - # Test last updated from filter returns projects updated before the date - # Act - response_to = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={ - "lastUpdatedTo": (datetime.utcnow() - timedelta(days=1)).date() - }, - ) - # Assert - self.assertEqual(response_to.status_code, 200) - self.assertEqual(len(response_to.json["results"]), 2) - self.assertNotIn( - self.test_project_1.id, - [i["projectId"] for i in response_to.json["results"]], - ) - - def test_returns_projects_filtering_by_last_created_param(self): - # Arrange - self.test_project_1.created = datetime.utcnow() - timedelta(minutes=10) - self.test_project_1.save() - self.test_project_2.private = False - self.test_project_2.created = datetime.utcnow() - timedelta(days=2) - self.test_project_2.save() - self.test_project_3.created = datetime.utcnow() - timedelta(days=3) - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - - # Test created from filter returns projects created after the date - # Act - response_from = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"createdFrom": self.test_project_1.created.date()}, - ) - # Assert - self.assertEqual(response_from.status_code, 200) - self.assertEqual(len(response_from.json["results"]), 1) - self.assertEqual( - response_from.json["results"][0]["projectId"], self.test_project_1.id - ) - - # Test created from filter returns projects created before the date - # Act - response_to = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"createdTo": (datetime.utcnow() - timedelta(days=1)).date()}, - ) - # Assert - self.assertEqual(response_to.status_code, 200) - self.assertEqual(len(response_to.json["results"]), 2) - self.assertNotIn( - self.test_project_1.id, - [i["projectId"] for i in response_to.json["results"]], - ) - - def returns_filtered_projects_by_interests(self): - # Arrange - test_interest_1 = create_canned_interest("test_interest_1") - test_interest_2 = create_canned_interest("test_interest_2") - test_interest_3 = create_canned_interest("test_interest_3") - - InterestService.create_or_update_project_interests( - self.test_project_1.id, [test_interest_1.id, test_interest_2.id] - ) - InterestService.create_or_update_project_interests( - self.test_project_2.id, [test_interest_2.id] - ) - InterestService.create_or_update_project_interests( - self.test_project_3.id, [test_interest_3.id] - ) - - # Make sure all projects can be accessed by the user - self.test_project_2.private = False - self.test_project_2.save() - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - - # Act - # Test filter by single interest returns projects with that interest - response_single = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"interests": test_interest_2.name}, - ) - # Assert - self.assertEqual(response_single.status_code, 200) - self.assertEqual(len(response_single.json["results"]), 1) - self.assertEqual( - response_single.json["results"][0]["projectId"], self.test_project_1.id - ) - - # Test filter by multiple interests returns projects with union of interests provided - # Act - response_multiple = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={ - "interests": f"{test_interest_1.name},{test_interest_2.name}" - }, - ) - # Assert - self.assertEqual(response_multiple.status_code, 200) - self.assertEqual(len(response_multiple.json["results"]), 2) - self.assertNotIn( - self.test_project_3.id, - [i["projectId"] for i in response_multiple.json["results"]], - ) - - def test_returns_projects_created_by_me(self): - # Arrange - self.test_project_1.author_id = self.test_user.id - self.test_project_1.save() - self.test_project_2.private = False - self.test_project_2.save() - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"createdByMe": "true"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_projects_managed_by_me(self): - """ - Test that the endpoint returns projects managed by the user i.e user must have PM role on the project - """ - # Arrange - # test_user is the member of team that has PM role in test_project_1 so it must be returned - test_organisation_1 = return_canned_organisation( - 111, "test_organisation_2", "T2" - ) - test_organisation_1.create() - test_team = return_canned_team("test_team", test_organisation_1.name) - add_user_to_team( - test_team, self.test_user, TeamMemberFunctions.MEMBER.value, True - ) - assign_team_to_project( - self.test_project_1, test_team, TeamRoles.PROJECT_MANAGER.value - ) - - # test_user is the manager of organisation that test_project_2 belongs to so it must be returned - test_organisation_2 = create_canned_organisation() - add_manager_to_organisation(test_organisation_2, self.test_user) - self.test_project_2.organisation_id = test_organisation_2.id - self.test_project_2.private = False - self.test_project_2.save() - - # test_user doesn't have PM role on test_project_3 so it must not be returned - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.organisation_id = test_organisation_1.id - self.test_project_3.save() - - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"managedByMe": "true"}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 2) - self.assertNotIn( - self.test_project_3.id, - [i["projectId"] for i in response.json["results"]], - ) - - def test_returns_all_projects_for_admin_if_managed_by_me_is_true(self): - """ - Test all projects are returned for admin if managedByMe is true - """ - # Arrange - self.test_project_2.private = False - self.test_project_2.save() - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Act - response_admin = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"managedByMe": "true"}, - ) - self.assertEqual(response_admin.status_code, 200) - self.assertEqual(len(response_admin.json["results"]), 3) - - def test_returns_projects_mapped_by_user_if_mapped_by_me_is_true(self): - """ - Test all projects are returned for admin if managedByMe is true - """ - # Arrange - # Make all projects to be accessible for user - self.test_project_2.private = False - self.test_project_2.save() - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - self.test_user.projects_mapped = [self.test_project_1.id] - self.test_user.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"mappedByMe": "true"}, - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_returns_projects_favourited_by_user_if_favourited_by_me_is_true(self): - """ - Test all projects are returned for admin if managedByMe is true - """ - # Arrange - # Make all projects to be accessible for user - self.test_project_2.private = False - self.test_project_2.save() - self.test_project_3.status = ProjectStatus.PUBLISHED.value - self.test_project_3.save() - self.test_user.favorites = [self.test_project_1] - self.test_user.save() - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"favoritedByMe": "true"}, - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) - self.assertEqual( - response.json["results"][0]["projectId"], self.test_project_1.id - ) - - def test_omit_map_results_removes_mao_results_from_response(self): - """ - Test omitMapResults removes map results from response - """ - # Test map_results is not present if omitMapResults is set to true - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"omitMapResults": "true"}, - ) - self.assertEqual(response.status_code, 200) - self.assertListEqual(response.json["mapResults"], []) - - # Test map_results are present if omitMapResults is set to false - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"omitMapResults": "false"}, - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json["mapResults"]["type"], "FeatureCollection") - - -class TestSearchProjectByBBOX(BaseTestCase): - def setUp(self): - super().setUp() - self.url = "/api/v2/projects/queries/bbox/" - self.test_user = return_canned_user(TEST_USER_USERNAME, TEST_USER_ID) - self.test_user.create() - self.test_project_1, self.test_author = create_canned_project() - self.test_project_1.status = ProjectStatus.PUBLISHED.value - self.test_project_1.save() - self.test_project_2, _ = create_canned_project() - self.test_project_2.status = ProjectStatus.PUBLISHED.value - self.test_project_2.save() - self.user_session_token = generate_encoded_token(self.test_user.id) - - def test_returns_401_if_user_not_logged_in(self): - """ - Test 403 is returned if user is not logged in - """ - # Act - response = self.client.get(self.url) - self.assertEqual(response.status_code, 401) - - def test_returns_403_if_user_doesnt_have_PM_role(self): - """ - Test 403 is returned if user is not logged in - """ - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - ) - self.assertEqual(response.status_code, 403) - - def test_returns_400_if_bbox_is_not_valid(self): - """ - Test 400 is returned if bbox is not valid - """ - # Arrange - # This endpoint is only accessible to org managers and admins, so we need to add the user to an organisation. - test_organisation = create_canned_organisation() - add_manager_to_organisation(test_organisation, self.test_user) - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"bbox": "1,2,3,100,200,3", "srid": 4326}, - ) - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "InvalidData") - - def test_returns_400_if_bbox_too_large(self): - """ - Test 400 is returned if bbox is too large - """ - # Arrange - # This endpoint is only accessible to org managers and admins, so we need to add the user to an organisation. - test_organisation = create_canned_organisation() - add_manager_to_organisation(test_organisation, self.test_user) - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - query_string={"bbox": "-17,-30,102,70", "srid": 4326}, - ) - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "BBoxTooBigError") - - def test_returns_projects_within_bbox(self): - """ - Test projects within bbox are returned - """ - # Arrange - # Create a project outside bbox - draft_project_dto = DraftProjectDTO() - draft_project_dto.area_of_interest = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "coordinates": [ - [ - [83.771175, 28.095768], - [83.773586, 28.095757], - [83.773428, 28.094146], - [83.770834, 28.094479], - [83.771175, 28.095768], - ] - ], - "type": "Polygon", - }, - } - ], - } - self.test_project_2.save() - self.test_project_2.set_project_aoi(draft_project_dto) - test_organisation = create_canned_organisation() - add_manager_to_organisation(test_organisation, self.test_user) - # Act - response = self.client.get( - self.url, - headers={ - "Authorization": self.user_session_token, - " Accept-Language": "en", - }, - query_string={ - "bbox": "-3.993530,56.095790,-3.890533,56.129480", - "srid": 4326, - }, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["features"]), 1) - self.assertEqual( - response.json["features"][0]["properties"]["projectId"], - self.test_project_1.id, - ) - - -class TestProjectsQueriesSummaryAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.test_project.private = True - self.test_project.save() - self.url = f"/api/v2/projects/{self.test_project.id}/queries/summary/" - - def test_authentication_is_not_required(self): - """ - Test authentication is not required - """ - # Act - response = self.client.get(self.url) - self.assertEqual(response.status_code, 200) - - def test_returns_404_if_project_doesnt_exist(self): - """ - Test 404 is returned if project doesn't exist - """ - # Act - response = self.client.get("/api/v2/projects/999/queries/summary/") - self.assertEqual(response.status_code, 404) - - def test_project_summary_response(self): - """ - Test project summary response - """ - # Arrange - json_data = get_canned_json("canned_project_detail.json") - project_update_dto = ProjectDTO(json_data) - create_canned_organisation() - self.test_project.update(project_update_dto) - - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response( - response.json, self.test_project, assert_type="summary" - ) - - -class TestProjectsQueriesTouchedAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.test_project.private = False - self.test_project.save() - self.test_project_1, _ = create_canned_project() - self.test_project_1.status = ProjectStatus.PUBLISHED.value - self.test_project_1.save() - task = Task.get(1, self.test_project.id) - task.lock_task_for_validating(self.test_author.id) - task.unlock_task(self.test_author.id, TaskStatus.VALIDATED) - self.test_author.projects_mapped = [self.test_project.id] - self.test_author.save() - self.url = f"/api/v2/projects/queries/{self.test_author.username}/touched/" - - def test_authentication_is_not_required(self): - """ - Test authentication is not required - """ - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["mappedProjects"]), 1) - self.assertEqual( - response.json["mappedProjects"][0]["projectId"], - self.test_project.id, - ) - - def test_returns_404_if_user_doesnt_exist(self): - """ - Test 404 is returned if project doesn't exist - """ - # Act - response = self.client.get("/api/v2/projects/queries/non_existent/touched/") - self.assertEqual(response.status_code, 404) - - -class TestProjectsQueriesPriorityAreasAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.test_project.private = False - self.test_project.save() - self.url = f"/api/v2/projects/{self.test_project.id}/queries/priority-areas/" - - def returns_404_if_project_doesnt_exist(self): - """ - Test 404 is returned if project doesn't exist - """ - # Act - response = self.client.get("/api/v2/projects/999/queries/priority-areas/") - self.assertEqual(response.status_code, 404) - - def test_authentication_is_not_required(self): - """ - Test authentication is not required - """ - # Arrange - json_data = get_canned_json("canned_project_detail.json") - project_update_dto = ProjectDTO(json_data) - create_canned_organisation() - self.test_project.update(project_update_dto) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json), 1) - self.assertDeepAlmostEqual( - response.json[0], json_data["priorityAreas"][0], places=6 - ) - - -class TestProjectsQueriesAoiAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.test_project.private = False - self.test_project.save() - self.url = f"/api/v2/projects/{self.test_project.id}/queries/aoi/" - - def test_returns_404_if_project_doesnt_exist(self): - """ - Test 404 is returned if project doesn't exist - """ - # Act - response = self.client.get("/api/v2/projects/999/queries/aoi/") - self.assertEqual(response.status_code, 404) - - def test_authentication_is_not_required(self): - """ - Test authentication is not required - """ - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, self.test_project.get_aoi_geometry_as_geojson()) - - def test_returns_file_if_as_file_is_true(self): - """ - Test authentication is not required - """ - # Act - response = self.client.get(self.url + "?as_file=true") - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, self.test_project.get_aoi_geometry_as_geojson()) - self.assertEqual(response.headers["Content-Type"], "application/json") - self.assertEqual( - response.headers["Content-Disposition"], - f"attachment; filename={self.test_project.id}.geojson", - ) - - -class TestProjectsQueriesOwnerAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.test_organisation = create_canned_organisation() - # Add organisation to project - self.test_project.organisation = self.test_organisation - self.test_project.save() - self.test_user = return_canned_user(TEST_USER_USERNAME, TEST_USER_ID) - self.test_user.create() - self.user_session_token = generate_encoded_token(self.test_user.id) - self.author_session_token = generate_encoded_token(self.test_author.id) - self.url = "/api/v2/projects/queries/myself/owner/" - - def test_returns_401_if_user_not_logged_in(self): - """ - Test 403 is returned if user is not logged in - """ - # Act - response = self.client.get(self.url) - self.assertEqual(response.status_code, 401) - - def test_returns_403_if_user_doesnt_have_PM_role(self): - """ - Test 403 is returned if user doesn't have PM role - """ - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - ) - self.assertEqual(response.status_code, 403) - - def test_returns_200_if_user_org_manager(self): - """ - Test 200 is returned if user has a project owned - """ - # Add user to organisation so that it has PM role - add_manager_to_organisation(self.test_organisation, self.test_author) - # Act - response = self.client.get( - self.url, headers={"Authorization": self.author_session_token} - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["activeProjects"]), 1) - - -class TestProjectsQueriesNoTasksAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_organisation = create_canned_organisation() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.test_project.organisation = self.test_organisation - self.test_project.save() - self.test_user = return_canned_user(TEST_USER_USERNAME, TEST_USER_ID) - self.test_user.create() - self.user_session_token = generate_encoded_token(self.test_user.id) - self.author_session_token = generate_encoded_token(self.test_author.id) - self.url = f"/api/v2/projects/{self.test_project.id}/queries/notasks/" - - def test_returns_401_if_user_not_logged_in(self): - """ - Test 403 is returned if user is not logged in - """ - # Act - response = self.client.get(self.url) - self.assertEqual(response.status_code, 401) - - def test_returns_403_if_user_doesnt_have_PM_role(self): - """ - Test 403 is returned if user doesn't have PM role - """ - # Act - response = self.client.get( - self.url, - headers={"Authorization": self.user_session_token}, - ) - self.assertEqual(response.status_code, 403) - - def test_returns_404_if_project_doesnt_exist(self): - """ - Test 404 is returned if project doesn't exist - """ - # Act - response = self.client.get( - "/api/v2/projects/999/queries/notasks/", - headers={"Authorization": self.user_session_token}, - ) - self.assertEqual(response.status_code, 404) - - def test_returns_200_for_admin(self): - """ - Test 200 is returned if user is admin - """ - # Authenticated user with that is a admin - # Arrange - self.test_user.role = UserRole.ADMIN.value - self.test_user.save() - # Act - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response( - response.json, self.test_project, assert_type="notasks" - ) - - def test_returns_200_if_user_org_manager(self): - """ - Test 200 is returned if user is org manager - """ - # Arrange - self.test_user.role = UserRole.MAPPER.value # Make sure user role is Mapper - self.test_user.save() - add_manager_to_organisation(self.test_project.organisation, self.test_user) - # Act - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response( - response.json, self.test_project, assert_type="notasks" - ) - - def test_returns_200_if_user_team_member(self): - """ - Test 200 is returned if user is member of team associated with project - """ - # Arrange - # Create a team and add user to it - test_team = create_canned_team() - add_user_to_team( - test_team, self.test_user, TeamMemberFunctions.MEMBER.value, True - ) - # Assign team to project - assign_team_to_project( - self.test_project, test_team, TeamRoles.PROJECT_MANAGER.value - ) - # Act - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - TestGetProjectsRestAPI.assert_project_response( - response.json, self.test_project, assert_type="notasks" - ) - - -class TestProjectQueriesSimilarProjectsAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_project.status = ProjectStatus.PUBLISHED.value - self.test_project.save() - # Since project_info is required to retrun project summary in the response - update_project_with_info(self.test_project) - self.url = f"/api/v2/projects/queries/{self.test_project.id}/similar-projects/" - self.user_session_token = generate_encoded_token(self.test_author.id) - - def create_project(self, status=ProjectStatus.PUBLISHED.value): - project, _ = create_canned_project() - project.status = status - project.save() - return project - - def arrange_projects(self): - # Create test projects - project_1 = self.create_project() - project_2 = self.create_project() - project_3 = self.create_project() - self.create_project(ProjectStatus.DRAFT.value) - # Since project_info is required to retrun project summary in the response - update_project_with_info(project_1) - update_project_with_info(project_2) - update_project_with_info(project_3) - return project_1, project_2, project_3 - - def test_private_projects_are_not_returned_if_user_not_logged_in(self): - """ - Test private projects are not returned if user is not logged in - """ - # Arrange - # Create and arrange test projects - project_1, project_2, project_3 = self.arrange_projects() - project_3.private = True - project_3.save() - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 2) - self.assertEqual(response.json["results"][0]["projectId"], project_2.id) - self.assertEqual(response.json["results"][1]["projectId"], project_1.id) - - def test_returns_404_if_project_doesnt_exist(self): - """ - Test 404 is returned if project doesn't exist - """ - # Act - response = self.client.get( - "/api/v2/projects/queries/999/similar-projects/", - headers={"Authorization": self.user_session_token}, - ) - self.assertEqual(response.status_code, 404) - - def test_returns_private_projects_if_user_is_allowed(self): - """ - Test private projects are returned if user is author of project - """ - # Arrange - # Create and arrange test projects - project_1, project_2, project_3 = self.arrange_projects() - project_3.private = True - project_3.save() - self.test_author.role = UserRole.ADMIN.value - self.test_author.save() - # Act - response = self.client.get( - self.url, headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 3) - returned_project_ids = sorted( - [i["projectId"] for i in response.json["results"]] - ) - self.assertEqual( - returned_project_ids, [project_1.id, project_2.id, project_3.id] - ) - - def test_returns_limit_projects(self): - """ - Test limit is applied to projects returned - """ - # Arrange - # Create and arrange test projects - self.arrange_projects() - # Act - response = self.client.get( - f"{self.url}?limit=1", headers={"Authorization": self.user_session_token} - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.json["results"]), 1) diff --git a/tests/backend/integration/api/projects/test_statistics.py b/tests/backend/integration/api/projects/test_statistics.py deleted file mode 100644 index 150fb00da4..0000000000 --- a/tests/backend/integration/api/projects/test_statistics.py +++ /dev/null @@ -1,99 +0,0 @@ -import time - -from backend.models.postgis.task import Task, TaskStatus -from backend.services.project_admin_service import ProjectAdminService -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import ( - create_canned_project, - generate_encoded_token, -) - - -class TestProjectStatisticsAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.url = f"/api/v2/projects/{self.test_project.id}/statistics/" - - def test_returns_404_if_project_not_found(self): - """Test that 404 is returned if project not found""" - # Act - response = self.client.get("/api/v2/projects/9999999999/statistics/") - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_200_if_project_found(self): - """Test that 200 is returned if project found""" - # Arrange - # Let's reset all tasks to Ready state - ProjectAdminService.reset_all_tasks(self.test_project.id, self.test_author.id) - task = Task.get(1, self.test_project.id) - task.lock_task_for_mapping(self.test_author.id) - time.sleep(3) - task.unlock_task(self.test_author.id, TaskStatus.MAPPED) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json["totalTasks"], 4) - self.assertEqual( - response.json["totalMappingTime"], 3.0 - ) # Since we slept for 3 seconds - self.assertEqual( - response.json["totalTimeSpent"], 3.0 - ) # Since we slept for 3 seconds - # Since we slept for 3 seconds and only 1 task was mapped - self.assertEqual(response.json["averageMappingTime"], 3.0) - self.assertEqual(response.json["timeToFinishMapping"], 12.0) - self.assertEqual( - response.json["timeToFinishValidating"], 0.0 - ) # No tasks were validated - - -class TestProjectsStatisticsQueriesUsernameAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.test_project, self.test_author = create_canned_project() - self.test_author_session_token = generate_encoded_token(self.test_author.id) - self.url = f"/api/v2/projects/{self.test_project.id}/statistics/queries/{self.test_author.username}/" - - def test_returns_404_if_project_not_found(self): - """Test that 404 is returned if project not found""" - # Act - response = self.client.get( - f"/api/v2/projects/9999999999/statistics/queries/{self.test_author.username}/" - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_404_if_username_not_found(self): - """Test that 404 is returned if username not found""" - # Act - response = self.client.get( - f"/api/v2/projects/{self.test_project.id}/statistics/queries/username/" - ) - # Assert - self.assertEqual(response.status_code, 404) - - def test_returns_200_if_project_found(self): - """Test that 200 is returned if project and username found""" - # Arrange - task = Task.get(1, self.test_project.id) - task.lock_task_for_mapping(self.test_author.id) - # Let's sleep for 3 seconds which will be used to calculate time spent - time.sleep(3) - task.unlock_task(self.test_author.id, TaskStatus.MAPPED) - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual( - response.json["timeSpentMapping"], 3.0 - ) # Since we slept for 3 seconds - self.assertEqual( - response.json["timeSpentValidating"], 0.0 - ) # No tasks were validated - self.assertEqual( - response.json["totalTimeSpent"], 3.0 - ) # Since we slept for 3 seconds diff --git a/tests/backend/integration/api/system/__init__.py b/tests/backend/integration/api/system/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/backend/integration/api/system/test_authentication.py b/tests/backend/integration/api/system/test_authentication.py deleted file mode 100644 index 05590e6e0a..0000000000 --- a/tests/backend/integration/api/system/test_authentication.py +++ /dev/null @@ -1,288 +0,0 @@ -from unittest.mock import patch -from urllib import parse - -from oauthlib.oauth2.rfc6749.errors import InvalidGrantError - -from backend import osm -from backend.config import EnvironmentConfig -from backend.services.messaging.message_service import MessageService -from backend.services.messaging.smtp_service import SMTPService -from backend.services.users.authentication_service import AuthenticationService -from backend.services.users.user_service import NotFound, UserService -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import return_canned_user -from tests.backend.integration.api.users.test_resources import ( - USER_NOT_FOUND_MESSAGE, - USER_NOT_FOUND_SUB_CODE, -) - -USERNAME = "test_user" -USER_ID = 1234 -USER_PICTURE = "test_href" -USER_EMAIL = "test_email" - -USER_JSON = { - "user": { - "id": USER_ID, - "display_name": USERNAME, - "changesets": {"count": 0}, - "img": {"href": USER_PICTURE}, - } -} - - -class TestSystemAuthenticationLoginAPI(BaseTestCase): - # Define environment variables for testing so that tests don't fail due to missing env variables - EnvironmentConfig.OAUTH_CLIENT_ID = "test_client_id" - EnvironmentConfig.OAUTH_REDIRECT_URI = "test_redirect_uri" - EnvironmentConfig.OAUTH_SCOPE = "read_prefs write_api" - - def test_get_login_url(self): - """Test correct login url is returned""" - # Arrange - url = "/api/v2/system/authentication/login/" - # Set osm params to test values so that we can assert them later - osm.client_id = EnvironmentConfig.OAUTH_CLIENT_ID - osm.redirect_uri = EnvironmentConfig.OAUTH_REDIRECT_URI - osm.scope = EnvironmentConfig.OAUTH_SCOPE - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertIsNotNone(response.json["auth_url"]) - self.assertIsNotNone(response.json["state"]) - self.assertEqual( - response.json["auth_url"].split("?")[0], - EnvironmentConfig.OSM_SERVER_URL + "/oauth2/authorize", - ) - self.assertEqual( - response.json["auth_url"].split("?")[1].split("&")[0], "response_type=code" - ) - self.assertEqual( - response.json["auth_url"].split("?")[1].split("&")[1], - "client_id=" + EnvironmentConfig.OAUTH_CLIENT_ID, - ) - self.assertEqual( - response.json["auth_url"].split("?")[1].split("&")[2], - "redirect_uri=" + parse.quote_plus(EnvironmentConfig.OAUTH_REDIRECT_URI), - ) - self.assertEqual( - response.json["auth_url"].split("?")[1].split("&")[3], - "scope=" + ("+").join(EnvironmentConfig.OAUTH_SCOPE.split(" ")), - ) - self.assertEqual( - response.json["auth_url"].split("?")[1].split("&")[4], - "state=" + response.json["state"], - ) - - -class TestSystemAuthenticationCallbackAPI(BaseTestCase): - def test_returns_error_if_code_not_passed(self): - url = "/api/v2/system/authentication/callback/" - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "InvalidData") - self.assertEqual(response.json["Error"], "Missing code parameter") - - @patch.object(osm, "fetch_token") - def test_returns_error_if_invalid_grant(self, mock_fetch_token): - mock_fetch_token.side_effect = InvalidGrantError - url = "/api/v2/system/authentication/callback/?code=1234" - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "InvalidGrantError") - self.assertEqual( - response.json["Error"], - "The provided authorization grant is invalid, expired or revoked", - ) - - @patch.object(osm, "fetch_token") - def test_returns_error_if_osm_response_is_none(self, mock_fetch_token): - mock_fetch_token.return_value = None - url = "/api/v2/system/authentication/callback/?code=1234" - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 502) - self.assertEqual(response.json["SubCode"], "TokenFetchError") - self.assertEqual(response.json["Error"], "Couldn't fetch token from OSM.") - - @patch.object(osm, "fetch_token") - @patch.object(osm, "get") - def test_returns_error_if_osm_response_status_code_not_200( - self, mock_get, mock_fetch_token - ): - mock_fetch_token.return_value = "1234" - mock_get.return_value.status_code = 500 - url = "/api/v2/system/authentication/callback/?code=1234" - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 502) - self.assertEqual(response.json["SubCode"], "OSMServiceError") - self.assertEqual( - response.json["Error"], "Couldn't fetch user details from OSM." - ) - - @patch.object(osm, "fetch_token") - @patch.object(osm, "get") - def test_returns_error_if_auth_service_error(self, mock_get, mock_fetch_token): - mock_fetch_token.return_value = "1234" - mock_get.return_value.status_code = 200 - mock_get.return_value.json.return_value = {} - url = "/api/v2/system/authentication/callback/?code=1234" - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 500) - self.assertEqual(response.json["SubCode"], "AuthError") - self.assertEqual(response.json["Error"], "Unable to authenticate") - - @patch.object(MessageService, "send_welcome_message") - @patch.object(osm, "fetch_token") - @patch.object(osm, "get") - def test_returns_user_params_if_no_auth_service_error( - self, mock_get, mock_fetch_token, mock_send_welcome_message - ): - # Arrange - user = return_canned_user(USERNAME, USER_ID) - user.create() - mock_fetch_token.return_value = USER_ID - mock_get.return_value.status_code = 200 - mock_get.return_value.json.return_value = USER_JSON - url = "/api/v2/system/authentication/callback/?code=1234" - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json["username"], user.username) - self.assertEqual(response.json["session"], user.id) - self.assertEqual(response.json["picture"], USER_PICTURE) - mock_send_welcome_message.assert_not_called() - - @patch.object(MessageService, "send_welcome_message") - @patch.object(osm, "fetch_token") - @patch.object(osm, "get") - def test_creates_user_on_login_if_not_exists( - self, mock_get, mock_fetch_token, mock_send_welcome_message - ): - mock_fetch_token.return_value = USER_ID - mock_get.return_value.status_code = 200 - mock_get.return_value.json.return_value = USER_JSON - url = ( - "/api/v2/system/authentication/callback/?code=1234&email_address=test_email" - ) - # Assert - with self.assertRaises(NotFound): - UserService.get_user_by_username( - USERNAME - ) # Should raise NotFound since user doesn't exist - # Act - response = self.client.get(url) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json["username"], USERNAME) - self.assertEqual(response.json["session"], USER_ID) - self.assertEqual(response.json["picture"], USER_PICTURE) - self.assertEqual( - UserService.get_user_by_username(USERNAME).email_address, "test_email" - ) - mock_send_welcome_message.assert_called_once() - - -class TestSystemAuthenticationEmailAPI(BaseTestCase): - def setUp(self): - self.url = "/api/v2/system/authentication/email/" - return super().setUp() - - def test_returns_404_if_user_does_not_exist(self): - # Act - response = self.client.get( - self.url, query_string={"username": "non_existent_user"} - ) - error_details = response.json["error"] - # Assert - self.assertEqual(response.status_code, 404) - self.assertEqual(error_details["sub_code"], USER_NOT_FOUND_SUB_CODE) - self.assertEqual(error_details["message"], USER_NOT_FOUND_MESSAGE) - - def test_returns_403_if_invalid_email_token(self): - # Arrange - user = return_canned_user(USERNAME, USER_ID) - user.create() - # Act - response = self.client.get( - self.url, query_string={"token": "1234", "username": USERNAME} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "BadSignature") - self.assertEqual(response.json["Error"], " Bad Token Signature") - - @patch.object(AuthenticationService, "is_valid_token") - def test_returns_403_if_expired_email_token(self, mock_is_valid_token): - # Arrange - # Since the token is only expired if it's older than 1 day, we need to mock the function to return False - mock_is_valid_token.return_value = (False, "ExpiredToken- Token has expired") - user = return_canned_user(USERNAME, USER_ID) - user.create() - verification_url = SMTPService._generate_email_verification_url( - USER_EMAIL, USERNAME - ) - token = verification_url.split("token=")[1].split("&")[0] - # Act - response = self.client.get( - self.url, query_string={"token": token, "username": USERNAME} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "ExpiredToken") - self.assertEqual(response.json["Error"], " Token has expired") - - def test_returns_403_if_token_and_email_mismatch(self): - # Arrange - user = return_canned_user(USERNAME, USER_ID) - user.email_address = "test_email_2" - user.create() - verification_url = SMTPService._generate_email_verification_url( - USER_EMAIL, USERNAME - ) - token = verification_url.split("token=")[1].split("&")[0] - # Act - response = self.client.get( - self.url, query_string={"token": token, "username": USERNAME} - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "InvalidEmail") - self.assertEqual(response.json["Error"], " Email address does not match token") - - def test_returns_200_if_valid_token(self): - # Arrange - user = return_canned_user(USERNAME, USER_ID) - user.email_address = USER_EMAIL - user.create() - verification_url = SMTPService._generate_email_verification_url( - USER_EMAIL, USERNAME - ) - token = verification_url.split("token=")[1].split("&")[0] - # Assert - User should not have email verified - self.assertEqual( - UserService.get_user_by_username(USERNAME).is_email_verified, False - ) - # Act - response = self.client.get( - self.url, query_string={"token": token, "username": USERNAME} - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual( - UserService.get_user_by_username(USERNAME).email_address, USER_EMAIL - ) - self.assertEqual( - UserService.get_user_by_username(USERNAME).is_email_verified, True - ) diff --git a/tests/backend/integration/api/system/test_banner.py b/tests/backend/integration/api/system/test_banner.py deleted file mode 100644 index 769df98589..0000000000 --- a/tests/backend/integration/api/system/test_banner.py +++ /dev/null @@ -1,64 +0,0 @@ -import base64 - -from backend.services.users.authentication_service import AuthenticationService -from tests.backend.base import BaseTestCase -from tests.backend.helpers.test_helpers import return_canned_user - - -class TestBannerAPI(BaseTestCase): - def setUp(self): - super().setUp() - self.url = "/api/v2/system/banner/" - - def test_get_banner(self): - # Act - response = self.client.get(self.url) - # Assert - self.assertEqual(response.status_code, 200) - # Default banner is created with message "Welcome to the Tasking Manager" and visible=True at first request - self.assertEqual(response.json["message"], "Welcome to the API") - self.assertTrue(response.json["visible"]) - - def test_patch_banner(self): - # Session token is required for this endpoint. So we need to create a user - test_user = return_canned_user() - test_user.create() - session_token = AuthenticationService.generate_session_token_for_user( - test_user.id - ) - session_token = base64.b64encode(session_token.encode("utf-8")) - session_token = "Token " + session_token.decode("utf-8") - banner_message = "### Updated message" - - # Test returns 400 Bad Request for invalid JSON - response = self.client.patch( - self.url, - json={"message": banner_message, "visible": "OK"}, - headers={"Authorization": session_token}, - ) - # Assert - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json["SubCode"], "InvalidData") - - # Test returns 403 Forbidden for non-admin users - response = self.client.patch( - self.url, - json={"message": banner_message, "visible": True}, - headers={"Authorization": session_token}, - ) - # Assert - self.assertEqual(response.status_code, 403) - self.assertEqual(response.json["SubCode"], "OnlyAdminAccess") - - # Test returns 200 OK for admin users - test_user.role = 1 - test_user.save() - response = self.client.patch( - self.url, - json={"message": banner_message, "visible": True}, - headers={"Authorization": session_token}, - ) - # Assert - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json["message"], "