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
3 changes: 3 additions & 0 deletions plane/models/query_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,13 @@ class WorkItemQueryParams(PaginatedQueryParams):
- fields: Comma-separated fields to include
- order_by: Field to order by (prefix with '-' for descending)
- per_page: Number of results per page (1-100)
- pql: PQL filters
"""

model_config = ConfigDict(extra="ignore", populate_by_name=True)

pql: str | None = Field(None, description="PQL filters")


class RetrieveQueryParams(BaseQueryParams):
"""Query parameters for retrieve endpoints."""
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "plane-sdk"
version = "0.2.8"
version = "0.2.9"
description = "Python SDK for Plane API"
readme = "README.md"
requires-python = ">=3.10"
Expand Down
61 changes: 48 additions & 13 deletions tests/unit/test_work_items.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from plane.client import PlaneClient
from plane.models.projects import Project
from plane.models.query_params import PaginatedQueryParams
from plane.models.query_params import PaginatedQueryParams, WorkItemQueryParams
from plane.models.work_items import AdvancedSearchWorkItem, CreateWorkItem, UpdateWorkItem


Expand All @@ -31,16 +31,55 @@ def test_list_work_items_with_params(
assert hasattr(response, "results")
assert len(response.results) <= 10

def test_list_work_items_with_pql_filter(
self, client: PlaneClient, workspace_slug: str, project: Project
) -> None:
"""Test listing work items with a PQL filter."""
created_item = None
created_item_2 = None

try:
created_item = client.work_items.create(
workspace_slug,
project.id,
CreateWorkItem(
name="pql-filter-high-priority-item",
priority="high",
),
)

created_item_2 = client.work_items.create(
workspace_slug,
project.id,
CreateWorkItem(
name="pql-filter-low-priority-item",
priority="low",
),
)
params = WorkItemQueryParams(pql='priority IN ("high")')
response = client.work_items.list(workspace_slug, project.id, params=params)
assert response is not None
assert hasattr(response, "results")
assert isinstance(response.results, list)
assert len(response.results) > 0
result_ids = [item.id for item in response.results]

assert created_item.id in result_ids
assert created_item_2.id not in result_ids
finally:
if created_item is not None:
client.work_items.delete(workspace_slug, project.id, created_item.id)
if created_item_2 is not None:
client.work_items.delete(workspace_slug, project.id, created_item_2.id)

def test_search_work_items(self, client: PlaneClient, workspace_slug: str) -> None:
"""Test searching work items."""
response = client.work_items.search(workspace_slug, "test")
assert response is not None
assert hasattr(response, "issues")
assert isinstance(response.issues, list)

def test_advanced_search_work_items(
self, client: PlaneClient, workspace_slug: str
) -> None:
def test_advanced_search_work_items(self, client: PlaneClient, workspace_slug: str) -> None:
"""Test advanced search with query only."""
data = AdvancedSearchWorkItem(query="test", limit=10)
results = client.work_items.advanced_search(workspace_slug, data)
Expand All @@ -52,9 +91,7 @@ def test_advanced_search_work_items(
assert item.project_id is not None
assert item.workspace_id is not None

def test_advanced_search_with_filters(
self, client: PlaneClient, workspace_slug: str
) -> None:
def test_advanced_search_with_filters(self, client: PlaneClient, workspace_slug: str) -> None:
"""Test advanced search with filters."""
data = AdvancedSearchWorkItem(
filters={
Expand Down Expand Up @@ -96,6 +133,7 @@ class TestWorkItemsAPICRUD:
def work_item_data(self) -> CreateWorkItem:
"""Create test work item data."""
import time

return CreateWorkItem(
name=f"Test Work Item {int(time.time())}",
description_html="<p>Test work item description</p>",
Expand Down Expand Up @@ -130,7 +168,7 @@ def test_create_work_item(
assert work_item is not None
assert work_item.id is not None
assert work_item.name == work_item_data.name

# Cleanup
try:
client.work_items.delete(workspace_slug, project.id, work_item.id)
Expand Down Expand Up @@ -160,14 +198,12 @@ class TestWorkItemsSubResources:
"""Test WorkItems sub-resources (comments, links, relations, etc.)."""

@pytest.fixture
def work_item(
self, client: PlaneClient, workspace_slug: str, project: Project
):
def work_item(self, client: PlaneClient, workspace_slug: str, project: Project):
"""Create a test work item."""
import time

from plane.models.work_items import CreateWorkItem

work_item_data = CreateWorkItem(
name=f"Test Work Item {int(time.time())}",
description_html="<p>Test work item</p>",
Expand Down Expand Up @@ -217,4 +253,3 @@ def test_list_attachments(
response = client.work_items.attachments.list(workspace_slug, project.id, work_item.id)
assert response is not None
assert isinstance(response, list)