Skip to content

Commit

Permalink
[IO-1800][internal] Set Priority of items (#699)
Browse files Browse the repository at this point in the history
* Implementation

* Linting

* Refactor to simplify

* Improvements to tests

* Test file linting

* Linting

* Another lint fix

* PR Changes suggested

---------

Co-authored-by: Owen <[email protected]>
  • Loading branch information
owencjones and Owen authored Oct 27, 2023
1 parent 009bb2c commit 118c4f4
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 0 deletions.
49 changes: 49 additions & 0 deletions darwin/future/core/items/set_item_priority.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from typing import Dict, List
from uuid import UUID

from darwin.future.core.client import ClientCore
from darwin.future.core.types.common import JSONType
from darwin.future.data_objects.typing import UnknownType


def set_item_priority(
api_client: ClientCore,
team_slug: str,
dataset_id: int,
item_ids: List[UUID],
priority: int,
filters: Dict[str, UnknownType] = {},
) -> JSONType:
"""
Sets the priority of a list of items
Parameters
----------
client: Client
The client to use for the request
team_slug: str
The slug of the team to set the priority for
dataset_id: int
The dataset to set the priority for
item_ids: List[UUID]
The item ids to set the priority for
priority: int
The priority to set
Returns
-------
JSONType
"""
payload = {
"priority": priority,
"filters": {
"item_ids": [str(item_id) for item_id in item_ids],
"dataset_ids": [dataset_id],
**filters,
},
}

return api_client.post(
endpoint=f"/v2/teams/{team_slug}/items/priority",
data=payload,
)
88 changes: 88 additions & 0 deletions darwin/future/tests/core/items/test_set_priority.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
from unittest.mock import Mock
from uuid import UUID

import pytest
import responses

from darwin.exceptions import DarwinException
from darwin.future.core.client import ClientCore
from darwin.future.core.items.set_item_priority import set_item_priority
from darwin.future.tests.core.fixtures import *


@responses.activate
def test_set_item_priority(base_client) -> None:
responses.add(
responses.POST,
base_client.config.api_endpoint + "v2/teams/test-team/items/priority",
json={"affected_item_count": 1},
)

response = set_item_priority(
base_client,
"test-team",
123,
[UUID("00000000-0000-0000-0000-000000000000")],
999,
)

assert response == {"affected_item_count": 1}


def test_set_item_priority_with_filters() -> None:
base_client = Mock(spec=ClientCore)

expected_payload = {
"priority": 10,
"filters": {
"dataset_ids": [123],
"item_ids": ["00000000-0000-0000-0000-000000000000"],
"status": "open",
},
}

# Define the expected endpoint
expected_endpoint = "/v2/teams/test-team/items/priority"

# Define the expected response
expected_response = {"status": "success"}

# Configure the mock API client to return the expected response
base_client.post.return_value = expected_response

# Call the function being tested
response = set_item_priority(
base_client,
"test-team",
123,
[UUID("00000000-0000-0000-0000-000000000000")],
priority=10,
filters={"status": "open"},
)

# Verify that the API client was called with the expected arguments
base_client.post.assert_called_once_with(
endpoint=expected_endpoint,
data=expected_payload,
)

# Verify that the response matches the expected response
assert response == expected_response


def test_set_item_priority_with_error_response() -> None:
# Create a mock API client
api_client = Mock(spec=ClientCore)

# Configure the mock API client to return the error response
api_client.post.side_effect = DarwinException("Something went wrong")

# Call the function being tested
with pytest.raises(DarwinException):
set_item_priority(
api_client=api_client,
team_slug="test-team",
dataset_id=123,
item_ids=[UUID("00000000-0000-0000-0000-000000000000")],
priority=10,
)

0 comments on commit 118c4f4

Please sign in to comment.