Skip to content

Commit

Permalink
Merge branch 'main' into sdk-sanitise-proxy-credentials-when-logging
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszsocha2 committed Dec 27, 2022
2 parents 1cd24a4 + e2d1846 commit 6c41484
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 8 deletions.
45 changes: 43 additions & 2 deletions boxsdk/object/trash.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import json
from typing import Iterable, TYPE_CHECKING, Optional

from boxsdk.pagination.marker_based_object_collection import MarkerBasedObjectCollection

from .base_endpoint import BaseEndpoint

from ..pagination.limit_offset_based_object_collection import LimitOffsetBasedObjectCollection
Expand Down Expand Up @@ -69,7 +71,8 @@ def restore_item(
params = {}
if fields:
params['fields'] = ','.join(fields)
box_response = self._session.post(url, data=json.dumps(body), params=params)
box_response = self._session.post(
url, data=json.dumps(body), params=params)
response = box_response.json()
return self.translator.translate(
session=self._session,
Expand All @@ -91,7 +94,16 @@ def permanently_delete_item(self, item: 'BaseItem') -> bool:
return box_response.ok

@api_call
def get_items(self, limit: Optional[int] = None, offset: Optional[int] = None, fields: Iterable[str] = None) -> 'BoxObjectCollection':
def get_items(
self,
limit: Optional[int] = None,
offset: Optional[int] = None,
fields: Iterable[str] = None,
marker: Optional[str] = None,
use_marker: bool = False,
sort: Optional[str] = None,
direction: Optional[str] = None
) -> 'BoxObjectCollection':
"""
Using limit-offset paging, get the files, folders and web links that are in the user's trash.
Expand All @@ -101,14 +113,43 @@ def get_items(self, limit: Optional[int] = None, offset: Optional[int] = None, f
The offset of the item at which to begin the response.
:param fields:
List of fields to request.
:param marker:
The marker at which to begin the response.
:param use_marker:
Whether or not to use marker-based paging.
:param sort:
The field to sort by. Can be 'id', 'name', 'date' or 'size'.
:param direction:
The direction to sort. Can be 'ASC' or 'DESC'.
:returns:
An iterator of the entries in the trash
"""
additional_params = {}
if limit is not None:
additional_params['limit'] = limit
if direction:
additional_params['direction'] = direction
if sort:
additional_params['sort'] = sort

if use_marker:
additional_params['usemarker'] = True
return MarkerBasedObjectCollection(
url=self._session.get_url('folders', 'trash', 'items'),
session=self._session,
limit=limit,
marker=marker,
fields=fields,
additional_params=additional_params,
return_full_pages=False,
)

return LimitOffsetBasedObjectCollection(
session=self._session,
url=self._session.get_url('folders', 'trash', 'items'),
limit=limit,
offset=offset,
fields=fields,
return_full_pages=False,
additional_params=additional_params,
)
63 changes: 63 additions & 0 deletions test/integration_new/object/trash_itest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
from datetime import datetime

import pytest
from boxsdk.pagination.limit_offset_based_object_collection import LimitOffsetBasedObjectCollection
from boxsdk.pagination.marker_based_object_collection import MarkerBasedObjectCollection

from test.integration_new import util
from test.integration_new import CLIENT
from test.integration_new.context_managers.box_test_file import BoxTestFile
from test.integration_new.context_managers.box_test_folder import BoxTestFolder

FILE_TESTS_DIRECTORY_NAME = 'file-integration-tests'


@pytest.fixture(scope="module", autouse=True)
def parent_folder():
with BoxTestFolder(name=f'{FILE_TESTS_DIRECTORY_NAME} {datetime.now()}') as folder:
yield folder


def test_trash_get_items(parent_folder, small_file_path):
name = f'{util.random_name()}.pdf'
test_file = parent_folder.upload(file_path=small_file_path, file_name=name)
test_file.delete()
try:
trash_items = CLIENT.trash().get_items()
assert test_file.id in [item.id for item in trash_items]
finally:
CLIENT.trash().permanently_delete_item(test_file)


def test_trash_restore_item(parent_folder, small_file_path):
with BoxTestFile(parent_folder=parent_folder, file_path=small_file_path) as test_file:
test_file.delete()
trash_items = CLIENT.trash().get_items()
assert test_file.id in [item.id for item in trash_items]
CLIENT.trash().restore_item(test_file)
folder_items = parent_folder.get_items()
assert test_file.id in [item.id for item in folder_items]


def test_trash_get_items_with_offset(parent_folder, small_file_path):
name = f'{util.random_name()}.pdf'
test_file = parent_folder.upload(file_path=small_file_path, file_name=name)
test_file.delete()
try:
trash_items = CLIENT.trash().get_items()
assert isinstance(trash_items, LimitOffsetBasedObjectCollection)
assert test_file.id in [item.id for item in trash_items]
finally:
CLIENT.trash().permanently_delete_item(test_file)


def test_trash_get_items_with_marker(parent_folder, small_file_path):
name = f'{util.random_name()}.pdf'
test_file = parent_folder.upload(file_path=small_file_path, file_name=name)
test_file.delete()
try:
trash_items = CLIENT.trash().get_items(limit=100, use_marker=True)
assert isinstance(trash_items, MarkerBasedObjectCollection)
assert test_file.id in [item.id for item in trash_items]
finally:
CLIENT.trash().permanently_delete_item(test_file)
65 changes: 59 additions & 6 deletions test/unit/object/test_trash.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,10 @@ def test_get_from_trash(test_item_and_response, test_trash, mock_box_session):
'id': '11111',
},
}
trashed_item_info = test_trash.get_item(item=test_item, fields=['created_at', 'modified_at'])
mock_box_session.get.assert_called_once_with(expected_url, params={'fields': 'created_at,modified_at'})
trashed_item_info = test_trash.get_item(
item=test_item, fields=['created_at', 'modified_at'])
mock_box_session.get.assert_called_once_with(
expected_url, params={'fields': 'created_at,modified_at'})
assert isinstance(trashed_item_info, test_item.__class__)
assert trashed_item_info.object_type == test_item.object_type
assert trashed_item_info.object_id == test_item.object_id
Expand Down Expand Up @@ -73,8 +75,10 @@ def test_restore_from_trash(test_item_and_response, test_trash, test_folder, moc
'id': '11111',
},
}
restored_item = test_trash.restore_item(test_item, new_name, test_folder, ['created_at', 'modified_at'])
mock_box_session.post.assert_called_once_with(expected_url, data=value, params={'fields': 'created_at,modified_at'})
restored_item = test_trash.restore_item(test_item, new_name, test_folder, [
'created_at', 'modified_at'])
mock_box_session.post.assert_called_once_with(expected_url, data=value, params={
'fields': 'created_at,modified_at'})
assert isinstance(restored_item, test_item.__class__)
assert restored_item.object_type == test_item.object_type
assert restored_item.object_id == test_item.object_id
Expand All @@ -90,7 +94,8 @@ def test_permanently_delete(test_item_and_response, test_trash, mock_box_session
expected_url = f'{API.BASE_API_URL}/{test_item.object_type + "s"}/{test_item.object_id}/trash'
mock_box_session.delete.return_value.ok = True
info = test_trash.permanently_delete_item(test_item)
mock_box_session.delete.assert_called_once_with(expected_url, expect_json_response=False)
mock_box_session.delete.assert_called_once_with(
expected_url, expect_json_response=False)
assert info is True


Expand All @@ -111,7 +116,55 @@ def test_get_trashed_items(test_item_and_response, test_trash, mock_box_session)
}
trashed_items = test_trash.get_items(fields=['name'])
trashed_item = trashed_items.next()
mock_box_session.get.assert_called_once_with(expected_url, params={'fields': 'name', 'offset': None})
mock_box_session.get.assert_called_once_with(
expected_url, params={'fields': 'name', 'offset': None})
assert isinstance(trashed_item, test_item.__class__)
assert trashed_item.type == mock_trash['type']
assert trashed_item.id == mock_trash['id']
assert trashed_item.name == item_name


def test_get_trashed_items_with_sort(test_item_and_response, test_trash, mock_box_session):
test_item, _ = test_item_and_response
expected_url = f'{API.BASE_API_URL}/folders/trash/items'
mock_trash = {
'type': test_item.object_type,
'id': test_item.object_id,
'name': 'Test Trashed Item'
}
mock_box_session.get.return_value.json.return_value = {
'total_count': 5,
'offset': 0,
'limit': 100,
'entries': [mock_trash]
}
trashed_items = test_trash.get_items(fields=['name'], sort='name', direction='ASC')
trashed_item = trashed_items.next()
mock_box_session.get.assert_called_once_with(
expected_url, params={'direction': 'ASC', 'sort': 'name', 'offset': None, 'fields': 'name'})
assert isinstance(trashed_item, test_item.__class__)


def test_get_trashed_items_with_marker(test_item_and_response, test_trash, mock_box_session):
test_item, _ = test_item_and_response
item_name = 'Test Trashed Item'
expected_url = f'{API.BASE_API_URL}/folders/trash/items'
mock_trash = {
'type': test_item.object_type,
'id': test_item.object_id,
'name': 'Test Trashed Item'
}
mock_box_session.get.return_value.json.return_value = {
'limit': 100,
'next_marker': 2345,
'entries': [mock_trash]
}
trashed_items = test_trash.get_items(
fields=['name'], limit=100, marker=1234, use_marker=True)
trashed_item = trashed_items.next()

mock_box_session.get.assert_called_once_with(expected_url, params={
'limit': 100, 'usemarker': True, 'marker': 1234, 'fields': 'name'})
assert isinstance(trashed_item, test_item.__class__)
assert trashed_item.type == mock_trash['type']
assert trashed_item.id == mock_trash['id']
Expand Down

0 comments on commit 6c41484

Please sign in to comment.