From d5a394a4e0b79639eb61269218f4f4d2f6bba057 Mon Sep 17 00:00:00 2001
From: "Antoine R. Dumont (@ardumont)" <antoine.romain.dumont@gmail.com>
Date: Mon, 21 Oct 2019 12:11:06 +0200
Subject: [PATCH] tests.checker: Migrate to pytest

---
 swh/deposit/loader/checker.py                 | 22 ++---
 swh/deposit/tests/conftest.py                 | 11 +++
 swh/deposit/tests/loader/conftest.py          | 22 +++++
 .../1_private_test_1_check                    |  1 +
 .../1_private_test_2_check                    |  3 +
 swh/deposit/tests/loader/test_checker.py      | 81 +++++++------------
 6 files changed, 78 insertions(+), 62 deletions(-)
 create mode 100644 swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_1_check
 create mode 100644 swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_2_check

diff --git a/swh/deposit/loader/checker.py b/swh/deposit/loader/checker.py
index 4f3412e5..a5a1c798 100644
--- a/swh/deposit/loader/checker.py
+++ b/swh/deposit/loader/checker.py
@@ -5,8 +5,12 @@
 
 import logging
 
+from typing import Mapping
 
-from ..client import PrivateApiDepositClient
+from swh.deposit.client import PrivateApiDepositClient
+
+
+logger = logging.getLogger(__name__)
 
 
 class DepositChecker():
@@ -18,16 +22,14 @@ class DepositChecker():
     def __init__(self, client=None):
         super().__init__()
         self.client = client if client else PrivateApiDepositClient()
-        logging_class = '%s.%s' % (self.__class__.__module__,
-                                   self.__class__.__name__)
-        self.log = logging.getLogger(logging_class)
 
-    def check(self, deposit_check_url):
+    def check(self, deposit_check_url: str) -> Mapping[str, str]:
+        status = None
         try:
-            self.client.check(deposit_check_url)
+            r = self.client.check(deposit_check_url)
+            status = 'eventful' if r == 'verified' else 'failed'
         except Exception:
-            self.log.exception("Failure during check on '%s'" % (
+            logger.exception("Failure during check on '%s'" % (
                 deposit_check_url, ))
-            return {'status': 'failed'}
-        else:
-            return {'status': 'eventful'}
+            status = 'failed'
+        return {'status': status}
diff --git a/swh/deposit/tests/conftest.py b/swh/deposit/tests/conftest.py
index e2a60538..f0e04cef 100644
--- a/swh/deposit/tests/conftest.py
+++ b/swh/deposit/tests/conftest.py
@@ -3,6 +3,7 @@
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
+import os
 import base64
 import pytest
 import psycopg2
@@ -35,6 +36,16 @@ TEST_USER = {
 }
 
 
+@pytest.fixture(autouse=True, scope='session')
+def swh_proxy():
+    """Automatically inject this fixture in all tests to ensure no outside
+       connection takes place.
+
+    """
+    os.environ['http_proxy'] = 'http://localhost:999'
+    os.environ['https_proxy'] = 'http://localhost:999'
+
+
 def execute_sql(sql):
     """Execute sql to postgres db"""
     with psycopg2.connect(database='postgres') as conn:
diff --git a/swh/deposit/tests/loader/conftest.py b/swh/deposit/tests/loader/conftest.py
index 49cf6fa7..ec35a8c1 100644
--- a/swh/deposit/tests/loader/conftest.py
+++ b/swh/deposit/tests/loader/conftest.py
@@ -3,8 +3,12 @@
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
+import os
 import pytest
+import yaml
+
 from swh.scheduler.tests.conftest import *  # noqa
+from swh.deposit.loader.checker import DepositChecker
 
 
 @pytest.fixture(scope='session')
@@ -12,3 +16,21 @@ def celery_includes():
     return [
         'swh.deposit.loader.tasks',
     ]
+
+
+@pytest.fixture
+def swh_config(tmp_path, monkeypatch):
+    storage_config = {
+        'url': 'https://deposit.softwareheritage.org/',
+    }
+
+    conffile = os.path.join(tmp_path, 'deposit.yml')
+    with open(conffile, 'w') as f:
+        f.write(yaml.dump(storage_config))
+    monkeypatch.setenv('SWH_CONFIG_FILENAME', conffile)
+    return conffile
+
+
+@pytest.fixture
+def deposit_checker(swh_config):
+    return DepositChecker()
diff --git a/swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_1_check b/swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_1_check
new file mode 100644
index 00000000..7dabf0a8
--- /dev/null
+++ b/swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_1_check
@@ -0,0 +1 @@
+{"status": "verified"}
diff --git a/swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_2_check b/swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_2_check
new file mode 100644
index 00000000..c49c3621
--- /dev/null
+++ b/swh/deposit/tests/loader/data/https_deposit.softwareheritage.org/1_private_test_2_check
@@ -0,0 +1,3 @@
+{
+  "status": "rejected"
+}
diff --git a/swh/deposit/tests/loader/test_checker.py b/swh/deposit/tests/loader/test_checker.py
index 6b45b4c2..86bcb304 100644
--- a/swh/deposit/tests/loader/test_checker.py
+++ b/swh/deposit/tests/loader/test_checker.py
@@ -3,66 +3,43 @@
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
-from rest_framework.test import APITestCase
-
-from swh.deposit.models import Deposit
-from swh.deposit.config import PRIVATE_CHECK_DEPOSIT, DEPOSIT_STATUS_VERIFIED
-from swh.deposit.config import DEPOSIT_STATUS_REJECTED
-from swh.deposit.loader.checker import DepositChecker
 from django.urls import reverse
+from unittest.mock import patch
 
+from swh.deposit.config import PRIVATE_CHECK_DEPOSIT
 
-from .common import SWHDepositTestClient, CLIENT_TEST_CONFIG
-from ..common import BasicTestCase, WithAuthTestCase, CommonCreationRoutine
-from ..common import FileSystemCreationRoutine
-
-
-class DepositCheckerScenarioTest(APITestCase, WithAuthTestCase,
-                                 BasicTestCase, CommonCreationRoutine,
-                                 FileSystemCreationRoutine):
-
-    def setUp(self):
-        super().setUp()
-
-        # 2. Sets a basic client which accesses the test data
-        checker_client = SWHDepositTestClient(client=self.client,
-                                              config=CLIENT_TEST_CONFIG)
-        # 3. setup loader with no persistence and that client
-        self.checker = DepositChecker(client=checker_client)
-
-    def test_check_deposit_ready(self):
-        """Check on a valid 'deposited' deposit should result in 'verified'
 
-        """
-        # 1. create a deposit with archive and metadata
-        deposit_id = self.create_simple_binary_deposit()
-        deposit_id = self.update_binary_deposit(deposit_id,
-                                                status_partial=False)
+def test_check_deposit_ready(
+        swh_config, requests_mock_datadir, deposit_checker):
+    """Check on a valid 'deposited' deposit should result in 'verified'
 
-        args = [self.collection.name, deposit_id]
-        deposit_check_url = reverse(PRIVATE_CHECK_DEPOSIT, args=args)
+    """
+    deposit_check_url = reverse(PRIVATE_CHECK_DEPOSIT, args=['test', 1])
+    actual_result = deposit_checker.check(deposit_check_url=deposit_check_url)
+    assert actual_result == {'status': 'eventful'}
 
-        # when
-        actual_result = self.checker.check(deposit_check_url=deposit_check_url)
-        # then
-        deposit = Deposit.objects.get(pk=deposit_id)
-        self.assertEqual(deposit.status, DEPOSIT_STATUS_VERIFIED)
-        self.assertEqual(actual_result, {'status': 'eventful'})
 
-    def test_check_deposit_rejected(self):
-        """Check on invalid 'deposited' deposit should result in 'rejected'
+def test_check_deposit_rejected(
+        swh_config, requests_mock_datadir, deposit_checker):
+    """Check on invalid 'deposited' deposit should result in 'rejected'
 
-        """
-        # 1. create a deposit with archive and metadata
-        deposit_id = self.create_deposit_with_invalid_archive()
+    """
+    deposit_check_url = reverse(PRIVATE_CHECK_DEPOSIT, args=[
+        'test', 2
+    ])
+    actual_result = deposit_checker.check(deposit_check_url=deposit_check_url)
+    assert actual_result == {'status': 'failed'}
 
-        args = [self.collection.name, deposit_id]
-        deposit_check_url = reverse(PRIVATE_CHECK_DEPOSIT, args=args)
 
-        # when
-        actual_result = self.checker.check(deposit_check_url=deposit_check_url)
+@patch('swh.deposit.client.requests.get')
+def test_check_deposit_rejected_exception(
+        mock_requests, swh_config, deposit_checker):
+    """Check on invalid 'deposited' deposit should result in 'rejected'
 
-        # then
-        deposit = Deposit.objects.get(pk=deposit_id)
-        self.assertEqual(deposit.status, DEPOSIT_STATUS_REJECTED)
-        self.assertEqual(actual_result, {'status': 'eventful'})
+    """
+    mock_requests.side_effect = ValueError('simulated problem when checking')
+    deposit_check_url = reverse(PRIVATE_CHECK_DEPOSIT, args=[
+        'test', 3
+    ])
+    actual_result = deposit_checker.check(deposit_check_url=deposit_check_url)
+    assert actual_result == {'status': 'failed'}
-- 
GitLab