diff --git a/swh/lister/pypi/tests/api_response.html b/swh/lister/pypi/tests/api_response.html
new file mode 100644
index 0000000000000000000000000000000000000000..40ec945020482df97769bc45aba11ebd23c8eda5
--- /dev/null
+++ b/swh/lister/pypi/tests/api_response.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Simple index</title>
+  </head>
+  <body>
+    <a href="/simple/0lever-so/">0lever-so</a>
+    <a href="/simple/0lever-utils/">0lever-utils</a>
+    <a href="/simple/0-orchestrator/">0-orchestrator</a>
+    <a href="/simple/0wned/">0wned</a>
+    </body>
+</html>
\ No newline at end of file
diff --git a/swh/lister/pypi/tests/test_lister.py b/swh/lister/pypi/tests/test_lister.py
new file mode 100644
index 0000000000000000000000000000000000000000..bda21a246e3fecebf033c97bff002019b3c68a84
--- /dev/null
+++ b/swh/lister/pypi/tests/test_lister.py
@@ -0,0 +1,64 @@
+# Copyright (C) 2019 the Software Heritage developers
+# License: GNU General Public License version 3, or any later version
+# See top-level LICENSE file for more information
+
+import requests_mock
+import unittest
+from unittest.mock import patch
+from swh.lister.pypi.lister import PyPILister
+from swh.lister.core.tests.test_lister import HttpSimpleListerTester
+
+lister = PyPILister()
+
+expected_packages = ['0lever-so', '0lever-utils', '0-orchestrator', '0wned']
+
+expected_model = {
+            'uid': 'arrow',
+            'name': 'arrow',
+            'full_name': 'arrow',
+            'html_url': 'https://pypi.org/pypi/arrow/json',
+            'origin_url': 'https://pypi.org/project/arrow/',
+            'origin_type': 'pypi',
+        }
+
+
+class PyPIListerTester(HttpSimpleListerTester, unittest.TestCase):
+    Lister = PyPILister
+    PAGE = 'https://pypi.org/simple/'
+    lister_subdir = 'pypi'
+    good_api_response_file = 'api_response.html'
+    entries = 4
+
+    @requests_mock.Mocker()
+    def test_list_packages(self, http_mocker):
+        """List packages from simple api page should retrieve all packages within
+
+        """
+        http_mocker.get(self.PAGE, text=self.mock_response)
+        fl = self.get_fl()
+        packages = fl.list_packages(self.get_api_response(0))
+
+        for package in expected_packages:
+            assert package in packages
+
+    def test_transport_response_simplified(self):
+        """Test model created by the lister
+
+        """
+        fl = self.get_fl()
+        model = fl.transport_response_simplified(['arrow'])
+        assert len(model) == 1
+        for key, values in model[0].items():
+            assert values == expected_model[key]
+
+    def test_task_dict(self):
+        """Test the task creation of lister
+
+        """
+        with patch('swh.lister.pypi.lister.utils.create_task_dict') as mock_create_tasks:   # noqa
+            lister.task_dict(origin_type='pypi', origin_url='https://abc',
+                             name='test_pack', html_url='https://def')
+
+        mock_create_tasks.assert_called_once_with(
+            'load-pypi', 'recurring', 'test_pack', 'https://abc',
+            project_metadata_url='https://def')