Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions app/services/file_manager/file_metadata/file_metadata_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import app.services.logger_services.log_functions as logger
import app.services.output_manager.message_handler as message_handler
from app.models.item import ItemType
from app.services.output_manager.error_handler import ECustomizedError
from app.services.output_manager.error_handler import customized_error_msg
from app.utils.aggregated import get_attribute_template_by_id
Expand Down Expand Up @@ -109,14 +110,15 @@ def download_file_metadata(self) -> List[Dict[str, Any]]:
"""

project_code, object_path = self.file_path.split('/', 1)
root_folder, object_path = object_path.split('/', 1)
root_type = ItemType.get_type_from_keyword(root_folder)
object_path = join(root_type.get_prefix_by_type(), object_path)
item_res = search_item(project_code, self.zone, object_path)
# double check if the file is in shared folder
if item_res.get('code') == 404:
item_res = search_item(project_code, self.zone, f'shared/{object_path}')
if item_res.get('code') == 404:
logger.error(f'Cannot find item {self.file_path} at {self.zone}.')
exit(1)
logger.error(f'Cannot find item {self.file_path} at {self.zone}.')
exit(1)

# filter out item metadata
item_res = item_res.get('result', {})
extra_info = item_res.pop('extended', {}).get('extra')
tags = extra_info.get('tags', [])
Expand Down
2 changes: 1 addition & 1 deletion app/services/project_manager/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,4 @@ def list_projects(self, page, page_size, order, order_by):
else:
SrvErrorHandler.default_handle(response.content, True)
except Exception:
SrvErrorHandler.default_handle(response.content, True)
SrvErrorHandler.default_handle('Error when listing projects', True)
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,30 @@
#
# Contact Indoc Systems for any questions regarding the use of this source code.

import pytest

from app.configs.app_config import AppConfig
from app.models.item import ItemType
from app.services.file_manager.file_metadata.file_metadata_client import FileMetaClient
from tests.conftest import decoded_token


def test_file_metadata_client_get_detail_success(mocker, httpx_mock):
@pytest.mark.parametrize(
'root_folder',
[ItemType.NAMEFOLDER, ItemType.SHAREDFOLDER],
)
def test_file_metadata_client_get_detail_success(mocker, httpx_mock, root_folder: ItemType):
file_name = 'test_file.txt'
project_code = 'project_code'
item_info = {
'id': 'test',
'parent_id': 'test_parent',
'parent_path': '',
'name': 'admin',
'parent_path': root_folder.get_prefix_by_type(),
'name': file_name,
'zone': 0,
'status': 'ACTIVE',
'container_code': project_code,
'container_type': 'project',
}
tags = ['test']
attri_template_uid = 'template_uid'
Expand All @@ -41,24 +52,34 @@ def test_file_metadata_client_get_detail_success(mocker, httpx_mock):
return_value=None,
)

file_meta_client = FileMetaClient('zone', 'project_code/object_path', 'general', 'attr', 'tag')
assert file_meta_client.project_code == 'project_code'
assert file_meta_client.object_path == 'object_path'
file_meta_client = FileMetaClient(
'zone', f'{project_code}/{root_folder.get_prefix_by_type()}/{file_name}', 'general', 'attr', 'tag'
)
assert file_meta_client.project_code == project_code
assert file_meta_client.object_path == f'{root_folder.get_prefix_by_type()}/{file_name}'

item_info, res_attributes, tags = file_meta_client.download_file_metadata()
assert item_info == item_info
assert res_attributes == {attri_template_name: attributes.get(attri_template_uid)}
assert tags == tags


def test_file_metadata_client_get_detail_success_with_no_tag_attributes(mocker, httpx_mock):
@pytest.mark.parametrize(
'root_folder',
[ItemType.NAMEFOLDER, ItemType.SHAREDFOLDER],
)
def test_file_metadata_client_get_detail_success_with_no_tag_attributes(mocker, root_folder: ItemType):
file_name = 'test_file.txt'
project_code = 'project_code'
item_info = {
'id': 'test',
'parent_id': 'test_parent',
'parent_path': '',
'name': 'admin',
'parent_path': root_folder.get_prefix_by_type(),
'name': file_name,
'zone': 0,
'status': 'ACTIVE',
'container_code': project_code,
'container_type': 'project',
}

mocker.patch(
Expand All @@ -76,84 +97,44 @@ def test_file_metadata_client_get_detail_success_with_no_tag_attributes(mocker,
return_value=None,
)

file_meta_client = FileMetaClient('zone', 'project_code/object_path', 'general', 'attr', 'tag')
assert file_meta_client.project_code == 'project_code'
assert file_meta_client.object_path == 'object_path'
file_meta_client = FileMetaClient(
'zone', f'{project_code}/{root_folder.get_prefix_by_type()}/{file_name}', 'general', 'attr', 'tag'
)
assert file_meta_client.project_code == project_code
assert file_meta_client.object_path == f'{root_folder.get_prefix_by_type()}/{file_name}'

item_info, res_attributes, tags = file_meta_client.download_file_metadata()
assert item_info == item_info
assert res_attributes == {}
assert tags == tags


def test_metadata_download_from_project_folder(mocker, httpx_mock):
item_info = {
'id': 'test',
'parent_id': 'test_parent',
'parent_path': 'shared/path',
'name': 'admin',
'zone': 0,
'status': 'ACTIVE',
}
tags = ['test']
attri_template_uid = 'template_uid'
attri_template_name = 'template_name'
attributes = {attri_template_uid: {'attr_1': 'value'}}

@pytest.mark.parametrize(
'root_folder',
[ItemType.NAMEFOLDER, ItemType.SHAREDFOLDER],
)
def test_metadata_download_fail_when_file_doesnot_exist(mocker, capfd, root_folder: ItemType):
mocker.patch(
'app.services.user_authentication.token_manager.SrvTokenManager.decode_access_token',
return_value=decoded_token(),
)

search_mock = mocker.patch(
'app.services.file_manager.file_metadata.file_metadata_client.search_item',
)
search_mock.side_effect = [
{'result': {}, 'code': 404},
{'result': {**item_info, 'extended': {'extra': {'tags': tags, 'attributes': attributes}}}},
]
httpx_mock.add_response(
url=AppConfig.Connections.url_portal + f'/v1/data/manifest/{attri_template_uid}',
method='GET',
json={'result': {'id': attri_template_uid, 'name': attri_template_name}},
return_value={'result': {}, 'code': 404},
)

mocker.patch(
'app.services.file_manager.file_metadata.file_metadata_client.FileMetaClient.save_file_metadata',
return_value=None,
file_meta_client = FileMetaClient(
'zone', f'project_code/{root_folder.get_prefix_by_type()}/file_name', 'general', 'attr', 'tag'
)

file_meta_client = FileMetaClient('zone', 'project_code/object_path', 'general', 'attr', 'tag')
assert file_meta_client.project_code == 'project_code'
assert file_meta_client.object_path == 'object_path'

item_info, res_attributes, tags = file_meta_client.download_file_metadata()
assert item_info == item_info
assert res_attributes == {attri_template_name: attributes.get(attri_template_uid)}
assert tags == tags
assert search_mock.call_count == 2


def test_metadata_download_fail_when_file_doesnot_exist(mocker, capfd):
mocker.patch(
'app.services.user_authentication.token_manager.SrvTokenManager.decode_access_token',
return_value=decoded_token(),
)

search_mock = mocker.patch(
'app.services.file_manager.file_metadata.file_metadata_client.search_item',
)
search_mock.side_effect = [{'result': {}, 'code': 404}, {'result': {}, 'code': 404}]

file_meta_client = FileMetaClient('zone', 'project_code/object_path', 'general', 'attr', 'tag')

try:
file_meta_client.download_file_metadata()
except SystemExit:
assert search_mock.call_count == 2
assert search_mock.call_count == 1
out, _ = capfd.readouterr()

expect = 'Cannot find item project_code/object_path at zone.\n'
expect = f'Cannot find item project_code/{root_folder.get_prefix_by_type()}/file_name at zone.\n'
assert out == expect
else:
AssertionError('SystemExit not raised')