From c9e8135418e4e1e6be67ae28b135fd18ef414db3 Mon Sep 17 00:00:00 2001 From: Adrien Date: Wed, 26 Jul 2023 09:17:28 +0200 Subject: [PATCH] Integration tests (#87) --- .github/workflows/test.yml | 13 +++-- .pre-commit-config.yaml | 4 +- docker-compose.tests.yml | 10 ++++ docker/integration-tests/test_stack.py | 67 ++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 docker/integration-tests/test_stack.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 714ac704..4cfa7676 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,7 +9,7 @@ on: - main jobs: - test-quickstart: + tests: runs-on: ubuntu-latest env: DOCKER_BUILDKIT: 1 @@ -41,7 +41,7 @@ jobs: cache-to: type=registry,ref=opengisch/signalo-django:latest,mode=max tags: opengisch/signalo-django:latest - - name: Setup Compose & run all tests + - name: Setup Compose run: | # copy default conf cp .env.example .env @@ -52,13 +52,20 @@ jobs: # deploy static files and migrate database docker compose exec django python manage.py collectstatic --no-input docker compose exec django python manage.py migrate --no-input + docker-compose exec -T django python manage.py populate_users + docker-compose exec -T django python manage.py populate_vl + docker-compose exec -T django python manage.py populate_signs_poles - # run tests + - name: Run unit tests + run: | docker compose exec django python manage.py test signalo.value_lists docker compose exec django python manage.py test signalo.core docker compose exec django python manage.py test signalo.edge_cases docker compose exec django python manage.py test signalo.roads + - name: Run integration tests + run: docker compose run integration_tests + - name: Failure logs if: failure() run: docker-compose logs diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aa3016db..91cbee54 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: # Remove unused imports/variables - repo: https://github.com/myint/autoflake - rev: v2.0.2 + rev: v2.2.0 hooks: - id: autoflake args: @@ -28,7 +28,7 @@ repos: # Black formatting - repo: https://github.com/psf/black - rev: 23.3.0 + rev: 23.7.0 hooks: - id: black exclude: migrations/ diff --git a/docker-compose.tests.yml b/docker-compose.tests.yml index a40b69e5..81db9062 100644 --- a/docker-compose.tests.yml +++ b/docker-compose.tests.yml @@ -9,3 +9,13 @@ services: - ./docker/conformance-tests/test-run-props.xml:/build/run/test-run-props.xml profiles: - testing + + integration_tests: + image: opengisch/qgis:latest + command: sh -c 'xvfb-run python3 -m unittest discover' + tty: true + volumes: + - ./docker/integration-tests:/integration-tests + working_dir: /integration-tests + profiles: + - testing diff --git a/docker/integration-tests/test_stack.py b/docker/integration-tests/test_stack.py new file mode 100644 index 00000000..a4dae48b --- /dev/null +++ b/docker/integration-tests/test_stack.py @@ -0,0 +1,67 @@ +import requests +from qgis.core import QgsDataSourceUri, QgsFeature, QgsProject, QgsVectorLayer +from qgis.testing import start_app, unittest + +start_app() + +ROOT_URL = "http://django:8000/oapif/" +COLLECTIONS_URL = "http://django:8000/oapif/collections" +POLES_URL = "http://django:8000/oapif/collections/signalo_core.pole" + + +class TestStack(unittest.TestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.project = QgsProject.instance() + cls.user = "admin" + cls.password = "123" + + def test_endpoint_ok(self): + root_response = requests.get(ROOT_URL) + collections_response = requests.get(COLLECTIONS_URL) + poles_response = requests.get(POLES_URL) + + self.assertTrue(root_response.status_code == 200) + self.assertTrue(collections_response.status_code == 200) + self.assertTrue(poles_response.status_code == 200) + + def test_collection_exists(self): + res = requests.get(COLLECTIONS_URL).json() + self.assertTrue( + "signalo_core.pole" + in [collection["id"] for collection in res["collections"]] + ) + + def test_many_poles(self): + poles = requests.get(POLES_URL).json() + self.assertTrue(len(poles) > 1) + + def test_load_layer(self): + uri = QgsDataSourceUri() + uri.setParam("service", "wfs") + uri.setParam("typename", "signalo_core.pole") + uri.setParam("url", ROOT_URL) + layer = QgsVectorLayer(uri.uri(), "pole", "OAPIF") + self.assertTrue(layer.isValid()) + + self.project.addMapLayer(layer) + self.assertTrue(len(self.project.mapLayers().values()) > 0) + + def test_load_with_basic_auth(self): + uri = QgsDataSourceUri() + uri.setParam("service", "wfs") + uri.setParam("typename", "signalo_core.pole") + uri.setParam("url", ROOT_URL) + uri.setPassword(self.password) + uri.setUsername(self.user) + + layer = QgsVectorLayer(uri.uri(), "pole", "OAPIF") + self.assertTrue(layer.isValid()) + layer = self.project.addMapLayer(layer) + self.assertIsNotNone(layer) + + f = None + for f in layer.getFeatures("name='1-1'"): + pass + self.assertIsInstance(f, QgsFeature)