Repository: dashmug/glue-utils (language: python)

Issue:
Integrate Test Reporter Github action
https://github.com/marketplace/actions/test-reporter


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6e1ca24..782e637 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -55,6 +55,10 @@ jobs:
   tests:
     name: Run tests in Glue container
     runs-on: ubuntu-latest
+    permissions:
+      contents: read
+      actions: read
+      checks: write
     steps:
       - uses: actions/checkout@v4.1.7
         with:
@@ -77,6 +81,13 @@ jobs:
       - name: Run tests in container
         if: steps.diffset.outputs.glue_files
         run: USER_ID=$(id -u) TARGET=coverage docker compose --file docker/docker-compose.yml run --rm glue-utils -c "pytest --cov=glue_utils --cov-report=term --cov-report=xml"
+      - name: Generate test report
+        uses: dorny/test-reporter@v1.9.1
+        if: steps.diffset.outputs.glue_files
+        with:
+          name: Test Report
+          path: test-results/results.xml
+          reporter: java-junit
       - name: SonarCloud Scan
         if: steps.diffset.outputs.glue_files
         uses: SonarSource/sonarcloud-github-action@master
diff --git a/docker/requirements.txt b/docker/requirements.txt
index ba7f616..b198d35 100644
--- a/docker/requirements.txt
+++ b/docker/requirements.txt
@@ -321,25 +321,25 @@ pyyaml==6.0.2 ; python_version >= "3.9" and python_version < "4.0" \
     --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \
     --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \
     --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4
-ruff==0.5.6 ; python_version >= "3.9" and python_version < "4.0" \
-    --hash=sha256:07c9e3c2a8e1fe377dd460371c3462671a728c981c3205a5217291422209f642 \
-    --hash=sha256:111a99cdb02f69ddb2571e2756e017a1496c2c3a2aeefe7b988ddab38b416d36 \
-    --hash=sha256:1f77c1c3aa0669fb230b06fb24ffa3e879391a3ba3f15e3d633a752da5a3e670 \
-    --hash=sha256:4d394940f61f7720ad371ddedf14722ee1d6250fd8d020f5ea5a86e7be217daf \
-    --hash=sha256:563a7ae61ad284187d3071d9041c08019975693ff655438d8d4be26e492760bd \
-    --hash=sha256:57c6c0dd997b31b536bff49b9eee5ed3194d60605a4427f735eeb1f9c1b8d264 \
-    --hash=sha256:80521b88d26a45e871f31e4b88938fd87db7011bb961d8afd2664982dfc3641a \
-    --hash=sha256:94fe60869bfbf0521e04fd62b74cbca21cbc5beb67cbb75ab33fe8c174f54414 \
-    --hash=sha256:a0ef5930799a05522985b9cec8290b185952f3fcd86c1772c3bdbd732667fdcd \
-    --hash=sha256:b652dc14f6ef5d1552821e006f747802cc32d98d5509349e168f6bf0ee9f8f42 \
-    --hash=sha256:c476acb43c3c51e3c614a2e878ee1589655fa02dab19fe2db0423a06d6a5b1b6 \
-    --hash=sha256:c94e084ba3eaa80c2172918c2ca2eb2230c3f15925f4ed8b6297260c6ef179ad \
-    --hash=sha256:d7fe7dccb1a89dc66785d7aa0ac283b2269712d8ed19c63af908fdccca5ccc1a \
-    --hash=sha256:d9bc8f328a9f1309ae80e4d392836e7dbc77303b38ed4a7112699e63d3b066ab \
-    --hash=sha256:e2ff8003f5252fd68425fd53d27c1f08b201d7ed714bb31a55c9ac1d4c13e2eb \
-    --hash=sha256:e395daba77a79f6dc0d07311f94cc0560375ca20c06f354c7c99af3bf4560c5d \
-    --hash=sha256:e6a584c1de6f8591c2570e171cc7ce482bb983d49c70ddf014393cd39e9dfaed \
-    --hash=sha256:f908148c93c02873210a52cad75a6eda856b2cbb72250370ce3afef6fb99b1ed
+ruff==0.5.7 ; python_version >= "3.9" and python_version < "4.0" \
+    --hash=sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be \
+    --hash=sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3 \
+    --hash=sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4 \
+    --hash=sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a \
+    --hash=sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499 \
+    --hash=sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a \
+    --hash=sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb \
+    --hash=sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc \
+    --hash=sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e \
+    --hash=sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5 \
+    --hash=sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5 \
+    --hash=sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf \
+    --hash=sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8 \
+    --hash=sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e \
+    --hash=sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692 \
+    --hash=sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e \
+    --hash=sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e \
+    --hash=sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea
 toml==0.10.2 ; python_version >= "3.9" and python_version < "4.0" \
     --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \
     --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f
diff --git a/poetry.lock b/poetry.lock
index 1894f9f..13d8dca 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -671,29 +671,29 @@ files = [
 
 [[package]]
 name = "ruff"
-version = "0.5.6"
+version = "0.5.7"
 description = "An extremely fast Python linter and code formatter, written in Rust."
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "ruff-0.5.6-py3-none-linux_armv6l.whl", hash = "sha256:a0ef5930799a05522985b9cec8290b185952f3fcd86c1772c3bdbd732667fdcd"},
-    {file = "ruff-0.5.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b652dc14f6ef5d1552821e006f747802cc32d98d5509349e168f6bf0ee9f8f42"},
-    {file = "ruff-0.5.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:80521b88d26a45e871f31e4b88938fd87db7011bb961d8afd2664982dfc3641a"},
-    {file = "ruff-0.5.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9bc8f328a9f1309ae80e4d392836e7dbc77303b38ed4a7112699e63d3b066ab"},
-    {file = "ruff-0.5.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d394940f61f7720ad371ddedf14722ee1d6250fd8d020f5ea5a86e7be217daf"},
-    {file = "ruff-0.5.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111a99cdb02f69ddb2571e2756e017a1496c2c3a2aeefe7b988ddab38b416d36"},
-    {file = "ruff-0.5.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e395daba77a79f6dc0d07311f94cc0560375ca20c06f354c7c99af3bf4560c5d"},
-    {file = "ruff-0.5.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c476acb43c3c51e3c614a2e878ee1589655fa02dab19fe2db0423a06d6a5b1b6"},
-    {file = "ruff-0.5.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2ff8003f5252fd68425fd53d27c1f08b201d7ed714bb31a55c9ac1d4c13e2eb"},
-    {file = "ruff-0.5.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c94e084ba3eaa80c2172918c2ca2eb2230c3f15925f4ed8b6297260c6ef179ad"},
-    {file = "ruff-0.5.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f77c1c3aa0669fb230b06fb24ffa3e879391a3ba3f15e3d633a752da5a3e670"},
-    {file = "ruff-0.5.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f908148c93c02873210a52cad75a6eda856b2cbb72250370ce3afef6fb99b1ed"},
-    {file = "ruff-0.5.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:563a7ae61ad284187d3071d9041c08019975693ff655438d8d4be26e492760bd"},
-    {file = "ruff-0.5.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:94fe60869bfbf0521e04fd62b74cbca21cbc5beb67cbb75ab33fe8c174f54414"},
-    {file = "ruff-0.5.6-py3-none-win32.whl", hash = "sha256:e6a584c1de6f8591c2570e171cc7ce482bb983d49c70ddf014393cd39e9dfaed"},
-    {file = "ruff-0.5.6-py3-none-win_amd64.whl", hash = "sha256:d7fe7dccb1a89dc66785d7aa0ac283b2269712d8ed19c63af908fdccca5ccc1a"},
-    {file = "ruff-0.5.6-py3-none-win_arm64.whl", hash = "sha256:57c6c0dd997b31b536bff49b9eee5ed3194d60605a4427f735eeb1f9c1b8d264"},
-    {file = "ruff-0.5.6.tar.gz", hash = "sha256:07c9e3c2a8e1fe377dd460371c3462671a728c981c3205a5217291422209f642"},
+    {file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"},
+    {file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"},
+    {file = "ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e"},
+    {file = "ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8"},
+    {file = "ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea"},
+    {file = "ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc"},
+    {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692"},
+    {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf"},
+    {file = "ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb"},
+    {file = "ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e"},
+    {file = "ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499"},
+    {file = "ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e"},
+    {file = "ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5"},
+    {file = "ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e"},
+    {file = "ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a"},
+    {file = "ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3"},
+    {file = "ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4"},
+    {file = "ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5"},
 ]
 
 [[package]]
@@ -767,4 +767,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools",
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.9"
-content-hash = "5c07a4aae7c685778d9de9f2226ebe25864f2929b2211eca3ad77d2e3dd47d59"
+content-hash = "f275d55b4ccc00426fad4655cd2f0a5f84da22389f9fc5b44b623b79ab2c32cf"
diff --git a/pyproject.toml b/pyproject.toml
index f911e86..233ee15 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -33,13 +33,13 @@ keywords = [
 
 [tool.poetry.dependencies]
 python = "^3.9"
+ruff = "^0.5.7"
 
 [tool.poetry.group.dev.dependencies]
 pytest-randomly = "^3.15.0"
 pytest-cov = "^5.0.0"
 bumpver = "^2023.1129"
 import-linter = "^2.0"
-ruff = "^0.5.6"
 mypy = "^1.11.1"
 pytest = "^8.3.2"
 pre-commit = "^3.8.0"
@@ -94,7 +94,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
 max-complexity = 5
 
 [tool.ruff.lint.per-file-ignores]
-"test/**" = ["S101", "ANN", "ARG001", "ARG002", "PLR2004", "PLR0913", "PT", "PD", "D"]
+"test/**" = ["S101", "ANN001", "ANN201", "ARG001", "ARG002", "PLR2004", "PLR0913", "D"]
 
 [tool.mypy]
 files = "**/*.py"
@@ -117,6 +117,7 @@ filterwarnings = [
     "ignore::FutureWarning:pyspark.sql.context",
     "ignore::UserWarning:test.test_options",
 ]
+junit_suite_name = "glue_utils"
 
 [tool.coverage.run]
 relative_files = true


Test patch:
diff --git a/test/pyspark/context/conftest.py b/test/pyspark/context/conftest.py
index 8e5e8fd..f4ba747 100644
--- a/test/pyspark/context/conftest.py
+++ b/test/pyspark/context/conftest.py
@@ -12,7 +12,7 @@ def glue_pyspark_context():
     sc.stop()
 
 
-@pytest.fixture
+@pytest.fixture()
 def mock_create_dynamic_frame_from_options(glue_pyspark_context):
     with patch.object(
         glue_pyspark_context,
@@ -23,7 +23,7 @@ def mock_create_dynamic_frame_from_options(glue_pyspark_context):
         yield patched
 
 
-@pytest.fixture
+@pytest.fixture()
 def mock_write_dynamic_frame_from_options(glue_pyspark_context):
     with patch.object(
         glue_pyspark_context,
diff --git a/test/pyspark/context/test_documentdb.py b/test/pyspark/context/test_documentdb.py
index e4479e1..476c3b9 100644
--- a/test/pyspark/context/test_documentdb.py
+++ b/test/pyspark/context/test_documentdb.py
@@ -11,7 +11,7 @@ def test_create_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_documentdb(
             connection_options={
                 "uri": "documentdb_uri",
@@ -50,7 +50,7 @@ def test_write_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_documentdb(
             frame=sentinel.dynamic_frame,
             connection_options={
diff --git a/test/pyspark/context/test_dynamodb.py b/test/pyspark/context/test_dynamodb.py
index eafa222..7bb25f7 100644
--- a/test/pyspark/context/test_dynamodb.py
+++ b/test/pyspark/context/test_dynamodb.py
@@ -11,7 +11,7 @@ def test_create_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_dynamodb(
             connection_options={
                 "dynamodb.input.tableName": "test_source",
@@ -36,7 +36,7 @@ def test_write_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_dynamodb(
             frame=sentinel.dynamic_frame,
             connection_options={
@@ -61,7 +61,7 @@ def test_create_dynamic_frame_using_export(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_dynamodb_export(
             connection_options={
                 "dynamodb.export": "ddb",
diff --git a/test/pyspark/context/test_jdbc.py b/test/pyspark/context/test_jdbc.py
index d300f86..f040f38 100644
--- a/test/pyspark/context/test_jdbc.py
+++ b/test/pyspark/context/test_jdbc.py
@@ -25,7 +25,7 @@ def test_create_dynamic_frame(
         connection_type: str,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         create_dynamic_frame = getattr(
             glue_pyspark_context,
             f"create_dynamic_frame_from_{connection_type}",
@@ -57,7 +57,7 @@ def test_write_dynamic_frame(
         connection_type: str,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         write_dynamic_frame = getattr(
             glue_pyspark_context,
             f"write_dynamic_frame_to_{connection_type}",
@@ -92,7 +92,7 @@ def test_create_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_redshift(
             connection_options=RedshiftJDBCConnectionOptions(
                 url="something",
@@ -123,7 +123,7 @@ def test_write_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_redshift(
             frame=sentinel.dynamic_frame,
             connection_options=RedshiftJDBCConnectionOptions(
diff --git a/test/pyspark/context/test_kafka.py b/test/pyspark/context/test_kafka.py
index 4e563ac..a291f73 100644
--- a/test/pyspark/context/test_kafka.py
+++ b/test/pyspark/context/test_kafka.py
@@ -15,7 +15,7 @@ def test_create_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_kafka(
             connection_options=KafkaSourceConnectionOptions(
                 connectionName="ConfluentKafka",
@@ -44,7 +44,7 @@ def test_write_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_kafka(
             frame=sentinel.dynamic_frame,
             connection_options=KafkaSinkConnectionOptions(
diff --git a/test/pyspark/context/test_kinesis.py b/test/pyspark/context/test_kinesis.py
index 0d254d3..c29f140 100644
--- a/test/pyspark/context/test_kinesis.py
+++ b/test/pyspark/context/test_kinesis.py
@@ -15,7 +15,7 @@ def test_create_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_kinesis(
             connection_options=KinesisSourceConnectionOptions(
                 streamARN="arn:aws:kinesis:us-east-2:777788889999:stream/fromOptionsStream",
@@ -42,7 +42,7 @@ def test_write_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_kinesis(
             frame=sentinel.dynamic_frame,
             connection_options=KinesisSinkConnectionOptions(
diff --git a/test/pyspark/context/test_mongodb.py b/test/pyspark/context/test_mongodb.py
index ebf038d..66bb405 100644
--- a/test/pyspark/context/test_mongodb.py
+++ b/test/pyspark/context/test_mongodb.py
@@ -11,7 +11,7 @@ def test_create_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_mongodb(
             connection_options={
                 "connectionName": "connectionName",
@@ -44,7 +44,7 @@ def test_write_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_mongodb(
             frame=sentinel.dynamic_frame,
             connection_options={
diff --git a/test/pyspark/context/test_opensearch.py b/test/pyspark/context/test_opensearch.py
index 09026b6..08cf307 100644
--- a/test/pyspark/context/test_opensearch.py
+++ b/test/pyspark/context/test_opensearch.py
@@ -11,7 +11,7 @@ def test_create_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_opensearch(
             connection_options={
                 "connectionName": "connectionName",
@@ -36,7 +36,7 @@ def test_write_dynamic_frame(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_opensearch(
             frame=sentinel.dynamic_frame,
             connection_options={
diff --git a/test/pyspark/context/test_s3.py b/test/pyspark/context/test_s3.py
index e7a10f5..892daa9 100644
--- a/test/pyspark/context/test_s3.py
+++ b/test/pyspark/context/test_s3.py
@@ -19,7 +19,7 @@ def test_create_dynamic_frame_from_s3_json(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_s3_json(
             connection_options=S3SourceConnectionOptions(
                 paths=["s3://bucket/key/input-path"]
@@ -44,7 +44,7 @@ def test_create_dynamic_frame_from_s3_parquet(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_s3_parquet(
             connection_options=S3ParquetSourceConnectionOptions(
                 paths=["s3://bucket/key/input-path"],
@@ -70,7 +70,7 @@ def test_create_dynamic_frame_from_s3_csv(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_s3_csv(
             connection_options=S3SourceConnectionOptions(
                 paths=["s3://bucket/key/input-path"]
@@ -100,7 +100,7 @@ def test_create_dynamic_frame_from_s3_xml(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_create_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.create_dynamic_frame_from_s3_xml(
             connection_options=S3SourceConnectionOptions(
                 paths=["s3://bucket/key/input-path"]
@@ -125,7 +125,7 @@ def test_write_dynamic_frame_to_s3_json(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_s3_json(
             frame=sentinel.dynamic_frame,
             connection_options=S3SinkConnectionOptions(
@@ -148,7 +148,7 @@ def test_write_dynamic_frame_to_s3_parquet(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_s3_parquet(
             frame=sentinel.dynamic_frame,
             connection_options=S3SinkConnectionOptions(
@@ -175,7 +175,7 @@ def test_write_dynamic_frame_to_s3_csv(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_s3_csv(
             frame=sentinel.dynamic_frame,
             connection_options=S3SinkConnectionOptions(
@@ -202,7 +202,7 @@ def test_write_dynamic_frame_to_s3_xml(
         self,
         glue_pyspark_context: GluePySparkContext,
         mock_write_dynamic_frame_from_options,
-    ):
+    ) -> None:
         dynamic_frame = glue_pyspark_context.write_dynamic_frame_to_s3_xml(
             frame=sentinel.dynamic_frame,
             connection_options=S3SinkConnectionOptions(
diff --git a/test/pyspark/test_job.py b/test/pyspark/test_job.py
index 7a61da7..f3ed4a9 100644
--- a/test/pyspark/test_job.py
+++ b/test/pyspark/test_job.py
@@ -23,25 +23,25 @@ class MockOptions(BaseOptions):
 class Dummy: ...
 
 
-@pytest.fixture
+@pytest.fixture()
 def mock_get_resolved_options():
     with patch("glue_utils.pyspark.job.getResolvedOptions") as patched:
         yield patched
 
 
-@pytest.fixture
+@pytest.fixture()
 def mock_glue_pyspark_context_cls():
     with patch("glue_utils.pyspark.job.GluePySparkContext") as patched:
         yield patched
 
 
-@pytest.fixture
+@pytest.fixture()
 def mock_job():
     with patch("glue_utils.pyspark.job.Job") as patched:
         yield patched.return_value
 
 
-@pytest.fixture
+@pytest.fixture()
 def glue_pyspark_job(mock_get_resolved_options):
     mock_get_resolved_options.return_value = {
         "JOB_NAME": "test-job",
@@ -52,7 +52,7 @@ def glue_pyspark_job(mock_get_resolved_options):
     job.sc.stop()
 
 
-def assert_glue_context_attributes(glue_context: GlueContext):
+def assert_glue_context_attributes(glue_context: GlueContext) -> None:
     assert isinstance(glue_context, GlueContext)
     assert isinstance(glue_context.spark_session, SparkSession)
     assert isinstance(glue_context.spark_session.sparkContext, SparkContext)
@@ -61,7 +61,7 @@ def assert_glue_context_attributes(glue_context: GlueContext):
 T = TypeVar("T", bound=BaseOptions, default=BaseOptions)
 
 
-def assert_job_attributes(job: GluePySparkJob[T]):
+def assert_job_attributes(job: GluePySparkJob[T]) -> None:
     sc = job.sc
     glue_context = job.glue_context
 
@@ -81,7 +81,9 @@ class TestGluePySparkJob:
             ([], {}),
         ],
     )
-    def test_init(self, args, resolved_options, mock_get_resolved_options, mock_job):
+    def test_init(
+        self, args, resolved_options, mock_get_resolved_options, mock_job
+    ) -> None:
         mock_get_resolved_options.return_value = resolved_options
 
         with patch("sys.argv", ["test.py", *args]):
@@ -100,7 +102,7 @@ def test_init(self, args, resolved_options, mock_get_resolved_options, mock_job)
 
             job.sc.stop()
 
-    def test_init_options_cls(self, mock_get_resolved_options, mock_job):
+    def test_init_options_cls(self, mock_get_resolved_options, mock_job) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
             "OPTION_FROM_CLASS_A": "mock-option",
@@ -126,7 +128,7 @@ def test_init_options_cls(self, mock_get_resolved_options, mock_job):
 
         job.sc.stop()
 
-    def test_init_with_invalid_options_cls(self, mock_get_resolved_options):
+    def test_init_with_invalid_options_cls(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
             "OPTION_FROM_CLASS_A": "mock-option",
@@ -138,7 +140,7 @@ def test_init_with_invalid_options_cls(self, mock_get_resolved_options):
         ):
             GluePySparkJob(options_cls=Dummy)  # type: ignore[type-var]
 
-    def test_init_with_invalid_spark_conf(self, mock_get_resolved_options):
+    def test_init_with_invalid_spark_conf(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
         }
@@ -146,7 +148,7 @@ def test_init_with_invalid_spark_conf(self, mock_get_resolved_options):
         with pytest.raises(TypeError, match="conf must be an instance of SparkConf"):
             GluePySparkJob(spark_conf=Dummy())  # type: ignore[call-overload]
 
-    def test_init_with_spark_conf(self, mock_get_resolved_options):
+    def test_init_with_spark_conf(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
         }
@@ -165,7 +167,7 @@ def test_init_with_partition_options(
         self,
         mock_get_resolved_options,
         mock_glue_pyspark_context_cls,
-    ):
+    ) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
         }
@@ -194,7 +196,7 @@ def test_init_with_log_level(
         level,
         mock_get_resolved_options,
         mock_glue_pyspark_context_cls,
-    ):
+    ) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
         }
@@ -212,7 +214,7 @@ def test_init_with_default_log_level(
         mock_spark_context_cls,
         mock_get_resolved_options,
         mock_glue_pyspark_context_cls,
-    ):
+    ) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
         }
@@ -226,19 +228,21 @@ def test_init_with_default_log_level(
 
 
 class TestGluePySparkJobMethods:
-    def test_managed_glue_context(self, mock_job, glue_pyspark_job):
+    def test_managed_glue_context(self, mock_job, glue_pyspark_job) -> None:
         with glue_pyspark_job.managed_glue_context() as glue_context:
             assert_glue_context_attributes(glue_context)
 
         mock_job.commit.assert_called_once()
 
-    def test_managed_glue_context_without_commit(self, mock_job, glue_pyspark_job):
+    def test_managed_glue_context_without_commit(
+        self, mock_job, glue_pyspark_job
+    ) -> None:
         with glue_pyspark_job.managed_glue_context(commit=False) as glue_context:
             assert_glue_context_attributes(glue_context)
 
         mock_job.commit.assert_not_called()
 
-    def test_commit(self, mock_job, glue_pyspark_job):
+    def test_commit(self, mock_job, glue_pyspark_job) -> None:
         glue_pyspark_job.commit()
 
         mock_job.commit.assert_called_once()
diff --git a/test/test_helpers.py b/test/test_helpers.py
index 1c3d70d..510b600 100644
--- a/test/test_helpers.py
+++ b/test/test_helpers.py
@@ -24,7 +24,7 @@ def test_generate_partitioned_path_with_ordered_dict(
         self,
         partitions,
         expected_path,
-    ):
+    ) -> None:
         assert generate_partitioned_path(partitions) == expected_path
 
     @pytest.mark.parametrize(
@@ -44,6 +44,6 @@ def test_generate_partitioned_path_with_regular_dict(
         self,
         partitions,
         expected_path,
-    ):
+    ) -> None:
         with pytest.warns(UnorderedDictWarning):
             assert generate_partitioned_path(partitions) == expected_path
diff --git a/test/test_options.py b/test/test_options.py
index 42ad401..288fc48 100644
--- a/test/test_options.py
+++ b/test/test_options.py
@@ -9,7 +9,7 @@
 from glue_utils.options import UnsupportedTypeWarning
 
 
-@pytest.fixture
+@pytest.fixture()
 def mock_get_resolved_options():
     with patch("glue_utils.options.getResolvedOptions") as patched:
         yield patched
@@ -31,7 +31,7 @@ def test_from_sys_argv(
         args,
         resolved_options,
         mock_get_resolved_options,
-    ):
+    ) -> None:
         with patch("sys.argv", ["test.py", *args]):
             mock_get_resolved_options.return_value = resolved_options
             options = BaseOptions.from_sys_argv()
@@ -46,7 +46,7 @@ class Options(BaseOptions):
 
 
 class TestOptions:
-    def test_from_sys_argv(self, mock_get_resolved_options):
+    def test_from_sys_argv(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
             "connection_name": "test-connection",
@@ -59,7 +59,7 @@ def test_from_sys_argv(self, mock_get_resolved_options):
         assert options.source_database == "test-source-database"
         assert len(fields(options)) == 2
 
-    def test_missing_options(self, mock_get_resolved_options):
+    def test_missing_options(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "connection_name": "test-connection",
         }
@@ -75,7 +75,7 @@ class NullableOptions(BaseOptions):
 
 
 class TestNullableOptions:
-    def test_from_sys_argv(self, mock_get_resolved_options):
+    def test_from_sys_argv(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
             "connection_name": "test-connection",
@@ -88,7 +88,7 @@ def test_from_sys_argv(self, mock_get_resolved_options):
         assert options.source_database == "test-source-database"
         assert len(fields(options)) == 2
 
-    def test_missing_options(self, mock_get_resolved_options):
+    def test_missing_options(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "connection_name": "test-connection",
         }
@@ -107,7 +107,7 @@ class NullableOptionsWithDefaults(BaseOptions):
 
 
 class TestNullableOptionsWithDefaults:
-    def test_from_sys_argv(self, mock_get_resolved_options):
+    def test_from_sys_argv(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
             "connection_name": "test-connection",
@@ -120,7 +120,7 @@ def test_from_sys_argv(self, mock_get_resolved_options):
         assert options.source_database == "test-source-database"
         assert len(fields(options)) == 2
 
-    def test_missing_options(self, mock_get_resolved_options):
+    def test_missing_options(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
         }
@@ -133,7 +133,7 @@ def test_missing_options(self, mock_get_resolved_options):
 
 
 class TestOptionsWithNonString:
-    def test_warning_for_non_string_fields(self, mock_get_resolved_options):
+    def test_warning_for_non_string_fields(self, mock_get_resolved_options) -> None:
         mock_get_resolved_options.return_value = {
             "JOB_NAME": "test-job",
             "start_timestamp": "1632960000",