diff --git a/swh/web/tests/api/test_api_lookup.py b/swh/web/tests/api/test_api_lookup.py
index 9decd478..f8ab8ae7 100644
--- a/swh/web/tests/api/test_api_lookup.py
+++ b/swh/web/tests/api/test_api_lookup.py
@@ -1,127 +1,127 @@
# Copyright (C) 2015-2018 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
import unittest
from nose.tools import istest
from swh.web.common.exc import NotFoundExc
from swh.web.api.views import utils
class ApiLookupTestCase(unittest.TestCase):
@istest
def genericapi_lookup_nothing_is_found(self):
# given
def test_generic_lookup_fn(sha1, another_unused_arg):
assert another_unused_arg == 'unused_arg'
assert sha1 == 'sha1'
return None
# when
with self.assertRaises(NotFoundExc) as cm:
utils.api_lookup(
test_generic_lookup_fn, 'sha1', 'unused_arg',
notfound_msg='This will be raised because None is returned.')
- self.assertIn('This will be raised because None is returned.',
- cm.exception.args[0])
+ self.assertIn('This will be raised because None is returned.',
+ cm.exception.args[0])
@istest
def generic_api_map_are_enriched_and_transformed_to_list(self):
# given
def test_generic_lookup_fn_1(criteria0, param0, param1):
assert criteria0 == 'something'
return map(lambda x: x + 1, [1, 2, 3])
# when
actual_result = utils.api_lookup(
test_generic_lookup_fn_1, 'something', 'some param 0',
'some param 1',
notfound_msg=('This is not the error message you are looking for. '
'Move along.'),
enrich_fn=lambda x: x * 2)
self.assertEqual(actual_result, [4, 6, 8])
@istest
def generic_api_list_are_enriched_too(self):
# given
def test_generic_lookup_fn_2(crit):
assert crit == 'something'
return ['a', 'b', 'c']
# when
actual_result = utils.api_lookup(
test_generic_lookup_fn_2, 'something',
notfound_msg=('Not the error message you are looking for, it is. '
'Along, you move!'),
enrich_fn=lambda x: ''. join(['=', x, '=']))
self.assertEqual(actual_result, ['=a=', '=b=', '=c='])
@istest
def generic_api_generator_are_enriched_and_returned_as_list(self):
# given
def test_generic_lookup_fn_3(crit):
assert crit == 'crit'
return (i for i in [4, 5, 6])
# when
actual_result = utils.api_lookup(
test_generic_lookup_fn_3, 'crit',
notfound_msg='Move!',
enrich_fn=lambda x: x - 1)
self.assertEqual(actual_result, [3, 4, 5])
@istest
def generic_api_simple_data_are_enriched_and_returned_too(self):
# given
def test_generic_lookup_fn_4(crit):
assert crit == '123'
return {'a': 10}
def test_enrich_data(x):
x['a'] = x['a'] * 10
return x
# when
actual_result = utils.api_lookup(
test_generic_lookup_fn_4, '123',
notfound_msg='Nothing to do',
enrich_fn=test_enrich_data)
self.assertEqual(actual_result, {'a': 100})
@istest
def api_lookup_not_found(self):
# when
with self.assertRaises(NotFoundExc) as e:
utils.api_lookup(
lambda x: None, 'something',
notfound_msg='this is the error message raised as it is None')
self.assertEqual(e.exception.args[0],
'this is the error message raised as it is None')
@istest
def api_lookup_with_result(self):
# when
actual_result = utils.api_lookup(
lambda x: x + '!', 'something',
notfound_msg='this is the error which won\'t be used here')
self.assertEqual(actual_result, 'something!')
@istest
def api_lookup_with_result_as_map(self):
# when
actual_result = utils.api_lookup(
lambda x: map(lambda y: y+1, x), [1, 2, 3],
notfound_msg='this is the error which won\'t be used here')
self.assertEqual(actual_result, [2, 3, 4])
diff --git a/swh/web/tests/browse/test_utils.py b/swh/web/tests/browse/test_utils.py
index 9038904c..9119a053 100644
--- a/swh/web/tests/browse/test_utils.py
+++ b/swh/web/tests/browse/test_utils.py
@@ -1,397 +1,398 @@
# Copyright (C) 2017-2018 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
# flake8: noqa
import unittest
from unittest.mock import patch
from nose.tools import istest
from swh.web.browse import utils
from swh.web.common.exc import NotFoundExc
from swh.web.common.utils import reverse
from swh.web.tests.testbase import SWHWebTestBase
from .views.data.revision_test_data import revision_history_log_test
class SwhBrowseUtilsTestCase(SWHWebTestBase, unittest.TestCase):
@istest
def get_mimetype_and_encoding_for_content(self):
text = b'Hello world!'
self.assertEqual(utils.get_mimetype_and_encoding_for_content(text),
('text/plain', 'us-ascii'))
@patch('swh.web.browse.utils.get_origin_visits')
@istest
def get_origin_visit(self, mock_origin_visits):
origin_info = {
'id': 2,
'type': 'git',
'url': 'https://github.com/foo/bar',
}
visits = \
[{'status': 'full',
'date': '2015-07-09T21:09:24+00:00',
'visit': 1,
'origin': origin_info['id']
},
{'status': 'full',
'date': '2016-02-23T18:05:23.312045+00:00',
'visit': 2,
'origin': origin_info['id']
},
{'status': 'full',
'date': '2016-03-28T01:35:06.554111+00:00',
'visit': 3,
'origin': origin_info['id']
},
{'status': 'full',
'date': '2016-06-18T01:22:24.808485+00:00',
'visit': 4,
'origin': origin_info['id']
},
{'status': 'full',
'date': '2016-08-14T12:10:00.536702+00:00',
'visit': 5,
'origin': origin_info['id']
}]
mock_origin_visits.return_value = visits
+ visit_id = 12
with self.assertRaises(NotFoundExc) as cm:
- visit_id = 12
visit = utils.get_origin_visit(origin_info,
visit_id=visit_id)
- self.assertIn('Visit with id %s for origin with id %s not found' %
- (origin_info['id'], visit_id),
- cm.exception.args[0])
+ exception_text = cm.exception.args[0]
+ self.assertIn('Visit with id %s' % visit_id, exception_text)
+ self.assertIn('type %s' % origin_info['type'], exception_text)
+ self.assertIn('url %s' % origin_info['url'], exception_text)
visit = utils.get_origin_visit(origin_info, visit_id=2)
self.assertEqual(visit, visits[1])
visit = utils.get_origin_visit(
origin_info, visit_ts='2016-02-23T18:05:23.312045+00:00')
self.assertEqual(visit, visits[1])
visit = utils.get_origin_visit(
origin_info, visit_ts='2016-02-20')
self.assertEqual(visit, visits[1])
visit = utils.get_origin_visit(
origin_info, visit_ts='2016-06-18T01:22')
self.assertEqual(visit, visits[3])
visit = utils.get_origin_visit(
origin_info, visit_ts='2016-06-18 01:22')
self.assertEqual(visit, visits[3])
visit = utils.get_origin_visit(
origin_info, visit_ts=1466208000)
self.assertEqual(visit, visits[3])
visit = utils.get_origin_visit(
origin_info, visit_ts='2014-01-01')
self.assertEqual(visit, visits[0])
visit = utils.get_origin_visit(
origin_info, visit_ts='2018-01-01')
self.assertEqual(visit, visits[-1])
@patch('swh.web.browse.utils.service')
@patch('swh.web.browse.utils.get_origin_visit')
@istest
def get_origin_visit_snapshot(self, mock_get_origin_visit,
mock_service):
mock_get_origin_visit.return_value = \
{'status': 'full',
'date': '2015-08-04T22:26:14.804009+00:00',
'visit': 1,
'origin': 1,
'snapshot': '584b2fe3ce6218a96892e73bd76c2966bbc2a797'}
mock_service.lookup_snapshot.return_value = \
{'branches': {
'refs/heads/master': {
'target': '9fbd21adbac36be869514e82e2e98505dc47219c',
'target_type': 'revision',
'target_url': '/api/1/revision/9fbd21adbac36be869514e82e2e98505dc47219c/'
},
'refs/tags/0.10.0': {
'target': '6072557b6c10cd9a21145781e26ad1f978ed14b9',
'target_type': 'release',
'target_url': '/api/1/release/6072557b6c10cd9a21145781e26ad1f978ed14b9/'
},
'refs/tags/0.10.1': {
'target': 'ecc003b43433e5b46511157598e4857a761007bf',
'target_type': 'release',
'target_url': '/api/1/release/ecc003b43433e5b46511157598e4857a761007bf/'
}
},
'id': '584b2fe3ce6218a96892e73bd76c2966bbc2a797'}
mock_service.lookup_release_multiple.return_value = \
[{'name': '0.10.0',
'message': 'release 0.10.0',
'id': '6072557b6c10cd9a21145781e26ad1f978ed14b9',
'date': '2015-08-04T13:16:54+03:00',
'target_type': 'revision',
'target': 'e9c6243371087d04848b7686888f6dd29dfaef0e'},
{'name': '0.10.1',
'message': 'release 0.10.1',
'id': 'ecc003b43433e5b46511157598e4857a761007bf',
'date': '2017-08-04T13:16:54+03:00',
'target_type': 'revision',
'target': '6072557b6c10cd9a21145781e26ad1f978ed14b9'}]
mock_service.lookup_revision_multiple.return_value = \
[{'date': '2015-08-04T13:16:54+03:00',
'directory': '828da2b80e41aa958b2c98526f4a1d2cc7d298b7',
'id': '9fbd21adbac36be869514e82e2e98505dc47219c',
'message': 'Merge pull request #678 from algernon'},
{'date': '2014-04-10T23:01:11-04:00',
'directory': '2df4cd84ecc65b50b1d5318d3727e02a39b8a4cf',
'id': '6072557b6c10cd9a21145781e26ad1f978ed14b9',
'message': '0.10: The "Oh fuck it\'s PyCon" release\n'},
{'date': '2014-10-10T09:45:23-04:00',
'directory': '28ba64f97ef709e54838ae482c2da2619a74a0bd',
'id': 'ecc003b43433e5b46511157598e4857a761007bf',
'message': '0.10.1\n'}]
expected_result = (
[{'name': 'refs/heads/master',
'message': 'Merge pull request #678 from algernon',
'date': '04 August 2015, 10:16 UTC',
'revision': '9fbd21adbac36be869514e82e2e98505dc47219c',
'directory': '828da2b80e41aa958b2c98526f4a1d2cc7d298b7'}],
[{'name': '0.10.0',
'id': '6072557b6c10cd9a21145781e26ad1f978ed14b9',
'message': 'release 0.10.0',
'date': '04 August 2015, 10:16 UTC',
'target_type': 'revision',
'target': 'e9c6243371087d04848b7686888f6dd29dfaef0e',
'directory': '2df4cd84ecc65b50b1d5318d3727e02a39b8a4cf'},
{'name': '0.10.1',
'id': 'ecc003b43433e5b46511157598e4857a761007bf',
'message': 'release 0.10.1',
'date': '04 August 2017, 10:16 UTC',
'target_type': 'revision',
'target': '6072557b6c10cd9a21145781e26ad1f978ed14b9',
'directory': '28ba64f97ef709e54838ae482c2da2619a74a0bd'}]
)
origin_info = {
'id': 1,
'type': 'git',
'url': 'https://github.com/hylang/hy'
}
origin_visit_branches = \
utils.get_origin_visit_snapshot(origin_info, visit_id=1)
self.assertEqual(origin_visit_branches, expected_result)
@istest
def gen_link(self):
self.assertEqual(utils.gen_link('https://www.softwareheritage.org/', 'SWH'),
'SWH')
@istest
def gen_person_link(self):
person_id = 8221896
person_name = 'Antoine Lambert'
person_url = reverse('browse-person', kwargs={'person_id': person_id})
self.assertEqual(utils.gen_person_link(person_id, person_name),
'%s' % (person_url, person_name))
@istest
def gen_revision_link(self):
revision_id = '28a0bc4120d38a394499382ba21d6965a67a3703'
revision_url = reverse('browse-revision',
kwargs={'sha1_git': revision_id})
self.assertEqual(utils.gen_revision_link(revision_id),
'%s' % (revision_url, revision_id))
self.assertEqual(utils.gen_revision_link(revision_id, shorten_id=True),
'%s' % (revision_url, revision_id[:7]))
@istest
def prepare_revision_log_for_display_no_contex(self):
per_page = 10
first_page_logs_data = revision_history_log_test[:per_page+1]
second_page_logs_data = revision_history_log_test[per_page:2*per_page+1]
third_page_logs_data = revision_history_log_test[2*per_page:3*per_page+1]
last_page_logs_data = revision_history_log_test[3*per_page:3*per_page+5]
revision_log_display_data = utils.prepare_revision_log_for_display(
first_page_logs_data, per_page, None)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(first_page_logs_data,
per_page))
self.assertEqual(revision_log_display_data['prev_rev'],
first_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
first_page_logs_data[0]['id'])
self.assertEqual(revision_log_display_data['next_rev'], None)
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
None)
old_prev_revs_bc = str(revision_log_display_data['prev_revs_breadcrumb'])
revision_log_display_data = utils.prepare_revision_log_for_display(
second_page_logs_data, per_page, old_prev_revs_bc)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(second_page_logs_data,
per_page))
self.assertEqual(revision_log_display_data['prev_rev'],
second_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
old_prev_revs_bc + '/' + second_page_logs_data[0]['id'])
self.assertEqual(revision_log_display_data['next_rev'],
old_prev_revs_bc)
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
None)
old_prev_revs_bc = str(revision_log_display_data['prev_revs_breadcrumb'])
revision_log_display_data = utils.prepare_revision_log_for_display(
third_page_logs_data, per_page, old_prev_revs_bc)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(third_page_logs_data, per_page))
self.assertEqual(revision_log_display_data['prev_rev'],
third_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
old_prev_revs_bc + '/' + third_page_logs_data[0]['id'])
self.assertEqual(revision_log_display_data['next_rev'],
old_prev_revs_bc.split('/')[-1])
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
'/'.join(old_prev_revs_bc.split('/')[:-1]))
old_prev_revs_bc = str(revision_log_display_data['prev_revs_breadcrumb'])
revision_log_display_data = utils.prepare_revision_log_for_display(
last_page_logs_data, per_page, old_prev_revs_bc)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(last_page_logs_data, per_page))
self.assertEqual(revision_log_display_data['prev_rev'],
None)
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
None)
self.assertEqual(revision_log_display_data['next_rev'], old_prev_revs_bc.split('/')[-1])
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
'/'.join(old_prev_revs_bc.split('/')[:-1]))
@istest
def prepare_revision_log_for_display_snapshot_context(self):
per_page = 10
first_page_logs_data = revision_history_log_test[:per_page+1]
second_page_logs_data = revision_history_log_test[per_page:2*per_page+1]
third_page_logs_data = revision_history_log_test[2*per_page:3*per_page+1]
last_page_logs_data = revision_history_log_test[3*per_page:3*per_page+5]
snapshot_context = {
'origin_info': {'type': 'git',
'url': 'https://github.com/git/git'},
'url_args': {},
'query_params': {}
}
revision_log_display_data = utils.prepare_revision_log_for_display(
first_page_logs_data, per_page, None, snapshot_context=snapshot_context)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(first_page_logs_data,
per_page, snapshot_context=snapshot_context))
self.assertEqual(revision_log_display_data['prev_rev'],
first_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
first_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['next_rev'], None)
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
None)
old_prev_revs_bc = str(revision_log_display_data['prev_revs_breadcrumb'])
revision_log_display_data = utils.prepare_revision_log_for_display(
second_page_logs_data, per_page, old_prev_revs_bc, snapshot_context=snapshot_context)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(second_page_logs_data,
per_page, snapshot_context=snapshot_context))
self.assertEqual(revision_log_display_data['prev_rev'],
second_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
old_prev_revs_bc + '/' + second_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['next_rev'],
old_prev_revs_bc)
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
None)
old_prev_revs_bc = str(revision_log_display_data['prev_revs_breadcrumb'])
revision_log_display_data = utils.prepare_revision_log_for_display(
third_page_logs_data, per_page, old_prev_revs_bc, snapshot_context=snapshot_context)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(third_page_logs_data, per_page,
snapshot_context=snapshot_context))
self.assertEqual(revision_log_display_data['prev_rev'],
third_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
old_prev_revs_bc + '/' + third_page_logs_data[-1]['id'])
self.assertEqual(revision_log_display_data['next_rev'],
old_prev_revs_bc.split('/')[-1])
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
'/'.join(old_prev_revs_bc.split('/')[:-1]))
old_prev_revs_bc = str(revision_log_display_data['prev_revs_breadcrumb'])
revision_log_display_data = utils.prepare_revision_log_for_display(
last_page_logs_data, per_page, old_prev_revs_bc, snapshot_context=snapshot_context)
self.assertEqual(revision_log_display_data['revision_log_data'],
utils._format_log_entries(last_page_logs_data, per_page,
snapshot_context=snapshot_context))
self.assertEqual(revision_log_display_data['prev_rev'],
None)
self.assertEqual(revision_log_display_data['prev_revs_breadcrumb'],
None)
self.assertEqual(revision_log_display_data['next_rev'], old_prev_revs_bc.split('/')[-1])
self.assertEqual(revision_log_display_data['next_revs_breadcrumb'],
'/'.join(old_prev_revs_bc.split('/')[:-1]))
diff --git a/swh/web/tests/common/test_query.py b/swh/web/tests/common/test_query.py
index 06d37dd9..4345415d 100644
--- a/swh/web/tests/common/test_query.py
+++ b/swh/web/tests/common/test_query.py
@@ -1,142 +1,142 @@
# Copyright (C) 2015-2018 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
import unittest
from unittest.mock import patch
from nose.tools import istest
from swh.model import hashutil
from swh.web.common import query
from swh.web.common.exc import BadInputExc
class QueryTestCase(unittest.TestCase):
@istest
def parse_hash_malformed_query_with_more_than_2_parts(self):
with self.assertRaises(BadInputExc):
query.parse_hash('sha1:1234567890987654:other-stuff')
@istest
def parse_hash_guess_sha1(self):
h = 'f1d2d2f924e986ac86fdf7b36c94bcdf32beec15'
r = query.parse_hash(h)
self.assertEquals(r, ('sha1', hashutil.hash_to_bytes(h)))
@istest
def parse_hash_guess_sha256(self):
h = '084C799CD551DD1D8D5C5F9A5D593B2' \
'E931F5E36122ee5c793c1d08a19839cc0'
r = query.parse_hash(h)
self.assertEquals(r, ('sha256', hashutil.hash_to_bytes(h)))
@istest
def parse_hash_guess_algo_malformed_hash(self):
with self.assertRaises(BadInputExc):
query.parse_hash('1234567890987654')
@istest
def parse_hash_check_sha1(self):
h = 'f1d2d2f924e986ac86fdf7b36c94bcdf32beec15'
r = query.parse_hash('sha1:' + h)
self.assertEquals(r, ('sha1', hashutil.hash_to_bytes(h)))
@istest
def parse_hash_check_sha1_git(self):
h = 'e1d2d2f924e986ac86fdf7b36c94bcdf32beec15'
r = query.parse_hash('sha1_git:' + h)
self.assertEquals(r, ('sha1_git', hashutil.hash_to_bytes(h)))
@istest
def parse_hash_check_sha256(self):
h = '084C799CD551DD1D8D5C5F9A5D593B2E931F5E36122ee5c793c1d08a19839cc0'
r = query.parse_hash('sha256:' + h)
self.assertEquals(r, ('sha256', hashutil.hash_to_bytes(h)))
@istest
def parse_hash_check_algo_malformed_sha1_hash(self):
with self.assertRaises(BadInputExc):
query.parse_hash('sha1:1234567890987654')
@istest
def parse_hash_check_algo_malformed_sha1_git_hash(self):
with self.assertRaises(BadInputExc):
query.parse_hash('sha1_git:1234567890987654')
@istest
def parse_hash_check_algo_malformed_sha256_hash(self):
with self.assertRaises(BadInputExc):
query.parse_hash('sha256:1234567890987654')
@istest
def parse_hash_check_algo_unknown_one(self):
with self.assertRaises(BadInputExc):
query.parse_hash('sha2:1234567890987654')
@patch('swh.web.common.query.parse_hash')
@istest
def parse_hash_with_algorithms_or_throws_bad_query(self, mock_hash):
# given
mock_hash.side_effect = BadInputExc('Error input')
# when
with self.assertRaises(BadInputExc) as cm:
query.parse_hash_with_algorithms_or_throws(
'sha1:blah',
['sha1'],
'useless error message for this use case')
- self.assertIn('Error input', cm.exception.args[0])
+ self.assertIn('Error input', cm.exception.args[0])
mock_hash.assert_called_once_with('sha1:blah')
@patch('swh.web.common.query.parse_hash')
@istest
def parse_hash_with_algorithms_or_throws_bad_algo(self, mock_hash):
# given
mock_hash.return_value = 'sha1', '123'
# when
with self.assertRaises(BadInputExc) as cm:
query.parse_hash_with_algorithms_or_throws(
'sha1:431',
['sha1_git'],
'Only sha1_git!')
- self.assertIn('Only sha1_git!', cm.exception.args[0])
+ self.assertIn('Only sha1_git!', cm.exception.args[0])
mock_hash.assert_called_once_with('sha1:431')
@patch('swh.web.common.query.parse_hash')
@istest
def parse_hash_with_algorithms(self, mock_hash):
# given
mock_hash.return_value = ('sha256', b'123')
# when
algo, sha = query.parse_hash_with_algorithms_or_throws(
'sha256:123',
['sha256', 'sha1_git'],
'useless error message for this use case')
self.assertEquals(algo, 'sha256')
self.assertEquals(sha, b'123')
mock_hash.assert_called_once_with('sha256:123')
@istest
def parse_uuid4(self):
# when
actual_uuid = query.parse_uuid4('7c33636b-8f11-4bda-89d9-ba8b76a42cec')
# then
self.assertEquals(actual_uuid, '7c33636b-8f11-4bda-89d9-ba8b76a42cec')
@istest
def parse_uuid4_ko(self):
# when
with self.assertRaises(BadInputExc) as cm:
query.parse_uuid4('7c33636b-8f11-4bda-89d9-ba8b76a42')
- self.assertIn('badly formed hexadecimal UUID string',
- cm.exception.args[0])
+ self.assertIn('badly formed hexadecimal UUID string',
+ cm.exception.args[0])
diff --git a/swh/web/tests/common/test_service.py b/swh/web/tests/common/test_service.py
index e1d669fa..d0c00e54 100644
--- a/swh/web/tests/common/test_service.py
+++ b/swh/web/tests/common/test_service.py
@@ -1,2080 +1,2084 @@
# Copyright (C) 2015-2018 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
import datetime
import unittest
from nose.tools import istest
from unittest.mock import MagicMock, patch, call
from swh.model.hashutil import hash_to_bytes, hash_to_hex
from swh.web.common import service
from swh.web.common.exc import BadInputExc, NotFoundExc
class ServiceTestCase(unittest.TestCase):
def setUp(self):
self.BLAKE2S256_SAMPLE = ('685395c5dc57cada459364f0946d3dd45b'
'ad5fcbabc1048edb44380f1d31d0aa')
self.BLAKE2S256_SAMPLE_BIN = hash_to_bytes(self.BLAKE2S256_SAMPLE)
self.SHA1_SAMPLE = '40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03'
self.SHA1_SAMPLE_BIN = hash_to_bytes(self.SHA1_SAMPLE)
self.SHA256_SAMPLE = ('8abb0aa566452620ecce816eecdef4792d77a'
'293ad8ea82a4d5ecb4d36f7e560')
self.SHA256_SAMPLE_BIN = hash_to_bytes(self.SHA256_SAMPLE)
self.SHA1GIT_SAMPLE = '25d1a2e8f32937b0f498a5ca87f823d8df013c01'
self.SHA1GIT_SAMPLE_BIN = hash_to_bytes(self.SHA1GIT_SAMPLE)
self.DIRECTORY_ID = '7834ef7e7c357ce2af928115c6c6a42b7e2a44e6'
self.DIRECTORY_ID_BIN = hash_to_bytes(self.DIRECTORY_ID)
self.AUTHOR_ID_BIN = {
'name': b'author',
'email': b'author@company.org',
}
self.AUTHOR_ID = {
'name': 'author',
'email': 'author@company.org',
}
self.COMMITTER_ID_BIN = {
'name': b'committer',
'email': b'committer@corp.org',
}
self.COMMITTER_ID = {
'name': 'committer',
'email': 'committer@corp.org',
}
self.SAMPLE_DATE_RAW = {
'timestamp': datetime.datetime(
2000, 1, 17, 11, 23, 54,
tzinfo=datetime.timezone.utc,
).timestamp(),
'offset': 0,
'negative_utc': False,
}
self.SAMPLE_DATE = '2000-01-17T11:23:54+00:00'
self.SAMPLE_MESSAGE_BIN = b'elegant fix for bug 31415957'
self.SAMPLE_MESSAGE = 'elegant fix for bug 31415957'
self.SAMPLE_REVISION = {
'id': self.SHA1_SAMPLE,
'directory': self.DIRECTORY_ID,
'author': self.AUTHOR_ID,
'committer': self.COMMITTER_ID,
'message': self.SAMPLE_MESSAGE,
'date': self.SAMPLE_DATE,
'committer_date': self.SAMPLE_DATE,
'synthetic': False,
'type': 'git',
'parents': [],
'metadata': {},
'merge': False
}
self.SAMPLE_REVISION_RAW = {
'id': self.SHA1_SAMPLE_BIN,
'directory': self.DIRECTORY_ID_BIN,
'author': self.AUTHOR_ID_BIN,
'committer': self.COMMITTER_ID_BIN,
'message': self.SAMPLE_MESSAGE_BIN,
'date': self.SAMPLE_DATE_RAW,
'committer_date': self.SAMPLE_DATE_RAW,
'synthetic': False,
'type': 'git',
'parents': [],
'metadata': [],
}
self.SAMPLE_CONTENT = {
'checksums': {
'blake2s256': self.BLAKE2S256_SAMPLE,
'sha1': self.SHA1_SAMPLE,
'sha256': self.SHA256_SAMPLE,
'sha1_git': self.SHA1GIT_SAMPLE,
},
'length': 190,
'status': 'absent'
}
self.SAMPLE_CONTENT_RAW = {
'blake2s256': self.BLAKE2S256_SAMPLE_BIN,
'sha1': self.SHA1_SAMPLE_BIN,
'sha256': self.SHA256_SAMPLE_BIN,
'sha1_git': self.SHA1GIT_SAMPLE_BIN,
'length': 190,
'status': 'hidden'
}
self.date_origin_visit1 = datetime.datetime(
2015, 1, 1, 22, 0, 0,
tzinfo=datetime.timezone.utc)
self.origin_visit1 = {
'date': self.date_origin_visit1,
'origin': 1,
'visit': 1
}
@patch('swh.web.common.service.storage')
@istest
def lookup_multiple_hashes_ball_missing(self, mock_storage):
# given
mock_storage.content_missing_per_sha1 = MagicMock(return_value=[])
# when
actual_lookup = service.lookup_multiple_hashes(
[{'filename': 'a',
'sha1': '456caf10e9535160d90e874b45aa426de762f19f'},
{'filename': 'b',
'sha1': '745bab676c8f3cec8016e0c39ea61cf57e518865'}])
# then
self.assertEquals(actual_lookup, [
{'filename': 'a',
'sha1': '456caf10e9535160d90e874b45aa426de762f19f',
'found': True},
{'filename': 'b',
'sha1': '745bab676c8f3cec8016e0c39ea61cf57e518865',
'found': True}
])
@patch('swh.web.common.service.storage')
@istest
def lookup_multiple_hashes_some_missing(self, mock_storage):
# given
mock_storage.content_missing_per_sha1 = MagicMock(return_value=[
hash_to_bytes('456caf10e9535160d90e874b45aa426de762f19f')
])
# when
actual_lookup = service.lookup_multiple_hashes(
[{'filename': 'a',
'sha1': '456caf10e9535160d90e874b45aa426de762f19f'},
{'filename': 'b',
'sha1': '745bab676c8f3cec8016e0c39ea61cf57e518865'}])
# then
self.assertEquals(actual_lookup, [
{'filename': 'a',
'sha1': '456caf10e9535160d90e874b45aa426de762f19f',
'found': False},
{'filename': 'b',
'sha1': '745bab676c8f3cec8016e0c39ea61cf57e518865',
'found': True}
])
@patch('swh.web.common.service.storage')
@istest
def lookup_hash_does_not_exist(self, mock_storage):
# given
mock_storage.content_find = MagicMock(return_value=None)
# when
actual_lookup = service.lookup_hash(
'sha1_git:123caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEquals({'found': None,
'algo': 'sha1_git'}, actual_lookup)
# check the function has been called with parameters
mock_storage.content_find.assert_called_with(
{'sha1_git':
hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')})
@patch('swh.web.common.service.storage')
@istest
def lookup_hash_exist(self, mock_storage):
# given
stub_content = {
'sha1': hash_to_bytes(
'456caf10e9535160d90e874b45aa426de762f19f')
}
mock_storage.content_find = MagicMock(return_value=stub_content)
# when
actual_lookup = service.lookup_hash(
'sha1:456caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEquals({'found': stub_content,
'algo': 'sha1'}, actual_lookup)
mock_storage.content_find.assert_called_with(
{'sha1':
hash_to_bytes('456caf10e9535160d90e874b45aa426de762f19f')}
)
@patch('swh.web.common.service.storage')
@istest
def search_hash_does_not_exist(self, mock_storage):
# given
mock_storage.content_find = MagicMock(return_value=None)
# when
actual_lookup = service.search_hash(
'sha1_git:123caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEquals({'found': False}, actual_lookup)
# check the function has been called with parameters
mock_storage.content_find.assert_called_with(
{'sha1_git':
hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')})
@patch('swh.web.common.service.storage')
@istest
def search_hash_exist(self, mock_storage):
# given
stub_content = {
'sha1': hash_to_bytes(
'456caf10e9535160d90e874b45aa426de762f19f')
}
mock_storage.content_find = MagicMock(return_value=stub_content)
# when
actual_lookup = service.search_hash(
'sha1:456caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEquals({'found': True}, actual_lookup)
mock_storage.content_find.assert_called_with(
{'sha1':
hash_to_bytes('456caf10e9535160d90e874b45aa426de762f19f')},
)
@patch('swh.web.common.service.idx_storage')
@istest
def lookup_content_ctags(self, mock_idx_storage):
# given
mock_idx_storage.content_ctags_get = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'line': 100,
'name': 'hello',
'kind': 'function',
'tool_name': 'ctags',
'tool_version': 'some-version',
}])
expected_ctags = [{
'id': '123caf10e9535160d90e874b45aa426de762f19f',
'line': 100,
'name': 'hello',
'kind': 'function',
'tool_name': 'ctags',
'tool_version': 'some-version',
}]
# when
actual_ctags = list(service.lookup_content_ctags(
'sha1:123caf10e9535160d90e874b45aa426de762f19f'))
# then
self.assertEqual(actual_ctags, expected_ctags)
mock_idx_storage.content_ctags_get.assert_called_with(
[hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')])
@patch('swh.web.common.service.idx_storage')
@istest
def lookup_content_ctags_no_hash(self, mock_idx_storage):
# given
mock_idx_storage.content_ctags_get = MagicMock(return_value=[])
# when
actual_ctags = list(service.lookup_content_ctags(
'sha1:123caf10e9535160d90e874b45aa426de762f19f'))
# then
self.assertEqual(actual_ctags, [])
@patch('swh.web.common.service.idx_storage')
@istest
def lookup_content_filetype(self, mock_idx_storage):
# given
mock_idx_storage.content_mimetype_get = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'mimetype': b'text/x-c++',
'encoding': b'us-ascii',
}])
expected_filetype = {
'id': '123caf10e9535160d90e874b45aa426de762f19f',
'mimetype': 'text/x-c++',
'encoding': 'us-ascii',
}
# when
actual_filetype = service.lookup_content_filetype(
'sha1:123caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEqual(actual_filetype, expected_filetype)
mock_idx_storage.content_mimetype_get.assert_called_with(
[hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')])
@patch('swh.web.common.service.idx_storage')
@patch('swh.web.common.service.storage')
@istest
def lookup_content_filetype_2(self, mock_storage, mock_idx_storage):
# given
mock_storage.content_find = MagicMock(
return_value={
'sha1': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f')
}
)
mock_idx_storage.content_mimetype_get = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'mimetype': b'text/x-python',
'encoding': b'us-ascii',
}]
)
expected_filetype = {
'id': '123caf10e9535160d90e874b45aa426de762f19f',
'mimetype': 'text/x-python',
'encoding': 'us-ascii',
}
# when
actual_filetype = service.lookup_content_filetype(
'sha1_git:456caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEqual(actual_filetype, expected_filetype)
mock_storage.content_find(
'sha1_git', hash_to_bytes(
'456caf10e9535160d90e874b45aa426de762f19f')
)
mock_idx_storage.content_mimetype_get.assert_called_with(
[hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')])
@patch('swh.web.common.service.idx_storage')
@istest
def lookup_content_language(self, mock_idx_storage):
# given
mock_idx_storage.content_language_get = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'lang': 'python',
}])
expected_language = {
'id': '123caf10e9535160d90e874b45aa426de762f19f',
'lang': 'python',
}
# when
actual_language = service.lookup_content_language(
'sha1:123caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEqual(actual_language, expected_language)
mock_idx_storage.content_language_get.assert_called_with(
[hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')])
@patch('swh.web.common.service.idx_storage')
@patch('swh.web.common.service.storage')
@istest
def lookup_content_language_2(self, mock_storage, mock_idx_storage):
# given
mock_storage.content_find = MagicMock(
return_value={
'sha1': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f')
}
)
mock_idx_storage.content_language_get = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'lang': 'haskell',
}]
)
expected_language = {
'id': '123caf10e9535160d90e874b45aa426de762f19f',
'lang': 'haskell',
}
# when
actual_language = service.lookup_content_language(
'sha1_git:456caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEqual(actual_language, expected_language)
mock_storage.content_find(
'sha1_git', hash_to_bytes(
'456caf10e9535160d90e874b45aa426de762f19f')
)
mock_idx_storage.content_language_get.assert_called_with(
[hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')])
@patch('swh.web.common.service.idx_storage')
@istest
def lookup_expression(self, mock_idx_storage):
# given
mock_idx_storage.content_ctags_search = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'name': 'foobar',
'kind': 'variable',
'lang': 'C',
'line': 10
}])
expected_ctags = [{
'sha1': '123caf10e9535160d90e874b45aa426de762f19f',
'name': 'foobar',
'kind': 'variable',
'lang': 'C',
'line': 10
}]
# when
actual_ctags = list(service.lookup_expression(
'foobar', last_sha1='hash', per_page=10))
# then
self.assertEqual(actual_ctags, expected_ctags)
mock_idx_storage.content_ctags_search.assert_called_with(
'foobar', last_sha1='hash', limit=10)
@patch('swh.web.common.service.idx_storage')
@istest
def lookup_expression_no_result(self, mock_idx_storage):
# given
mock_idx_storage.content_ctags_search = MagicMock(
return_value=[])
expected_ctags = []
# when
actual_ctags = list(service.lookup_expression(
'barfoo', last_sha1='hash', per_page=10))
# then
self.assertEqual(actual_ctags, expected_ctags)
mock_idx_storage.content_ctags_search.assert_called_with(
'barfoo', last_sha1='hash', limit=10)
@patch('swh.web.common.service.idx_storage')
@istest
def lookup_content_license(self, mock_idx_storage):
# given
mock_idx_storage.content_fossology_license_get = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'lang': 'python',
}])
expected_license = {
'id': '123caf10e9535160d90e874b45aa426de762f19f',
'lang': 'python',
}
# when
actual_license = service.lookup_content_license(
'sha1:123caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEqual(actual_license, expected_license)
mock_idx_storage.content_fossology_license_get.assert_called_with(
[hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')])
@patch('swh.web.common.service.idx_storage')
@patch('swh.web.common.service.storage')
@istest
def lookup_content_license_2(self, mock_storage, mock_idx_storage):
# given
mock_storage.content_find = MagicMock(
return_value={
'sha1': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f')
}
)
mock_idx_storage.content_fossology_license_get = MagicMock(
return_value=[{
'id': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'lang': 'haskell',
}]
)
expected_license = {
'id': '123caf10e9535160d90e874b45aa426de762f19f',
'lang': 'haskell',
}
# when
actual_license = service.lookup_content_license(
'sha1_git:456caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEqual(actual_license, expected_license)
mock_storage.content_find(
'sha1_git', hash_to_bytes(
'456caf10e9535160d90e874b45aa426de762f19f')
)
mock_idx_storage.content_fossology_license_get.assert_called_with(
[hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')])
@patch('swh.web.common.service.storage')
@istest
def lookup_content_provenance(self, mock_storage):
# given
mock_storage.content_find_provenance = MagicMock(
return_value=(p for p in [{
'content': hash_to_bytes(
'123caf10e9535160d90e874b45aa426de762f19f'),
'revision': hash_to_bytes(
'456caf10e9535160d90e874b45aa426de762f19f'),
'origin': 100,
'visit': 1,
'path': b'octavio-3.4.0/octave.html/doc_002dS_005fISREG.html'
}]))
expected_provenances = [{
'content': '123caf10e9535160d90e874b45aa426de762f19f',
'revision': '456caf10e9535160d90e874b45aa426de762f19f',
'origin': 100,
'visit': 1,
'path': 'octavio-3.4.0/octave.html/doc_002dS_005fISREG.html'
}]
# when
actual_provenances = service.lookup_content_provenance(
'sha1_git:123caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertEqual(list(actual_provenances), expected_provenances)
mock_storage.content_find_provenance.assert_called_with(
{'sha1_git':
hash_to_bytes('123caf10e9535160d90e874b45aa426de762f19f')})
@patch('swh.web.common.service.storage')
@istest
def lookup_content_provenance_not_found(self, mock_storage):
# given
mock_storage.content_find_provenance = MagicMock(return_value=None)
# when
actual_provenances = service.lookup_content_provenance(
'sha1_git:456caf10e9535160d90e874b45aa426de762f19f')
# then
self.assertIsNone(actual_provenances)
mock_storage.content_find_provenance.assert_called_with(
{'sha1_git':
hash_to_bytes('456caf10e9535160d90e874b45aa426de762f19f')})
@patch('swh.web.common.service.storage')
@istest
def stat_counters(self, mock_storage):
# given
input_stats = {
"content": 1770830,
"directory": 211683,
"directory_entry_dir": 209167,
"directory_entry_file": 1807094,
"directory_entry_rev": 0,
"entity": 0,
"entity_history": 0,
"occurrence": 0,
"occurrence_history": 19600,
"origin": 1096,
"person": 0,
"release": 8584,
"revision": 7792,
"revision_history": 0,
"skipped_content": 0
}
mock_storage.stat_counters = MagicMock(return_value=input_stats)
# when
actual_stats = service.stat_counters()
# then
expected_stats = input_stats
self.assertEqual(actual_stats, expected_stats)
mock_storage.stat_counters.assert_called_with()
@patch('swh.web.common.service._lookup_origin_visits')
@istest
def lookup_origin_visits(self, mock_lookup_visits):
# given
date_origin_visit2 = datetime.datetime(
2013, 7, 1, 20, 0, 0,
tzinfo=datetime.timezone.utc)
date_origin_visit3 = datetime.datetime(
2015, 1, 1, 21, 0, 0,
tzinfo=datetime.timezone.utc)
stub_result = [self.origin_visit1, {
'date': date_origin_visit2,
'origin': 1,
'visit': 2,
'target': hash_to_bytes(
'65a55bbdf3629f916219feb3dcc7393ded1bc8db'),
'branch': b'master',
'target_type': 'release',
'metadata': None,
}, {
'date': date_origin_visit3,
'origin': 1,
'visit': 3
}]
mock_lookup_visits.return_value = stub_result
# when
expected_origin_visits = [{
'date': self.origin_visit1['date'].isoformat(),
'origin': self.origin_visit1['origin'],
'visit': self.origin_visit1['visit']
}, {
'date': date_origin_visit2.isoformat(),
'origin': 1,
'visit': 2,
'target': '65a55bbdf3629f916219feb3dcc7393ded1bc8db',
'branch': 'master',
'target_type': 'release',
'metadata': {},
}, {
'date': date_origin_visit3.isoformat(),
'origin': 1,
'visit': 3
}]
actual_origin_visits = service.lookup_origin_visits(6)
# then
self.assertEqual(list(actual_origin_visits), expected_origin_visits)
mock_lookup_visits.assert_called_once_with(
6, last_visit=None, limit=10)
@patch('swh.web.common.service.storage')
@istest
def lookup_origin_visit(self, mock_storage):
# given
stub_result = self.origin_visit1
mock_storage.origin_visit_get_by.return_value = stub_result
expected_origin_visit = {
'date': self.origin_visit1['date'].isoformat(),
'origin': self.origin_visit1['origin'],
'visit': self.origin_visit1['visit']
}
# when
actual_origin_visit = service.lookup_origin_visit(1, 1)
# then
self.assertEqual(actual_origin_visit, expected_origin_visit)
mock_storage.origin_visit_get_by.assert_called_once_with(1, 1)
@patch('swh.web.common.service.storage')
@istest
def lookup_origin(self, mock_storage):
# given
mock_storage.origin_get = MagicMock(return_value={
'id': 'origin-id',
'lister': 'uuid-lister',
'project': 'uuid-project',
'url': 'ftp://some/url/to/origin',
'type': 'ftp'})
# when
actual_origin = service.lookup_origin({'id': 'origin-id'})
# then
self.assertEqual(actual_origin, {'id': 'origin-id',
'lister': 'uuid-lister',
'project': 'uuid-project',
'url': 'ftp://some/url/to/origin',
'type': 'ftp'})
mock_storage.origin_get.assert_called_with({'id': 'origin-id'})
@patch('swh.web.common.service.storage')
@istest
def lookup_release_ko_id_checksum_not_ok_because_not_a_sha1(self,
mock_storage):
# given
mock_storage.release_get = MagicMock()
with self.assertRaises(BadInputExc) as cm:
# when
service.lookup_release('not-a-sha1')
- self.assertIn('invalid checksum', cm.exception.args[0])
+ self.assertIn('invalid checksum', cm.exception.args[0].lower())
mock_storage.release_get.called = False
@patch('swh.web.common.service.storage')
@istest
def lookup_release_ko_id_checksum_ok_but_not_a_sha1(self, mock_storage):
# given
mock_storage.release_get = MagicMock()
# when
with self.assertRaises(BadInputExc) as cm:
service.lookup_release(
'13c1d34d138ec13b5ebad226dc2528dc7506c956e4646f62d4daf5'
'1aea892abe')
- self.assertIn('sha1_git supported', cm.exception.args[0])
+ self.assertEqual('Only sha1_git is supported.', cm.exception.args[0])
mock_storage.release_get.called = False
@patch('swh.web.common.service.storage')
@istest
def lookup_directory_with_path_not_found(self, mock_storage):
# given
mock_storage.lookup_directory_with_path = MagicMock(return_value=None)
sha1_git = '65a55bbdf3629f916219feb3dcc7393ded1bc8db'
# when
actual_directory = mock_storage.lookup_directory_with_path(
sha1_git, 'some/path/here')
self.assertIsNone(actual_directory)
@patch('swh.web.common.service.storage')
@istest
def lookup_directory_with_path_found(self, mock_storage):
# given
sha1_git = '65a55bbdf3629f916219feb3dcc7393ded1bc8db'
entry = {'id': 'dir-id',
'type': 'dir',
'name': 'some/path/foo'}
mock_storage.lookup_directory_with_path = MagicMock(return_value=entry)
# when
actual_directory = mock_storage.lookup_directory_with_path(
sha1_git, 'some/path/here')
self.assertEqual(entry, actual_directory)
@patch('swh.web.common.service.storage')
@istest
def lookup_release(self, mock_storage):
# given
mock_storage.release_get = MagicMock(return_value=[{
'id': hash_to_bytes('65a55bbdf3629f916219feb3dcc7393ded1bc8db'),
'target': None,
'date': {
'timestamp': datetime.datetime(
2015, 1, 1, 22, 0, 0,
tzinfo=datetime.timezone.utc).timestamp(),
'offset': 0,
'negative_utc': True,
},
'name': b'v0.0.1',
'message': b'synthetic release',
'synthetic': True,
}])
# when
actual_release = service.lookup_release(
'65a55bbdf3629f916219feb3dcc7393ded1bc8db')
# then
self.assertEqual(actual_release, {
'id': '65a55bbdf3629f916219feb3dcc7393ded1bc8db',
'target': None,
'date': '2015-01-01T22:00:00-00:00',
'name': 'v0.0.1',
'message': 'synthetic release',
'synthetic': True,
})
mock_storage.release_get.assert_called_with(
[hash_to_bytes('65a55bbdf3629f916219feb3dcc7393ded1bc8db')])
@istest
def lookup_revision_with_context_ko_not_a_sha1_1(self):
# given
sha1_git = '13c1d34d138ec13b5ebad226dc2528dc7506c956e4646f62d4' \
'daf51aea892abe'
sha1_git_root = '65a55bbdf3629f916219feb3dcc7393ded1bc8db'
# when
with self.assertRaises(BadInputExc) as cm:
service.lookup_revision_with_context(sha1_git_root, sha1_git)
- self.assertIn('Only sha1_git is supported', cm.exception.args[0])
+ self.assertIn('Only sha1_git is supported', cm.exception.args[0])
@istest
def lookup_revision_with_context_ko_not_a_sha1_2(self):
# given
sha1_git_root = '65a55bbdf3629f916219feb3dcc7393ded1bc8db'
sha1_git = '13c1d34d138ec13b5ebad226dc2528dc7506c956e4646f6' \
'2d4daf51aea892abe'
# when
with self.assertRaises(BadInputExc) as cm:
service.lookup_revision_with_context(sha1_git_root, sha1_git)
- self.assertIn('Only sha1_git is supported', cm.exception.args[0])
+ self.assertIn('Only sha1_git is supported', cm.exception.args[0])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_with_context_ko_sha1_git_does_not_exist(
self,
mock_storage):
# given
sha1_git_root = '65a55bbdf3629f916219feb3dcc7393ded1bc8db'
sha1_git = '777777bdf3629f916219feb3dcc7393ded1bc8db'
sha1_git_bin = hash_to_bytes(sha1_git)
mock_storage.revision_get.return_value = None
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_revision_with_context(sha1_git_root, sha1_git)
- self.assertIn('Revision 777777bdf3629f916219feb3dcc7393ded1bc8db'
- ' not found', cm.exception.args[0])
+ self.assertIn('Revision 777777bdf3629f916219feb3dcc7393ded1bc8db'
+ ' not found', cm.exception.args[0])
mock_storage.revision_get.assert_called_once_with(
[sha1_git_bin])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_with_context_ko_root_sha1_git_does_not_exist(
self,
mock_storage):
# given
sha1_git_root = '65a55bbdf3629f916219feb3dcc7393ded1bc8db'
sha1_git = '777777bdf3629f916219feb3dcc7393ded1bc8db'
sha1_git_root_bin = hash_to_bytes(sha1_git_root)
sha1_git_bin = hash_to_bytes(sha1_git)
mock_storage.revision_get.side_effect = ['foo', None]
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_revision_with_context(sha1_git_root, sha1_git)
- self.assertIn('Revision 65a55bbdf3629f916219feb3dcc7393ded1bc8db'
- ' not found', cm.exception.args[0])
+ self.assertIn('Revision root 65a55bbdf3629f916219feb3dcc7393ded1bc8db'
+ ' not found', cm.exception.args[0])
mock_storage.revision_get.assert_has_calls([call([sha1_git_bin]),
call([sha1_git_root_bin])])
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_revision_with_context(self, mock_query, mock_storage):
# given
sha1_git_root = '666'
sha1_git = '883'
sha1_git_root_bin = b'666'
sha1_git_bin = b'883'
sha1_git_root_dict = {
'id': sha1_git_root_bin,
'parents': [b'999'],
}
sha1_git_dict = {
'id': sha1_git_bin,
'parents': [],
'directory': b'278',
}
stub_revisions = [
sha1_git_root_dict,
{
'id': b'999',
'parents': [b'777', b'883', b'888'],
},
{
'id': b'777',
'parents': [b'883'],
},
sha1_git_dict,
{
'id': b'888',
'parents': [b'889'],
},
{
'id': b'889',
'parents': [],
},
]
# inputs ok
mock_query.parse_hash_with_algorithms_or_throws.side_effect = [
('sha1', sha1_git_bin),
('sha1', sha1_git_root_bin)
]
# lookup revision first 883, then 666 (both exists)
mock_storage.revision_get.return_value = [
sha1_git_dict,
sha1_git_root_dict
]
mock_storage.revision_log = MagicMock(
return_value=stub_revisions)
# when
actual_revision = service.lookup_revision_with_context(
sha1_git_root,
sha1_git)
# then
self.assertEquals(actual_revision, {
'id': hash_to_hex(sha1_git_bin),
'parents': [],
'children': [hash_to_hex(b'999'), hash_to_hex(b'777')],
'directory': hash_to_hex(b'278'),
'merge': False
})
mock_query.parse_hash_with_algorithms_or_throws.assert_has_calls(
[call(sha1_git, ['sha1'], 'Only sha1_git is supported.'),
call(sha1_git_root, ['sha1'], 'Only sha1_git is supported.')])
mock_storage.revision_log.assert_called_with(
[sha1_git_root_bin], 100)
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_revision_with_context_sha1_git_root_already_retrieved_as_dict(
self, mock_query, mock_storage):
# given
sha1_git = '883'
sha1_git_root_bin = b'666'
sha1_git_bin = b'883'
sha1_git_root_dict = {
'id': sha1_git_root_bin,
'parents': [b'999'],
}
sha1_git_dict = {
'id': sha1_git_bin,
'parents': [],
'directory': b'278',
}
stub_revisions = [
sha1_git_root_dict,
{
'id': b'999',
'parents': [b'777', b'883', b'888'],
},
{
'id': b'777',
'parents': [b'883'],
},
sha1_git_dict,
{
'id': b'888',
'parents': [b'889'],
},
{
'id': b'889',
'parents': [],
},
]
# inputs ok
mock_query.parse_hash_with_algorithms_or_throws.return_value = (
'sha1', sha1_git_bin)
# lookup only on sha1
mock_storage.revision_get.return_value = [sha1_git_dict]
mock_storage.revision_log.return_value = stub_revisions
# when
actual_revision = service.lookup_revision_with_context(
{'id': sha1_git_root_bin},
sha1_git)
# then
self.assertEquals(actual_revision, {
'id': hash_to_hex(sha1_git_bin),
'parents': [],
'children': [hash_to_hex(b'999'), hash_to_hex(b'777')],
'directory': hash_to_hex(b'278'),
'merge': False
})
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with( # noqa
sha1_git, ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([sha1_git_bin])
mock_storage.revision_log.assert_called_with(
[sha1_git_root_bin], 100)
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_with_revision_ko_revision_not_found(self,
mock_query,
mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = ('sha1',
b'123')
mock_storage.revision_get.return_value = None
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_directory_with_revision('123')
- self.assertIn('Revision 123 not found', cm.exception.args[0])
+ self.assertIn('Revision 123 not found', cm.exception.args[0])
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with
('123', ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([b'123'])
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_with_revision_ko_revision_with_path_to_nowhere(
self,
mock_query,
mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = ('sha1',
b'123')
dir_id = b'dir-id-as-sha1'
mock_storage.revision_get.return_value = [{
'directory': dir_id,
}]
mock_storage.directory_entry_get_by_path.return_value = None
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_directory_with_revision(
'123',
'path/to/something/unknown')
- self.assertIn("Directory/File 'path/to/something/unknown' " +
- "pointed to by revision 123 not found",
- cm.exception.args[0])
+ exception_text = cm.exception.args[0].lower()
+ self.assertIn('directory or file', exception_text)
+ self.assertIn('path/to/something/unknown', exception_text)
+ self.assertIn('revision 123', exception_text)
+ self.assertIn('not found', exception_text)
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with
('123', ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([b'123'])
mock_storage.directory_entry_get_by_path.assert_called_once_with(
b'dir-id-as-sha1', [b'path', b'to', b'something', b'unknown'])
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_with_revision_ko_type_not_implemented(
self,
mock_query,
mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = ('sha1',
b'123')
dir_id = b'dir-id-as-sha1'
mock_storage.revision_get.return_value = [{
'directory': dir_id,
}]
mock_storage.directory_entry_get_by_path.return_value = {
'type': 'rev',
'name': b'some/path/to/rev',
'target': b'456'
}
stub_content = {
'id': b'12',
'type': 'file'
}
mock_storage.content_get.return_value = stub_content
# when
with self.assertRaises(NotImplementedError) as cm:
service.lookup_directory_with_revision(
'123',
'some/path/to/rev')
- self.assertIn("Entity of type 'rev' not implemented.",
- cm.exception.args[0])
+ self.assertIn("Entity of type rev not implemented.",
+ cm.exception.args[0])
# then
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with
('123', ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([b'123'])
mock_storage.directory_entry_get_by_path.assert_called_once_with(
b'dir-id-as-sha1', [b'some', b'path', b'to', b'rev'])
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_with_revision_revision_without_path(self,
mock_query,
mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = ('sha1',
b'123')
dir_id = b'dir-id-as-sha1'
mock_storage.revision_get.return_value = [{
'directory': dir_id,
}]
stub_dir_entries = [{
'id': b'123',
'type': 'dir'
}, {
'id': b'456',
'type': 'file'
}]
mock_storage.directory_ls.return_value = stub_dir_entries
# when
actual_directory_entries = service.lookup_directory_with_revision(
'123')
self.assertEqual(actual_directory_entries['type'], 'dir')
self.assertEqual(list(actual_directory_entries['content']),
stub_dir_entries)
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with
('123', ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([b'123'])
mock_storage.directory_ls.assert_called_once_with(dir_id)
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_with_revision_revision_with_path_to_dir(self,
mock_query,
mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = ('sha1',
b'123')
dir_id = b'dir-id-as-sha1'
mock_storage.revision_get.return_value = [{
'directory': dir_id,
}]
stub_dir_entries = [{
'id': b'12',
'type': 'dir'
}, {
'id': b'34',
'type': 'file'
}]
mock_storage.directory_entry_get_by_path.return_value = {
'type': 'dir',
'name': b'some/path',
'target': b'456'
}
mock_storage.directory_ls.return_value = stub_dir_entries
# when
actual_directory_entries = service.lookup_directory_with_revision(
'123',
'some/path')
self.assertEqual(actual_directory_entries['type'], 'dir')
self.assertEqual(actual_directory_entries['revision'], '123')
self.assertEqual(actual_directory_entries['path'], 'some/path')
self.assertEqual(list(actual_directory_entries['content']),
stub_dir_entries)
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with
('123', ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([b'123'])
mock_storage.directory_entry_get_by_path.assert_called_once_with(
dir_id,
[b'some', b'path'])
mock_storage.directory_ls.assert_called_once_with(b'456')
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_with_revision_revision_with_path_to_file_without_data(
self,
mock_query,
mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = ('sha1',
b'123')
dir_id = b'dir-id-as-sha1'
mock_storage.revision_get.return_value = [{
'directory': dir_id,
}]
mock_storage.directory_entry_get_by_path.return_value = {
'type': 'file',
'name': b'some/path/to/file',
'target': b'789'
}
stub_content = {
'status': 'visible',
}
mock_storage.content_find.return_value = stub_content
# when
actual_content = service.lookup_directory_with_revision(
'123',
'some/path/to/file')
# then
self.assertEqual(actual_content, {'type': 'file',
'revision': '123',
'path': 'some/path/to/file',
'content': stub_content})
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with
('123', ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([b'123'])
mock_storage.directory_entry_get_by_path.assert_called_once_with(
b'dir-id-as-sha1', [b'some', b'path', b'to', b'file'])
mock_storage.content_find.assert_called_once_with({'sha1_git': b'789'})
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_with_revision_revision_with_path_to_file_with_data(
self,
mock_query,
mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = ('sha1',
b'123')
dir_id = b'dir-id-as-sha1'
mock_storage.revision_get.return_value = [{
'directory': dir_id,
}]
mock_storage.directory_entry_get_by_path.return_value = {
'type': 'file',
'name': b'some/path/to/file',
'target': b'789'
}
stub_content = {
'status': 'visible',
'sha1': b'content-sha1'
}
mock_storage.content_find.return_value = stub_content
mock_storage.content_get.return_value = [{
'sha1': b'content-sha1',
'data': b'some raw data'
}]
expected_content = {
'status': 'visible',
'checksums': {
'sha1': hash_to_hex(b'content-sha1'),
},
'data': b'some raw data'
}
# when
actual_content = service.lookup_directory_with_revision(
'123',
'some/path/to/file',
with_data=True)
# then
self.assertEqual(actual_content, {'type': 'file',
'revision': '123',
'path': 'some/path/to/file',
'content': expected_content})
mock_query.parse_hash_with_algorithms_or_throws.assert_called_once_with
('123', ['sha1'], 'Only sha1_git is supported.')
mock_storage.revision_get.assert_called_once_with([b'123'])
mock_storage.directory_entry_get_by_path.assert_called_once_with(
b'dir-id-as-sha1', [b'some', b'path', b'to', b'file'])
mock_storage.content_find.assert_called_once_with({'sha1_git': b'789'})
mock_storage.content_get.assert_called_once_with([b'content-sha1'])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision(self, mock_storage):
# given
mock_storage.revision_get = MagicMock(
return_value=[self.SAMPLE_REVISION_RAW])
# when
actual_revision = service.lookup_revision(
self.SHA1_SAMPLE)
# then
self.assertEqual(actual_revision, self.SAMPLE_REVISION)
mock_storage.revision_get.assert_called_with(
[self.SHA1_SAMPLE_BIN])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_invalid_msg(self, mock_storage):
# given
stub_rev = self.SAMPLE_REVISION_RAW
stub_rev['message'] = b'elegant fix for bug \xff'
expected_revision = self.SAMPLE_REVISION
expected_revision['message'] = None
expected_revision['message_decoding_failed'] = True
mock_storage.revision_get = MagicMock(return_value=[stub_rev])
# when
actual_revision = service.lookup_revision(
self.SHA1_SAMPLE)
# then
self.assertEqual(actual_revision, expected_revision)
mock_storage.revision_get.assert_called_with(
[self.SHA1_SAMPLE_BIN])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_msg_ok(self, mock_storage):
# given
mock_storage.revision_get.return_value = [self.SAMPLE_REVISION_RAW]
# when
rv = service.lookup_revision_message(
self.SHA1_SAMPLE)
# then
self.assertEquals(rv, {'message': self.SAMPLE_MESSAGE_BIN})
mock_storage.revision_get.assert_called_with(
[self.SHA1_SAMPLE_BIN])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_msg_absent(self, mock_storage):
# given
stub_revision = self.SAMPLE_REVISION_RAW
del stub_revision['message']
mock_storage.revision_get.return_value = stub_revision
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_revision_message(
self.SHA1_SAMPLE)
- # then
- mock_storage.revision_get.assert_called_with(
- self.SHA1_SAMPLE_BIN)
- self.assertEqual(cm.exception.args[0], 'No message for revision '
- 'with sha1_git '
- '18d8be353ed3480476f032475e7c233eff7371d5.')
+ # then
+ mock_storage.revision_get.assert_called_with(
+ [self.SHA1_SAMPLE_BIN])
+ self.assertEqual(
+ cm.exception.args[0],
+ 'No message for revision with sha1_git %s.' % self.SHA1_SAMPLE,
+ )
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_msg_norev(self, mock_storage):
# given
mock_storage.revision_get.return_value = None
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_revision_message(
self.SHA1_SAMPLE)
- # then
- mock_storage.revision_get.assert_called_with(
- self.SHA1_SAMPLE_BIN)
- self.assertEqual(cm.exception.args[0], 'Revision with sha1_git '
- '18d8be353ed3480476f032475e7c233eff7371d5 '
- 'not found.')
+ # then
+ mock_storage.revision_get.assert_called_with(
+ [self.SHA1_SAMPLE_BIN])
+ self.assertEqual(
+ cm.exception.args[0],
+ 'Revision with sha1_git %s not found.' % self.SHA1_SAMPLE,
+ )
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_multiple(self, mock_storage):
# given
sha1 = self.SHA1_SAMPLE
sha1_other = 'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc'
stub_revisions = [
self.SAMPLE_REVISION_RAW,
{
'id': hash_to_bytes(sha1_other),
'directory': 'abcdbe353ed3480476f032475e7c233eff7371d5',
'author': {
'name': b'name',
'email': b'name@surname.org',
},
'committer': {
'name': b'name',
'email': b'name@surname.org',
},
'message': b'ugly fix for bug 42',
'date': {
'timestamp': datetime.datetime(
2000, 1, 12, 5, 23, 54,
tzinfo=datetime.timezone.utc).timestamp(),
'offset': 0,
'negative_utc': False
},
'date_offset': 0,
'committer_date': {
'timestamp': datetime.datetime(
2000, 1, 12, 5, 23, 54,
tzinfo=datetime.timezone.utc).timestamp(),
'offset': 0,
'negative_utc': False
},
'committer_date_offset': 0,
'synthetic': False,
'type': 'git',
'parents': [],
'metadata': [],
}
]
mock_storage.revision_get.return_value = stub_revisions
# when
actual_revisions = service.lookup_revision_multiple(
[sha1, sha1_other])
# then
self.assertEqual(list(actual_revisions), [
self.SAMPLE_REVISION,
{
'id': sha1_other,
'directory': 'abcdbe353ed3480476f032475e7c233eff7371d5',
'author': {
'name': 'name',
'email': 'name@surname.org',
},
'committer': {
'name': 'name',
'email': 'name@surname.org',
},
'message': 'ugly fix for bug 42',
'date': '2000-01-12T05:23:54+00:00',
'date_offset': 0,
'committer_date': '2000-01-12T05:23:54+00:00',
'committer_date_offset': 0,
'synthetic': False,
'type': 'git',
'parents': [],
'metadata': {},
'merge': False
}
])
self.assertEqual(
list(mock_storage.revision_get.call_args[0][0]),
[hash_to_bytes(sha1),
hash_to_bytes(sha1_other)])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_multiple_none_found(self, mock_storage):
# given
sha1_bin = self.SHA1_SAMPLE
sha1_other = 'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc'
mock_storage.revision_get.return_value = []
# then
actual_revisions = service.lookup_revision_multiple(
[sha1_bin, sha1_other])
self.assertEqual(list(actual_revisions), [])
self.assertEqual(
list(mock_storage.revision_get.call_args[0][0]),
[hash_to_bytes(self.SHA1_SAMPLE),
hash_to_bytes(sha1_other)])
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_log(self, mock_storage):
# given
stub_revision_log = [self.SAMPLE_REVISION_RAW]
mock_storage.revision_log = MagicMock(return_value=stub_revision_log)
# when
actual_revision = service.lookup_revision_log(
'abcdbe353ed3480476f032475e7c233eff7371d5',
limit=25)
# then
self.assertEqual(list(actual_revision), [self.SAMPLE_REVISION])
mock_storage.revision_log.assert_called_with(
[hash_to_bytes('abcdbe353ed3480476f032475e7c233eff7371d5')], 25)
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_log_by(self, mock_storage):
# given
stub_revision_log = [self.SAMPLE_REVISION_RAW]
mock_storage.revision_log_by = MagicMock(
return_value=stub_revision_log)
# when
actual_log = service.lookup_revision_log_by(
1, 'refs/heads/master', None, limit=100)
# then
self.assertEqual(list(actual_log), [self.SAMPLE_REVISION])
mock_storage.revision_log_by.assert_called_with(
1, 'refs/heads/master', None, limit=100)
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_log_by_nolog(self, mock_storage):
# given
mock_storage.revision_log_by = MagicMock(return_value=None)
# when
res = service.lookup_revision_log_by(
1, 'refs/heads/master', None, limit=100)
# then
self.assertEquals(res, None)
mock_storage.revision_log_by.assert_called_with(
1, 'refs/heads/master', None, limit=100)
@patch('swh.web.common.service.storage')
@istest
def lookup_content_raw_not_found(self, mock_storage):
# given
mock_storage.content_find = MagicMock(return_value=None)
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_content_raw('sha1:' + self.SHA1_SAMPLE)
- self.assertIn(cm.exc.args[0],
- 'Content with %s checksum equals to %s not found!' %
- ('sha1', self.SHA1_SAMPLE))
+ self.assertIn(cm.exception.args[0],
+ 'Content with %s checksum equals to %s not found!' %
+ ('sha1', self.SHA1_SAMPLE))
mock_storage.content_find.assert_called_with(
{'sha1': hash_to_bytes(self.SHA1_SAMPLE)})
@patch('swh.web.common.service.storage')
@istest
def lookup_content_raw(self, mock_storage):
# given
mock_storage.content_find = MagicMock(return_value={
'sha1': self.SHA1_SAMPLE,
})
mock_storage.content_get = MagicMock(return_value=[{
'data': b'binary data'}])
# when
actual_content = service.lookup_content_raw(
'sha256:%s' % self.SHA256_SAMPLE)
# then
self.assertEquals(actual_content, {'data': b'binary data'})
mock_storage.content_find.assert_called_once_with(
{'sha256': self.SHA256_SAMPLE_BIN})
mock_storage.content_get.assert_called_once_with(
[self.SHA1_SAMPLE])
@patch('swh.web.common.service.storage')
@istest
def lookup_content_not_found(self, mock_storage):
# given
mock_storage.content_find = MagicMock(return_value=None)
# when
with self.assertRaises(NotFoundExc) as cm:
# then
service.lookup_content('sha1:%s' % self.SHA1_SAMPLE)
- self.assertIn(cm.exc.args[0],
- 'Content with %s checksum equals to %s not found!' %
- ('sha1', self.SHA1_SAMPLE))
+ self.assertIn(cm.exception.args[0],
+ 'Content with %s checksum equals to %s not found!' %
+ ('sha1', self.SHA1_SAMPLE))
mock_storage.content_find.assert_called_with(
{'sha1': self.SHA1_SAMPLE_BIN})
@patch('swh.web.common.service.storage')
@istest
def lookup_content_with_sha1(self, mock_storage):
# given
mock_storage.content_find = MagicMock(
return_value=self.SAMPLE_CONTENT_RAW)
# when
actual_content = service.lookup_content(
'sha1:%s' % self.SHA1_SAMPLE)
# then
self.assertEqual(actual_content, self.SAMPLE_CONTENT)
mock_storage.content_find.assert_called_with(
{'sha1': hash_to_bytes(self.SHA1_SAMPLE)})
@patch('swh.web.common.service.storage')
@istest
def lookup_content_with_sha256(self, mock_storage):
# given
stub_content = self.SAMPLE_CONTENT_RAW
stub_content['status'] = 'visible'
expected_content = self.SAMPLE_CONTENT
expected_content['status'] = 'visible'
mock_storage.content_find = MagicMock(
return_value=stub_content)
# when
actual_content = service.lookup_content(
'sha256:%s' % self.SHA256_SAMPLE)
# then
self.assertEqual(actual_content, expected_content)
mock_storage.content_find.assert_called_with(
{'sha256': self.SHA256_SAMPLE_BIN})
@patch('swh.web.common.service.storage')
@istest
def lookup_person(self, mock_storage):
# given
mock_storage.person_get = MagicMock(return_value=[{
'id': 'person_id',
'name': b'some_name',
'email': b'some-email',
}])
# when
actual_person = service.lookup_person('person_id')
# then
self.assertEqual(actual_person, {
'id': 'person_id',
'name': 'some_name',
'email': 'some-email',
})
mock_storage.person_get.assert_called_with(['person_id'])
@patch('swh.web.common.service.storage')
@istest
def lookup_directory_bad_checksum(self, mock_storage):
# given
mock_storage.directory_ls = MagicMock()
# when
with self.assertRaises(BadInputExc):
service.lookup_directory('directory_id')
# then
mock_storage.directory_ls.called = False
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory_not_found(self, mock_query, mock_storage):
# given
mock_query.parse_hash_with_algorithms_or_throws.return_value = (
'sha1',
'directory-id-bin')
mock_storage.directory_ls.return_value = []
# when
with self.assertRaises(NotFoundExc) as cm:
service.lookup_directory('directory_id')
self.assertIn('Directory with sha1_git directory_id not found',
cm.exception.args[0])
# then
mock_query.parse_hash_with_algorithms_or_throws.assert_called_with(
'directory_id', ['sha1'], 'Only sha1_git is supported.')
mock_storage.directory_ls.assert_called_with('directory-id-bin')
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_directory(self, mock_query, mock_storage):
mock_query.parse_hash_with_algorithms_or_throws.return_value = (
'sha1',
'directory-sha1-bin')
# given
stub_dir_entries = [{
'sha1': self.SHA1_SAMPLE_BIN,
'sha256': self.SHA256_SAMPLE_BIN,
'sha1_git': self.SHA1GIT_SAMPLE_BIN,
'blake2s256': self.BLAKE2S256_SAMPLE_BIN,
'target': hash_to_bytes(
'40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03'),
'dir_id': self.DIRECTORY_ID_BIN,
'name': b'bob',
'type': 10,
}]
expected_dir_entries = [{
'checksums': {
'sha1': self.SHA1_SAMPLE,
'sha256': self.SHA256_SAMPLE,
'sha1_git': self.SHA1GIT_SAMPLE,
'blake2s256': self.BLAKE2S256_SAMPLE
},
'target': '40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03',
'dir_id': self.DIRECTORY_ID,
'name': 'bob',
'type': 10,
}]
mock_storage.directory_ls.return_value = stub_dir_entries
# when
actual_directory_ls = list(service.lookup_directory(
'directory-sha1'))
# then
self.assertEqual(actual_directory_ls, expected_dir_entries)
mock_query.parse_hash_with_algorithms_or_throws.assert_called_with(
'directory-sha1', ['sha1'], 'Only sha1_git is supported.')
mock_storage.directory_ls.assert_called_with(
'directory-sha1-bin')
@patch('swh.web.common.service.storage')
@istest
def lookup_directory_empty(self, mock_storage):
empty_dir_sha1 = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
mock_storage.directory_ls.return_value = []
# when
actual_directory_ls = list(service.lookup_directory(empty_dir_sha1))
# then
self.assertEqual(actual_directory_ls, [])
self.assertFalse(mock_storage.directory_ls.called)
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_by_nothing_found(self, mock_storage):
# given
mock_storage.revision_get_by.return_value = None
# when
with self.assertRaises(NotFoundExc):
service.lookup_revision_by(1)
# then
mock_storage.revision_get_by.assert_called_with(1, 'refs/heads/master', # noqa
limit=1,
timestamp=None)
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_by(self, mock_storage):
# given
stub_rev = self.SAMPLE_REVISION_RAW
expected_rev = self.SAMPLE_REVISION
mock_storage.revision_get_by.return_value = [stub_rev]
# when
actual_revision = service.lookup_revision_by(10, 'master2', 'some-ts')
# then
self.assertEquals(actual_revision, expected_rev)
mock_storage.revision_get_by.assert_called_with(10, 'master2',
limit=1,
timestamp='some-ts')
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_by_nomerge(self, mock_storage):
# given
stub_rev = self.SAMPLE_REVISION_RAW
stub_rev['parents'] = [
hash_to_bytes('adc83b19e793491b1c6ea0fd8b46cd9f32e592fc')]
expected_rev = self.SAMPLE_REVISION
expected_rev['parents'] = ['adc83b19e793491b1c6ea0fd8b46cd9f32e592fc']
mock_storage.revision_get_by.return_value = [stub_rev]
# when
actual_revision = service.lookup_revision_by(10, 'master2', 'some-ts')
# then
self.assertEquals(actual_revision, expected_rev)
mock_storage.revision_get_by.assert_called_with(10, 'master2',
limit=1,
timestamp='some-ts')
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_by_merge(self, mock_storage):
# given
stub_rev = self.SAMPLE_REVISION_RAW
stub_rev['parents'] = [
hash_to_bytes('adc83b19e793491b1c6ea0fd8b46cd9f32e592fc'),
hash_to_bytes('ffff3b19e793491b1c6db0fd8b46cd9f32e592fc')
]
expected_rev = self.SAMPLE_REVISION
expected_rev['parents'] = [
'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc',
'ffff3b19e793491b1c6db0fd8b46cd9f32e592fc'
]
expected_rev['merge'] = True
mock_storage.revision_get_by.return_value = [stub_rev]
# when
actual_revision = service.lookup_revision_by(10, 'master2', 'some-ts')
# then
self.assertEquals(actual_revision, expected_rev)
mock_storage.revision_get_by.assert_called_with(10, 'master2',
limit=1,
timestamp='some-ts')
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_with_context_by_ko(self, mock_storage):
# given
mock_storage.revision_get_by.return_value = None
# when
+ origin_id = 1
+ branch_name = 'master3'
+ ts = None
with self.assertRaises(NotFoundExc) as cm:
- origin_id = 1
- branch_name = 'master3'
- ts = None
service.lookup_revision_with_context_by(origin_id, branch_name, ts,
'sha1')
- # then
- self.assertIn(
- 'Revision with (origin_id: %s, branch_name: %s'
- ', ts: %s) not found.' % (origin_id,
- branch_name,
- ts), cm.exception.args[0])
-
- mock_storage.revision_get_by.assert_called_once_with(
- origin_id, branch_name, ts)
+ # then
+ self.assertIn(
+ 'Revision with (origin_id: %s, branch_name: %s'
+ ', ts: %s) not found.' % (origin_id,
+ branch_name,
+ ts), cm.exception.args[0])
+
+ mock_storage.revision_get_by.assert_called_once_with(
+ origin_id, branch_name, limit=1, timestamp=ts)
@patch('swh.web.common.service.lookup_revision_with_context')
@patch('swh.web.common.service.storage')
@istest
def lookup_revision_with_context_by(self, mock_storage,
mock_lookup_revision_with_context):
# given
stub_root_rev = {'id': 'root-rev-id'}
mock_storage.revision_get_by.return_value = [{'id': 'root-rev-id'}]
stub_rev = {'id': 'rev-found'}
mock_lookup_revision_with_context.return_value = stub_rev
# when
origin_id = 1
branch_name = 'master3'
ts = None
sha1_git = 'sha1'
actual_root_rev, actual_rev = service.lookup_revision_with_context_by(
origin_id, branch_name, ts, sha1_git)
# then
self.assertEquals(actual_root_rev, stub_root_rev)
self.assertEquals(actual_rev, stub_rev)
mock_storage.revision_get_by.assert_called_once_with(
origin_id, branch_name, limit=1, timestamp=ts)
mock_lookup_revision_with_context.assert_called_once_with(
stub_root_rev, sha1_git, 100)
@patch('swh.web.common.service.storage')
@patch('swh.web.common.service.query')
@istest
def lookup_entity_by_uuid(self, mock_query, mock_storage):
# given
uuid_test = 'correct-uuid'
mock_query.parse_uuid4.return_value = uuid_test
stub_entities = [{'uuid': uuid_test}]
mock_storage.entity_get.return_value = stub_entities
# when
actual_entities = list(service.lookup_entity_by_uuid(uuid_test))
# then
self.assertEquals(actual_entities, stub_entities)
mock_query.parse_uuid4.assert_called_once_with(uuid_test)
mock_storage.entity_get.assert_called_once_with(uuid_test)
@istest
def lookup_revision_through_ko_not_implemented(self):
# then
with self.assertRaises(NotImplementedError):
service.lookup_revision_through({
'something-unknown': 10,
})
@patch('swh.web.common.service.lookup_revision_with_context_by')
@istest
def lookup_revision_through_with_context_by(self, mock_lookup):
# given
stub_rev = {'id': 'rev'}
mock_lookup.return_value = stub_rev
# when
actual_revision = service.lookup_revision_through({
'origin_id': 1,
'branch_name': 'master',
'ts': None,
'sha1_git': 'sha1-git'
}, limit=1000)
# then
self.assertEquals(actual_revision, stub_rev)
mock_lookup.assert_called_once_with(
1, 'master', None, 'sha1-git', 1000)
@patch('swh.web.common.service.lookup_revision_by')
@istest
def lookup_revision_through_with_revision_by(self, mock_lookup):
# given
stub_rev = {'id': 'rev'}
mock_lookup.return_value = stub_rev
# when
actual_revision = service.lookup_revision_through({
'origin_id': 2,
'branch_name': 'master2',
'ts': 'some-ts',
}, limit=10)
# then
self.assertEquals(actual_revision, stub_rev)
mock_lookup.assert_called_once_with(
2, 'master2', 'some-ts')
@patch('swh.web.common.service.lookup_revision_with_context')
@istest
def lookup_revision_through_with_context(self, mock_lookup):
# given
stub_rev = {'id': 'rev'}
mock_lookup.return_value = stub_rev
# when
actual_revision = service.lookup_revision_through({
'sha1_git_root': 'some-sha1-root',
'sha1_git': 'some-sha1',
})
# then
self.assertEquals(actual_revision, stub_rev)
mock_lookup.assert_called_once_with(
'some-sha1-root', 'some-sha1', 100)
@patch('swh.web.common.service.lookup_revision')
@istest
def lookup_revision_through_with_revision(self, mock_lookup):
# given
stub_rev = {'id': 'rev'}
mock_lookup.return_value = stub_rev
# when
actual_revision = service.lookup_revision_through({
'sha1_git': 'some-sha1',
})
# then
self.assertEquals(actual_revision, stub_rev)
mock_lookup.assert_called_once_with(
'some-sha1')
@patch('swh.web.common.service.lookup_revision_through')
@istest
def lookup_directory_through_revision_ko_not_found(
self, mock_lookup_rev):
# given
mock_lookup_rev.return_value = None
# when
with self.assertRaises(NotFoundExc):
service.lookup_directory_through_revision(
{'id': 'rev'}, 'some/path', 100)
mock_lookup_rev.assert_called_once_with({'id': 'rev'}, 100)
@patch('swh.web.common.service.lookup_revision_through')
@patch('swh.web.common.service.lookup_directory_with_revision')
@istest
def lookup_directory_through_revision_ok_with_data(
self, mock_lookup_dir, mock_lookup_rev):
# given
mock_lookup_rev.return_value = {'id': 'rev-id'}
mock_lookup_dir.return_value = {'type': 'dir',
'content': []}
# when
rev_id, dir_result = service.lookup_directory_through_revision(
{'id': 'rev'}, 'some/path', 100)
# then
self.assertEquals(rev_id, 'rev-id')
self.assertEquals(dir_result, {'type': 'dir',
'content': []})
mock_lookup_rev.assert_called_once_with({'id': 'rev'}, 100)
mock_lookup_dir.assert_called_once_with('rev-id', 'some/path', False)
@patch('swh.web.common.service.lookup_revision_through')
@patch('swh.web.common.service.lookup_directory_with_revision')
@istest
def lookup_directory_through_revision_ok_with_content(
self, mock_lookup_dir, mock_lookup_rev):
# given
mock_lookup_rev.return_value = {'id': 'rev-id'}
stub_result = {'type': 'file',
'revision': 'rev-id',
'content': {'data': b'blah',
'sha1': 'sha1'}}
mock_lookup_dir.return_value = stub_result
# when
rev_id, dir_result = service.lookup_directory_through_revision(
{'id': 'rev'}, 'some/path', 10, with_data=True)
# then
self.assertEquals(rev_id, 'rev-id')
self.assertEquals(dir_result, stub_result)
mock_lookup_rev.assert_called_once_with({'id': 'rev'}, 10)
mock_lookup_dir.assert_called_once_with('rev-id', 'some/path', True)
diff --git a/swh/web/tests/common/test_utils.py b/swh/web/tests/common/test_utils.py
index eddf728a..2dfb070b 100644
--- a/swh/web/tests/common/test_utils.py
+++ b/swh/web/tests/common/test_utils.py
@@ -1,159 +1,159 @@
# Copyright (C) 2017-2018 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
import datetime
import unittest
from nose.tools import istest
from unittest.mock import patch
from swh.web.common import utils
from swh.web.common.exc import BadInputExc
class UtilsTestCase(unittest.TestCase):
@istest
def shorten_path_noop(self):
noops = [
'/api/',
'/browse/',
'/content/symbol/foobar/'
]
for noop in noops:
self.assertEqual(
utils.shorten_path(noop),
noop
)
@istest
def shorten_path_sha1(self):
sha1 = 'aafb16d69fd30ff58afdd69036a26047f3aebdc6'
short_sha1 = sha1[:8] + '...'
templates = [
'/api/1/content/sha1:%s/',
'/api/1/content/sha1_git:%s/',
'/api/1/directory/%s/',
'/api/1/content/sha1:%s/ctags/',
]
for template in templates:
self.assertEqual(
utils.shorten_path(template % sha1),
template % short_sha1
)
@istest
def shorten_path_sha256(self):
sha256 = ('aafb16d69fd30ff58afdd69036a26047'
'213add102934013a014dfca031c41aef')
short_sha256 = sha256[:8] + '...'
templates = [
'/api/1/content/sha256:%s/',
'/api/1/directory/%s/',
'/api/1/content/sha256:%s/filetype/',
]
for template in templates:
self.assertEqual(
utils.shorten_path(template % sha256),
template % short_sha256
)
@istest
def parse_timestamp(self):
input_timestamps = [
None,
'2016-01-12',
'2016-01-12T09:19:12+0100',
'Today is January 1, 2047 at 8:21:00AM',
'1452591542',
]
output_dates = [
None,
datetime.datetime(2016, 1, 12, 0, 0),
datetime.datetime(2016, 1, 12, 8, 19, 12,
tzinfo=datetime.timezone.utc),
datetime.datetime(2047, 1, 1, 8, 21),
datetime.datetime(2016, 1, 12, 9, 39, 2,
tzinfo=datetime.timezone.utc),
]
for ts, exp_date in zip(input_timestamps, output_dates):
self.assertEquals(utils.parse_timestamp(ts), exp_date)
@istest
def format_utc_iso_date(self):
self.assertEqual(utils.format_utc_iso_date('2017-05-04T13:27:13+02:00'), # noqa
'04 May 2017, 11:27 UTC')
@istest
def gen_path_info(self):
input_path = '/home/user/swh-environment/swh-web/'
expected_result = [
{'name': 'home', 'path': 'home'},
{'name': 'user', 'path': 'home/user'},
{'name': 'swh-environment', 'path': 'home/user/swh-environment'},
{'name': 'swh-web', 'path': 'home/user/swh-environment/swh-web'}
]
path_info = utils.gen_path_info(input_path)
self.assertEquals(path_info, expected_result)
input_path = 'home/user/swh-environment/swh-web'
path_info = utils.gen_path_info(input_path)
self.assertEquals(path_info, expected_result)
@patch('swh.web.common.utils.service')
@istest
def get_origin_visits(self, mock_service):
mock_service.MAX_LIMIT = 2
def _lookup_origin_visits(*args, **kwargs):
if kwargs['last_visit'] is None:
return [{'visit': 1,
'date': '2017-05-06T00:59:10+00:00',
'metadata': {}},
{'visit': 2,
'date': '2017-08-06T00:59:10+00:00',
'metadata': {}}
]
else:
return [{'visit': 3,
'date': '2017-09-06T00:59:10+00:00',
'metadata': {}}
]
mock_service.lookup_origin_visits.side_effect = _lookup_origin_visits
origin_info = {
'id': 1,
'type': 'git',
'url': 'https://github.com/foo/bar',
}
origin_visits = utils.get_origin_visits(origin_info)
self.assertEqual(len(origin_visits), 3)
@istest
def get_swh_persisent_id(self):
swh_object_type = 'content'
sha1_git = 'aafb16d69fd30ff58afdd69036a26047f3aebdc6'
expected_swh_id = 'swh:1:cnt:' + sha1_git
self.assertEqual(utils.get_swh_persistent_id(swh_object_type, sha1_git), # noqa
expected_swh_id)
with self.assertRaises(BadInputExc) as cm:
utils.get_swh_persistent_id('foo', sha1_git)
- self.assertIn('Invalid object type', cm.exception.args[0])
+ self.assertIn('Invalid object type', cm.exception.args[0])
with self.assertRaises(BadInputExc) as cm:
utils.get_swh_persistent_id(swh_object_type, 'not a valid id')
- self.assertIn('Invalid object id', cm.exception.args[0])
+ self.assertIn('Invalid object id', cm.exception.args[0])