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
83 changes: 83 additions & 0 deletions mpt_api_client/resources/integration/extension_documents.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
from mpt_api_client.http import AsyncService, Service
from mpt_api_client.http.mixins import (
AsyncCollectionMixin,
AsyncCreateFileMixin,
AsyncDownloadFileMixin,
AsyncModifiableResourceMixin,
CollectionMixin,
CreateFileMixin,
DownloadFileMixin,
ModifiableResourceMixin,
)
from mpt_api_client.models import Model
from mpt_api_client.models.model import BaseModel
from mpt_api_client.resources.integration.mixins import (
AsyncPublishableMixin,
PublishableMixin,
)


class ExtensionDocument(Model):
"""Extension Document resource.

Attributes:
name: Document name.
revision: Revision number.
type: Document type (Online or File).
description: Document description.
status: Document status (Draft, Published, Unpublished, Deleted).
filename: Original file name.
size: File size in bytes.
content_type: MIME content type.
url: URL to access the document.
language: Language code.
extension: Reference to the extension.
audit: Audit information (created, updated, published, unpublished).
"""

name: str | None
revision: int | None
type: str | None
description: str | None
status: str | None
filename: str | None
size: int | None
content_type: str | None
url: str | None
language: str | None
extension: BaseModel | None
audit: BaseModel | None


class ExtensionDocumentsServiceConfig:
"""Extension Documents service configuration."""

_endpoint = "/public/v1/integration/extensions/{extension_id}/documents"
_model_class = ExtensionDocument
_collection_key = "data"
_upload_file_key = "file"
_upload_data_key = "document"


class ExtensionDocumentsService(
PublishableMixin[ExtensionDocument],
DownloadFileMixin[ExtensionDocument],
CreateFileMixin[ExtensionDocument],
ModifiableResourceMixin[ExtensionDocument],
CollectionMixin[ExtensionDocument],
Service[ExtensionDocument],
ExtensionDocumentsServiceConfig,
):
"""Sync service for /public/v1/integration/extensions/{extensionId}/documents endpoint."""


class AsyncExtensionDocumentsService(
AsyncPublishableMixin[ExtensionDocument],
AsyncDownloadFileMixin[ExtensionDocument],
AsyncCreateFileMixin[ExtensionDocument],
AsyncModifiableResourceMixin[ExtensionDocument],
AsyncCollectionMixin[ExtensionDocument],
AsyncService[ExtensionDocument],
ExtensionDocumentsServiceConfig,
):
"""Async service for /public/v1/integration/extensions/{extensionId}/documents endpoint."""
30 changes: 30 additions & 0 deletions mpt_api_client/resources/integration/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
)
from mpt_api_client.models import Model
from mpt_api_client.models.model import BaseModel
from mpt_api_client.resources.integration.extension_documents import (
AsyncExtensionDocumentsService,
ExtensionDocumentsService,
)
from mpt_api_client.resources.integration.extension_media import (
AsyncExtensionMediaService,
ExtensionMediaService,
Expand Down Expand Up @@ -106,6 +110,19 @@ def media(self, extension_id: str) -> ExtensionMediaService:
http_client=self.http_client, endpoint_params={"extension_id": extension_id}
)

def documents(self, extension_id: str) -> ExtensionDocumentsService:
"""Return extension documents service.

Args:
extension_id: Extension ID.

Returns:
ExtensionDocumentsService instance.
"""
return ExtensionDocumentsService(
http_client=self.http_client, endpoint_params={"extension_id": extension_id}
)


class AsyncExtensionsService(
AsyncExtensionMixin[Extension],
Expand Down Expand Up @@ -137,3 +154,16 @@ def media(self, extension_id: str) -> AsyncExtensionMediaService:
return AsyncExtensionMediaService(
http_client=self.http_client, endpoint_params={"extension_id": extension_id}
)

def documents(self, extension_id: str) -> AsyncExtensionDocumentsService:
"""Return async extension documents service.

Args:
extension_id: Extension ID.

Returns:
AsyncExtensionDocumentsService instance.
"""
return AsyncExtensionDocumentsService(
http_client=self.http_client, endpoint_params={"extension_id": extension_id}
)
Empty file.
52 changes: 52 additions & 0 deletions tests/e2e/integration/extension_documents/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError


@pytest.fixture(scope="session")
def extension_id(e2e_config):
return e2e_config["integration.extension.id"]


@pytest.fixture
def extension_documents_service(mpt_vendor, extension_id):
return mpt_vendor.integration.extensions.documents(extension_id)


@pytest.fixture
def async_extension_documents_service(async_mpt_vendor, extension_id):
return async_mpt_vendor.integration.extensions.documents(extension_id)


@pytest.fixture
def document_data(short_uuid):
return {
"name": f"e2e - please delete {short_uuid}",
"description": "Created by automated E2E tests. Safe to delete.",
"language": "en-US",
"documentType": "File",
}


@pytest.fixture
def created_document(extension_documents_service, document_data, pdf_fd):
document = extension_documents_service.create(document_data, file=pdf_fd)

yield document

try:
extension_documents_service.delete(document.id)
except MPTAPIError as error:
print(f"TEARDOWN - Unable to delete document {document.id}: {error.title}") # noqa: WPS421


@pytest.fixture
async def async_created_document(async_extension_documents_service, document_data, pdf_fd):
document = await async_extension_documents_service.create(document_data, file=pdf_fd)

yield document

try:
await async_extension_documents_service.delete(document.id)
except MPTAPIError as error:
print(f"TEARDOWN - Unable to delete document {document.id}: {error.title}") # noqa: WPS421
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import pytest

from tests.e2e.helper import assert_async_service_filter_with_iterate

pytestmark = [
pytest.mark.flaky,
]


def test_create_extension_document(async_created_document, document_data):
result = async_created_document.name

assert result == document_data["name"]


async def test_filter_extension_documents(
async_extension_documents_service, async_created_document
):
await assert_async_service_filter_with_iterate(
async_extension_documents_service, async_created_document.id, None
) # act


async def test_update_extension_document(
async_extension_documents_service, async_created_document, short_uuid
):
update_data = {"name": f"e2e updated {short_uuid}"}

result = await async_extension_documents_service.update(async_created_document.id, update_data)

assert result.name == update_data["name"]


async def test_publish_extension_document(
async_extension_documents_service, async_created_document
):
result = await async_extension_documents_service.publish(async_created_document.id)

assert result.status == "Published"


async def test_download_extension_document(
async_extension_documents_service, async_created_document
):
result = await async_extension_documents_service.download(async_created_document.id)

assert result.file_contents is not None


async def test_unpublish_extension_document(
async_extension_documents_service, async_created_document
):
await async_extension_documents_service.publish(async_created_document.id)

result = await async_extension_documents_service.unpublish(async_created_document.id)

assert result.status == "Unpublished"


async def test_delete_extension_document(async_extension_documents_service, async_created_document):
await async_extension_documents_service.delete(async_created_document.id) # act
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import pytest

from tests.e2e.helper import assert_service_filter_with_iterate

pytestmark = [
pytest.mark.flaky,
]


def test_create_extension_document(created_document, document_data):
result = created_document.name

assert result == document_data["name"]


def test_filter_extension_documents(extension_documents_service, created_document):
assert_service_filter_with_iterate(
extension_documents_service, created_document.id, None
) # act


def test_update_extension_document(extension_documents_service, created_document, short_uuid):
update_data = {"name": f"e2e updated {short_uuid}"}

result = extension_documents_service.update(created_document.id, update_data)

assert result.name == update_data["name"]


def test_publish_extension_document(extension_documents_service, created_document):
result = extension_documents_service.publish(created_document.id)

assert result.status == "Published"


def test_download_extension_document(extension_documents_service, created_document):
result = extension_documents_service.download(created_document.id)

assert result.file_contents is not None


def test_unpublish_extension_document(extension_documents_service, created_document):
extension_documents_service.publish(created_document.id)

result = extension_documents_service.unpublish(created_document.id)

assert result.status == "Unpublished"


def test_delete_extension_document(extension_documents_service, created_document):
extension_documents_service.delete(created_document.id) # act
Loading