diff --git a/swh/indexer/tests/test_ctags.py b/swh/indexer/tests/test_ctags.py --- a/swh/indexer/tests/test_ctags.py +++ b/swh/indexer/tests/test_ctags.py @@ -3,9 +3,12 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information +import json import unittest - from unittest.mock import patch + +import pytest + from swh.indexer.ctags import ( CtagsIndexer, run_ctags ) @@ -13,7 +16,8 @@ from swh.indexer.tests.test_utils import ( CommonContentIndexerTest, CommonIndexerWithErrorsTest, CommonIndexerNoTool, - SHA1_TO_CTAGS, NoDiskIndexer, BASE_TEST_CONFIG + SHA1_TO_CTAGS, NoDiskIndexer, BASE_TEST_CONFIG, + OBJ_STORAGE_DATA, fill_storage, fill_obj_storage ) @@ -114,31 +118,72 @@ def setUp(self): self.indexer = CtagsIndexerTest() self.idx_storage = self.indexer.idx_storage + fill_storage(self.indexer.storage) + fill_obj_storage(self.indexer.objstorage) # Prepare test input self.id0 = '01c9379dfc33803963d07c1ccc748d3fe4c96bb5' self.id1 = 'd4c647f0fc257591cc9ba1722484229780d1c607' self.id2 = '688a5ef812c53907562fe379d4b3851e69c7cb15' - tool_id = self.indexer.tool['id'] + tool = {k.replace('tool_', ''): v + for (k, v) in self.indexer.tool.items()} + self.expected_results = { self.id0: { 'id': self.id0, - 'indexer_configuration_id': tool_id, - 'ctags': SHA1_TO_CTAGS[self.id0], + 'tool': tool, + **SHA1_TO_CTAGS[self.id0][0], }, self.id1: { 'id': self.id1, - 'indexer_configuration_id': tool_id, - 'ctags': SHA1_TO_CTAGS[self.id1], + 'tool': tool, + **SHA1_TO_CTAGS[self.id1][0], }, self.id2: { 'id': self.id2, - 'indexer_configuration_id': tool_id, - 'ctags': SHA1_TO_CTAGS[self.id2], + 'tool': tool, + **SHA1_TO_CTAGS[self.id2][0], } } + def _set_mocks(self, mock_subprocess, mock_compute_language): + def find_ctags_for_content(raw_content): + for (sha1, ctags) in SHA1_TO_CTAGS.items(): + if OBJ_STORAGE_DATA[sha1] == raw_content: + return ctags + else: + raise ValueError(('%r not found in objstorage, can\'t mock ' + 'its ctags.') % raw_content) + + def fake_language(raw_content, *args, **kwargs): + ctags = find_ctags_for_content(raw_content) + return {'lang': ctags[0]['lang']} + mock_compute_language.side_effect = fake_language + + def fake_subprocess(cmd, *args, **kwargs): + print(cmd) + id_ = cmd[-1] # when using NoDiskIndexer, path is replaced by id + return '\n'.join( + json.dumps({'language': ctag['lang'], **ctag}) + for ctag in SHA1_TO_CTAGS[id_]) + mock_subprocess.check_output.side_effect = fake_subprocess + + @pytest.mark.fs + @patch('swh.indexer.ctags.compute_language') + @patch('swh.indexer.ctags.subprocess') + def test_index(self, mock_subprocess, mock_compute_language): + self._set_mocks(mock_subprocess, mock_compute_language) + super().test_index() + + @pytest.mark.fs + @patch('swh.indexer.ctags.compute_language') + @patch('swh.indexer.ctags.subprocess') + def test_index_one_unknown_sha1( + self, mock_subprocess, mock_compute_language): + self._set_mocks(mock_subprocess, mock_compute_language) + super().test_index() + class CtagsIndexerUnknownToolTestStorage( CommonIndexerNoTool, CtagsIndexerTest):