Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_revision.py
Show First 20 Lines • Show All 159 Lines • ▼ Show 20 Lines | def test_api_revision_raw_ko_no_rev(self, mock_service): | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'No revision found'}) | 'reason': 'No revision found'}) | ||||
mock_service.lookup_revision_message.assert_called_once_with( | mock_service.lookup_revision_message.assert_called_once_with( | ||||
'18d8be353ed3480476f032475e7c233eff7371d5') | '18d8be353ed3480476f032475e7c233eff7371d5') | ||||
@patch('swh.web.api.views.revision.service') | @patch('swh.web.api.views.revision.service') | ||||
def test_api_revision_with_origin_not_found(self, mock_service): | |||||
mock_service.lookup_revision_by.return_value = None | |||||
rv = self.client.get('/api/1/revision/origin/123/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 404) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertIn('Revision with (origin_id: 123', rv.data['reason']) | |||||
self.assertIn('not found', rv.data['reason']) | |||||
self.assertEqual('NotFoundExc', rv.data['exception']) | |||||
mock_service.lookup_revision_by.assert_called_once_with( | |||||
'123', | |||||
'refs/heads/master', | |||||
None) | |||||
@patch('swh.web.api.views.revision.service') | |||||
def test_api_revision_with_origin(self, mock_service): | |||||
mock_revision = { | |||||
'id': '32', | |||||
'directory': '21', | |||||
'message': 'message 1', | |||||
'type': 'deb', | |||||
} | |||||
expected_revision = { | |||||
'id': '32', | |||||
'url': '/api/1/revision/32/', | |||||
'history_url': '/api/1/revision/32/log/', | |||||
'directory': '21', | |||||
'directory_url': '/api/1/directory/21/', | |||||
'message': 'message 1', | |||||
'type': 'deb', | |||||
} | |||||
mock_service.lookup_revision_by.return_value = mock_revision | |||||
rv = self.client.get('/api/1/revision/origin/1/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, expected_revision) | |||||
mock_service.lookup_revision_by.assert_called_once_with( | |||||
'1', | |||||
'refs/heads/master', | |||||
None) | |||||
@patch('swh.web.api.views.revision.service') | |||||
def test_api_revision_with_origin_and_branch_name(self, mock_service): | |||||
mock_revision = { | |||||
'id': '12', | |||||
'directory': '23', | |||||
'message': 'message 2', | |||||
'type': 'tar', | |||||
} | |||||
mock_service.lookup_revision_by.return_value = mock_revision | |||||
expected_revision = { | |||||
'id': '12', | |||||
'url': '/api/1/revision/12/', | |||||
'history_url': '/api/1/revision/12/log/', | |||||
'directory': '23', | |||||
'directory_url': '/api/1/directory/23/', | |||||
'message': 'message 2', | |||||
'type': 'tar', | |||||
} | |||||
rv = self.client.get('/api/1/revision/origin/1' | |||||
'/branch/refs/origin/dev/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, expected_revision) | |||||
mock_service.lookup_revision_by.assert_called_once_with( | |||||
'1', | |||||
'refs/origin/dev', | |||||
None) | |||||
@patch('swh.web.api.views.revision.parse_timestamp') | |||||
@patch('swh.web.api.views.revision.service') | |||||
@patch('swh.web.api.views.revision.utils') | |||||
def test_api_revision_with_origin_and_branch_name_and_timestamp(self, | |||||
mock_utils, | |||||
mock_service, | |||||
mock_parse_timestamp): # noqa | |||||
mock_revision = { | |||||
'id': '123', | |||||
'directory': '456', | |||||
'message': 'message 3', | |||||
'type': 'tar', | |||||
} | |||||
mock_service.lookup_revision_by.return_value = mock_revision | |||||
expected_revision = { | |||||
'id': '123', | |||||
'url': '/api/1/revision/123/', | |||||
'history_url': '/api/1/revision/123/log/', | |||||
'directory': '456', | |||||
'directory_url': '/api/1/directory/456/', | |||||
'message': 'message 3', | |||||
'type': 'tar', | |||||
} | |||||
mock_parse_timestamp.return_value = 'parsed-date' | |||||
mock_utils.enrich_revision.return_value = expected_revision | |||||
rv = self.client.get('/api/1/revision' | |||||
'/origin/1' | |||||
'/branch/refs/origin/dev' | |||||
'/ts/1452591542/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, expected_revision) | |||||
mock_service.lookup_revision_by.assert_called_once_with( | |||||
'1', | |||||
'refs/origin/dev', | |||||
'parsed-date') | |||||
mock_parse_timestamp.assert_called_once_with('1452591542') | |||||
mock_utils.enrich_revision.assert_called_once_with( | |||||
mock_revision) | |||||
@patch('swh.web.api.views.revision.parse_timestamp') | |||||
@patch('swh.web.api.views.revision.service') | |||||
@patch('swh.web.api.views.revision.utils') | |||||
def test_api_revision_with_origin_and_branch_name_and_timestamp_escapes( | |||||
self, | |||||
mock_utils, | |||||
mock_service, | |||||
mock_parse_timestamp): | |||||
mock_revision = { | |||||
'id': '999', | |||||
} | |||||
mock_service.lookup_revision_by.return_value = mock_revision | |||||
expected_revision = { | |||||
'id': '999', | |||||
'url': '/api/1/revision/999/', | |||||
'history_url': '/api/1/revision/999/log/', | |||||
} | |||||
mock_parse_timestamp.return_value = 'parsed-date' | |||||
mock_utils.enrich_revision.return_value = expected_revision | |||||
rv = self.client.get('/api/1/revision' | |||||
'/origin/1' | |||||
'/branch/refs%2Forigin%2Fdev' | |||||
'/ts/Today%20is%20' | |||||
'January%201,%202047%20at%208:21:00AM/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, expected_revision) | |||||
mock_service.lookup_revision_by.assert_called_once_with( | |||||
'1', | |||||
'refs/origin/dev', | |||||
'parsed-date') | |||||
mock_parse_timestamp.assert_called_once_with( | |||||
'Today is January 1, 2047 at 8:21:00AM') | |||||
mock_utils.enrich_revision.assert_called_once_with( | |||||
mock_revision) | |||||
@patch('swh.web.api.views.revision.service') | |||||
def test_revision_directory_by_ko_raise(self, mock_service): | def test_revision_directory_by_ko_raise(self, mock_service): | ||||
# given | # given | ||||
mock_service.lookup_directory_through_revision.side_effect = NotFoundExc('not') # noqa | mock_service.lookup_directory_through_revision.side_effect = NotFoundExc('not') # noqa | ||||
# when | # when | ||||
with self.assertRaises(NotFoundExc): | with self.assertRaises(NotFoundExc): | ||||
_revision_directory_by( | _revision_directory_by( | ||||
{'sha1_git': 'id'}, | {'sha1_git': 'id'}, | ||||
Show All 29 Lines | def test_revision_directory_by_type_dir(self, mock_service): | ||||
'content': [] | 'content': [] | ||||
}) | }) | ||||
mock_service.lookup_directory_through_revision.assert_called_once_with( | mock_service.lookup_directory_through_revision.assert_called_once_with( | ||||
{'sha1_git': 'blah-id'}, | {'sha1_git': 'blah-id'}, | ||||
'some/path', limit=100, with_data=False) | 'some/path', limit=100, with_data=False) | ||||
@patch('swh.web.api.views.revision.service') | @patch('swh.web.api.views.revision.service') | ||||
def test_revision_directory_by_type_file(self, mock_service): | |||||
# given | |||||
mock_service.lookup_directory_through_revision.return_value = ( | |||||
'rev-id', | |||||
{ | |||||
'type': 'file', | |||||
'revision': 'rev-id', | |||||
'path': 'some/path', | |||||
'content': {'blah': 'blah'} | |||||
}) | |||||
# when | |||||
actual_dir_content = _revision_directory_by( | |||||
{'sha1_git': 'sha1'}, | |||||
'some/path', | |||||
'/api/1/revision/origin/2/directory/', | |||||
limit=1000, with_data=True) | |||||
# then | |||||
self.assertEqual(actual_dir_content, { | |||||
'type': 'file', | |||||
'revision': 'rev-id', | |||||
'path': 'some/path', | |||||
'content': {'blah': 'blah'} | |||||
}) | |||||
mock_service.lookup_directory_through_revision.assert_called_once_with( | |||||
{'sha1_git': 'sha1'}, | |||||
'some/path', limit=1000, with_data=True) | |||||
@patch('swh.web.api.views.revision.parse_timestamp') | |||||
@patch('swh.web.api.views.revision._revision_directory_by') | |||||
@patch('swh.web.api.views.revision.utils') | |||||
def test_api_directory_through_revision_origin_ko_not_found(self, | |||||
mock_utils, | |||||
mock_rev_dir, | |||||
mock_parse_timestamp): # noqa | |||||
mock_rev_dir.side_effect = NotFoundExc('not found') | |||||
mock_parse_timestamp.return_value = '2012-10-20 00:00:00' | |||||
rv = self.client.get('/api/1/revision' | |||||
'/origin/10' | |||||
'/branch/refs/remote/origin/dev' | |||||
'/ts/2012-10-20' | |||||
'/directory/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 404) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, { | |||||
'exception': 'NotFoundExc', | |||||
'reason': 'not found'}) | |||||
mock_rev_dir.assert_called_once_with( | |||||
{'origin_id': '10', | |||||
'branch_name': 'refs/remote/origin/dev', | |||||
'ts': '2012-10-20 00:00:00'}, None, | |||||
'/api/1/revision' | |||||
'/origin/10' | |||||
'/branch/refs/remote/origin/dev' | |||||
'/ts/2012-10-20' | |||||
'/directory/', | |||||
with_data=False) | |||||
@patch('swh.web.api.views.revision._revision_directory_by') | |||||
def test_api_directory_through_revision_origin(self, | |||||
mock_revision_dir): | |||||
expected_res = [{ | |||||
'id': '123' | |||||
}] | |||||
mock_revision_dir.return_value = expected_res | |||||
rv = self.client.get('/api/1/revision/origin/3/directory/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, expected_res) | |||||
mock_revision_dir.assert_called_once_with({ | |||||
'origin_id': '3', | |||||
'branch_name': 'refs/heads/master', | |||||
'ts': None}, None, '/api/1/revision/origin/3/directory/', | |||||
with_data=False) | |||||
@patch('swh.web.api.views.revision.service') | |||||
def test_api_revision_log(self, mock_service): | def test_api_revision_log(self, mock_service): | ||||
# given | # given | ||||
stub_revisions = [{ | stub_revisions = [{ | ||||
'id': '18d8be353ed3480476f032475e7c233eff7371d5', | 'id': '18d8be353ed3480476f032475e7c233eff7371d5', | ||||
'directory': '7834ef7e7c357ce2af928115c6c6a42b7e2a44e6', | 'directory': '7834ef7e7c357ce2af928115c6c6a42b7e2a44e6', | ||||
'author_name': 'Software Heritage', | 'author_name': 'Software Heritage', | ||||
'author_email': 'robot@softwareheritage.org', | 'author_email': 'robot@softwareheritage.org', | ||||
'committer_name': 'Software Heritage', | 'committer_name': 'Software Heritage', | ||||
▲ Show 20 Lines • Show All 187 Lines • ▼ Show 20 Lines | def test_api_revision_log_context(self, mock_service): | ||||
self.assertFalse(rv.has_header('Link')) | self.assertFalse(rv.has_header('Link')) | ||||
mock_service.lookup_revision_log.assert_called_once_with( | mock_service.lookup_revision_log.assert_called_once_with( | ||||
'18d8be353ed3480476f032475e7c233eff7371d5', 11) | '18d8be353ed3480476f032475e7c233eff7371d5', 11) | ||||
mock_service.lookup_revision_multiple.assert_called_once_with( | mock_service.lookup_revision_multiple.assert_called_once_with( | ||||
['21145781e26ad1f978e']) | ['21145781e26ad1f978e']) | ||||
@patch('swh.web.api.views.revision.service') | @patch('swh.web.api.views.revision.service') | ||||
def test_api_revision_log_by(self, mock_service): | |||||
# given | |||||
stub_revisions = [{ | |||||
'id': '18d8be353ed3480476f032475e7c233eff7371d5', | |||||
'directory': '7834ef7e7c357ce2af928115c6c6a42b7e2a44e6', | |||||
'author_name': 'Software Heritage', | |||||
'author_email': 'robot@softwareheritage.org', | |||||
'committer_name': 'Software Heritage', | |||||
'committer_email': 'robot@softwareheritage.org', | |||||
'message': 'synthetic revision message', | |||||
'date_offset': 0, | |||||
'committer_date_offset': 0, | |||||
'parents': ['7834ef7e7c357ce2af928115c6c6a42b7e2a4345'], | |||||
'type': 'tar', | |||||
'synthetic': True, | |||||
}] | |||||
mock_service.lookup_revision_log_by.return_value = stub_revisions | |||||
expected_revisions = [{ | |||||
'id': '18d8be353ed3480476f032475e7c233eff7371d5', | |||||
'url': '/api/1/revision/18d8be353ed3480476f032475e7c233eff7371d5/', | |||||
'history_url': '/api/1/revision/18d8be353ed3480476f032475e7c233ef' | |||||
'f7371d5/log/', | |||||
'directory': '7834ef7e7c357ce2af928115c6c6a42b7e2a44e6', | |||||
'directory_url': '/api/1/directory/7834ef7e7c357ce2af928115c6c6a' | |||||
'42b7e2a44e6/', | |||||
'author_name': 'Software Heritage', | |||||
'author_email': 'robot@softwareheritage.org', | |||||
'committer_name': 'Software Heritage', | |||||
'committer_email': 'robot@softwareheritage.org', | |||||
'message': 'synthetic revision message', | |||||
'date_offset': 0, | |||||
'committer_date_offset': 0, | |||||
'parents': [{ | |||||
'id': '7834ef7e7c357ce2af928115c6c6a42b7e2a4345', | |||||
'url': '/api/1/revision/7834ef7e7c357ce2af928115c6c6a42b7e2a4345/' # noqa | |||||
}], | |||||
'type': 'tar', | |||||
'synthetic': True, | |||||
}] | |||||
# when | |||||
rv = self.client.get('/api/1/revision/origin/1/log/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, expected_revisions) | |||||
self.assertFalse(rv.has_header('Link')) | |||||
mock_service.lookup_revision_log_by.assert_called_once_with( | |||||
'1', 'refs/heads/master', None, 11) | |||||
@patch('swh.web.api.views.revision.service') | |||||
def test_api_revision_log_by_with_next(self, mock_service): | |||||
# given | |||||
stub_revisions = [] | |||||
for i in range(27): | |||||
stub_revisions.append({'id': str(i)}) | |||||
mock_service.lookup_revision_log_by.return_value = stub_revisions[:26] | |||||
expected_revisions = [x for x in stub_revisions if int(x['id']) < 25] | |||||
for e in expected_revisions: | |||||
e['url'] = '/api/1/revision/%s/' % e['id'] | |||||
e['history_url'] = '/api/1/revision/%s/log/' % e['id'] | |||||
# when | |||||
rv = self.client.get('/api/1/revision/origin/1/log/?per_page=25') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertIsNotNone(rv['Link']) | |||||
self.assertEqual(rv.data, expected_revisions) | |||||
mock_service.lookup_revision_log_by.assert_called_once_with( | |||||
'1', 'refs/heads/master', None, 26) | |||||
@patch('swh.web.api.views.revision.service') | |||||
def test_api_revision_log_by_norev(self, mock_service): | |||||
# given | |||||
mock_service.lookup_revision_log_by.side_effect = NotFoundExc( | |||||
'No revision') | |||||
# when | |||||
rv = self.client.get('/api/1/revision/origin/1/log/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 404) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertFalse(rv.has_header('Link')) | |||||
self.assertEqual(rv.data, {'exception': 'NotFoundExc', | |||||
'reason': 'No revision'}) | |||||
mock_service.lookup_revision_log_by.assert_called_once_with( | |||||
'1', 'refs/heads/master', None, 11) | |||||
@patch('swh.web.api.views.revision.service') | |||||
def test_api_revision_history(self, mock_service): | def test_api_revision_history(self, mock_service): | ||||
# for readability purposes, we use: | # for readability purposes, we use: | ||||
# - sha1 as 3 letters (url are way too long otherwise to respect pep8) | # - sha1 as 3 letters (url are way too long otherwise to respect pep8) | ||||
# - only keys with modification steps (all other keys are kept as is) | # - only keys with modification steps (all other keys are kept as is) | ||||
# given | # given | ||||
stub_revision = { | stub_revision = { | ||||
'id': '883', | 'id': '883', | ||||
▲ Show 20 Lines • Show All 114 Lines • Show Last 20 Lines |