Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_revision.py
Show First 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | def test_api_revision_raw_ko_no_rev(self, unknown_revision): | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Revision with sha1_git %s not found.' % | 'reason': 'Revision with sha1_git %s not found.' % | ||||
unknown_revision}) | unknown_revision}) | ||||
@given(unknown_origin_id()) | @given(unknown_origin_id()) | ||||
def test_api_revision_with_origin_not_found(self, unknown_origin_id): | def test_api_revision_with_origin_not_found(self, unknown_origin_id): | ||||
url = reverse('api-revision-origin', | url = reverse('api-revision-origin', | ||||
url_args={'origin_id': unknown_origin_id}) | url_args={'origin_id': hash_to_hex(unknown_origin_id)}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Origin with id %s not found!' % | 'reason': 'Origin with id %s not found!' % | ||||
unknown_origin_id}) | hash_to_hex(unknown_origin_id)}) | ||||
@given(origin()) | @given(origin()) | ||||
def test_api_revision_with_origin(self, origin): | def test_api_revision_with_origin(self, origin): | ||||
url = reverse('api-revision-origin', | url = reverse('api-revision-origin', | ||||
url_args={'origin_id': origin['id']}) | url_args={'origin_id': hash_to_hex(origin['id'])}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
snapshot = self.snapshot_get_latest(origin['id']) | snapshot = self.snapshot_get_latest(origin['id']) | ||||
expected_revision = self.revision_get( | expected_revision = self.revision_get( | ||||
snapshot['branches']['HEAD']['target']) | snapshot['branches']['HEAD']['target']) | ||||
self._enrich_revision(expected_revision) | self._enrich_revision(expected_revision) | ||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, expected_revision) | self.assertEqual(rv.data, expected_revision) | ||||
@given(origin()) | @given(origin()) | ||||
def test_api_revision_with_origin_and_branch_name(self, origin): | def test_api_revision_with_origin_and_branch_name(self, origin): | ||||
snapshot = self.snapshot_get_latest(origin['id']) | snapshot = self.snapshot_get_latest(origin['id']) | ||||
branch_name = random.choice( | branch_name = random.choice( | ||||
list(b for b in snapshot['branches'].keys() | list(b for b in snapshot['branches'].keys() | ||||
if snapshot['branches'][b]['target_type'] == 'revision')) | if snapshot['branches'][b]['target_type'] == 'revision')) | ||||
url = reverse('api-revision-origin', | url = reverse('api-revision-origin', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'branch_name': branch_name}) | 'branch_name': branch_name}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
expected_revision = self.revision_get( | expected_revision = self.revision_get( | ||||
snapshot['branches'][branch_name]['target']) | snapshot['branches'][branch_name]['target']) | ||||
self._enrich_revision(expected_revision) | self._enrich_revision(expected_revision) | ||||
Show All 9 Lines | def test_api_revision_with_origin_and_branch_name_and_ts(self, origin): | ||||
snapshot = self.snapshot_get(visit['snapshot']) | snapshot = self.snapshot_get(visit['snapshot']) | ||||
branch_name = random.choice( | branch_name = random.choice( | ||||
list(b for b in snapshot['branches'].keys() | list(b for b in snapshot['branches'].keys() | ||||
if snapshot['branches'][b]['target_type'] == 'revision')) | if snapshot['branches'][b]['target_type'] == 'revision')) | ||||
url = reverse('api-revision-origin', | url = reverse('api-revision-origin', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'branch_name': branch_name, | 'branch_name': branch_name, | ||||
'ts': visit['date']}) | 'ts': visit['date']}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
expected_revision = self.revision_get( | expected_revision = self.revision_get( | ||||
snapshot['branches'][branch_name]['target']) | snapshot['branches'][branch_name]['target']) | ||||
Show All 14 Lines | def test_api_revision_with_origin_and_branch_name_and_ts_escapes(self, | ||||
list(b for b in snapshot['branches'].keys() | list(b for b in snapshot['branches'].keys() | ||||
if snapshot['branches'][b]['target_type'] == 'revision')) | if snapshot['branches'][b]['target_type'] == 'revision')) | ||||
date = parse_timestamp(visit['date']) | date = parse_timestamp(visit['date']) | ||||
formatted_date = date.strftime('Today is %B %d, %Y at %X') | formatted_date = date.strftime('Today is %B %d, %Y at %X') | ||||
url = reverse('api-revision-origin', | url = reverse('api-revision-origin', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'branch_name': branch_name, | 'branch_name': branch_name, | ||||
'ts': formatted_date}) | 'ts': formatted_date}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
expected_revision = self.revision_get( | expected_revision = self.revision_get( | ||||
snapshot['branches'][branch_name]['target']) | snapshot['branches'][branch_name]['target']) | ||||
self._enrich_revision(expected_revision) | self._enrich_revision(expected_revision) | ||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, expected_revision) | self.assertEqual(rv.data, expected_revision) | ||||
@given(unknown_origin_id()) | @given(unknown_origin_id()) | ||||
def test_api_directory_through_revision_origin_ko(self, | def test_api_directory_through_revision_origin_ko(self, | ||||
unknown_origin_id): | unknown_origin_id): | ||||
url = reverse('api-revision-origin-directory', | url = reverse('api-revision-origin-directory', | ||||
url_args={'origin_id': unknown_origin_id}) | url_args={'origin_id': hash_to_hex(unknown_origin_id)}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404, rv.data) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Origin with id %s not found!' % | 'reason': 'Origin with id %s not found!' % | ||||
unknown_origin_id | hash_to_hex(unknown_origin_id) | ||||
}) | }) | ||||
@given(origin()) | @given(origin()) | ||||
def test_api_directory_through_revision_origin(self, origin): | def test_api_directory_through_revision_origin(self, origin): | ||||
url = reverse('api-revision-origin-directory', | url = reverse('api-revision-origin-directory', | ||||
url_args={'origin_id': origin['id']}) | url_args={'origin_id': hash_to_hex(origin['id'])}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
snapshot = self.snapshot_get_latest(origin['id']) | snapshot = self.snapshot_get_latest(origin['id']) | ||||
revision_id = snapshot['branches']['HEAD']['target'] | revision_id = snapshot['branches']['HEAD']['target'] | ||||
revision = self.revision_get(revision_id) | revision = self.revision_get(revision_id) | ||||
directory = self.directory_ls(revision['directory']) | directory = self.directory_ls(revision['directory']) | ||||
for entry in directory: | for entry in directory: | ||||
if entry['type'] == 'dir': | if entry['type'] == 'dir': | ||||
entry['target_url'] = reverse( | entry['target_url'] = reverse( | ||||
'api-directory', | 'api-directory', | ||||
url_args={'sha1_git': entry['target']} | url_args={'sha1_git': entry['target']} | ||||
) | ) | ||||
entry['dir_url'] = reverse( | entry['dir_url'] = reverse( | ||||
'api-revision-origin-directory', | 'api-revision-origin-directory', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'path': entry['name']}) | 'path': entry['name']}) | ||||
elif entry['type'] == 'file': | elif entry['type'] == 'file': | ||||
entry['target_url'] = reverse( | entry['target_url'] = reverse( | ||||
'api-content', | 'api-content', | ||||
url_args={'q': 'sha1_git:%s' % entry['target']} | url_args={'q': 'sha1_git:%s' % entry['target']} | ||||
) | ) | ||||
entry['file_url'] = reverse( | entry['file_url'] = reverse( | ||||
'api-revision-origin-directory', | 'api-revision-origin-directory', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'path': entry['name']}) | 'path': entry['name']}) | ||||
elif entry['type'] == 'rev': | elif entry['type'] == 'rev': | ||||
entry['target_url'] = reverse( | entry['target_url'] = reverse( | ||||
'api-revision', | 'api-revision', | ||||
url_args={'sha1_git': entry['target']} | url_args={'sha1_git': entry['target']} | ||||
) | ) | ||||
entry['rev_url'] = reverse( | entry['rev_url'] = reverse( | ||||
'api-revision-origin-directory', | 'api-revision-origin-directory', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'path': entry['name']}) | 'path': entry['name']}) | ||||
expected_result = { | expected_result = { | ||||
'content': directory, | 'content': directory, | ||||
'path': '.', | 'path': '.', | ||||
'revision': revision_id, | 'revision': revision_id, | ||||
'type': 'dir' | 'type': 'dir' | ||||
} | } | ||||
▲ Show 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | def test_api_revision_log_context(self, revision): | ||||
self.assertEqual(rv.data, expected_log) | self.assertEqual(rv.data, expected_log) | ||||
@given(origin()) | @given(origin()) | ||||
def test_api_revision_log_by(self, origin): | def test_api_revision_log_by(self, origin): | ||||
per_page = 10 | per_page = 10 | ||||
url = reverse('api-revision-origin-log', | url = reverse('api-revision-origin-log', | ||||
url_args={'origin_id': origin['id']}, | url_args={'origin_id': hash_to_hex(origin['id'])}, | ||||
query_params={'per_page': per_page}) | query_params={'per_page': per_page}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
snapshot = self.snapshot_get_latest(origin['id']) | snapshot = self.snapshot_get_latest(origin['id']) | ||||
expected_log = self.revision_log( | expected_log = self.revision_log( | ||||
snapshot['branches']['HEAD']['target'], limit=per_page+1) | snapshot['branches']['HEAD']['target'], limit=per_page+1) | ||||
expected_log = list(map(self._enrich_revision, expected_log)) | expected_log = list(map(self._enrich_revision, expected_log)) | ||||
has_next = len(expected_log) > per_page | has_next = len(expected_log) > per_page | ||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, | self.assertEqual(rv.data, | ||||
expected_log[:-1] if has_next else expected_log) | expected_log[:-1] if has_next else expected_log) | ||||
if has_next: | if has_next: | ||||
self.assertIn('Link', rv) | self.assertIn('Link', rv) | ||||
next_log_url = reverse( | next_log_url = reverse( | ||||
'api-revision-origin-log', | 'api-revision-origin-log', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'branch_name': 'HEAD'}, | 'branch_name': 'HEAD'}, | ||||
query_params={'per_page': per_page, | query_params={'per_page': per_page, | ||||
'sha1_git': expected_log[-1]['id']}) | 'sha1_git': expected_log[-1]['id']}) | ||||
self.assertIn(next_log_url, rv['Link']) | self.assertIn(next_log_url, rv['Link']) | ||||
@given(origin()) | @given(origin()) | ||||
def test_api_revision_log_by_ko(self, origin): | def test_api_revision_log_by_ko(self, origin): | ||||
invalid_branch_name = 'foobar' | invalid_branch_name = 'foobar' | ||||
url = reverse('api-revision-origin-log', | url = reverse('api-revision-origin-log', | ||||
url_args={'origin_id': origin['id'], | url_args={'origin_id': hash_to_hex(origin['id']), | ||||
'branch_name': invalid_branch_name}) | 'branch_name': invalid_branch_name}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertFalse(rv.has_header('Link')) | self.assertFalse(rv.has_header('Link')) | ||||
self.assertEqual( | self.assertEqual( | ||||
rv.data, | rv.data, | ||||
{'exception': 'NotFoundExc', | {'exception': 'NotFoundExc', | ||||
'reason': 'Revision for origin %s and branch %s not found.' % | 'reason': 'Revision for origin %s and branch %s not found.' % | ||||
(origin['id'], invalid_branch_name)}) | (hash_to_hex(origin['id']), invalid_branch_name)}) | ||||
@patch('swh.web.api.views.revision._revision_directory_by') | @patch('swh.web.api.views.revision._revision_directory_by') | ||||
def test_api_revision_directory_ko_not_found(self, mock_rev_dir): | def test_api_revision_directory_ko_not_found(self, mock_rev_dir): | ||||
# given | # given | ||||
mock_rev_dir.side_effect = NotFoundExc('Not found') | mock_rev_dir.side_effect = NotFoundExc('Not found') | ||||
# then | # then | ||||
rv = self.client.get('/api/1/revision/999/directory/some/path/to/dir/') | rv = self.client.get('/api/1/revision/999/directory/some/path/to/dir/') | ||||
▲ Show 20 Lines • Show All 128 Lines • Show Last 20 Lines |