lightning/tests/tests_app/cli/test_rm.py

110 lines
4.0 KiB
Python

import os
import sys
from unittest.mock import MagicMock
import pytest
from lightning_cloud.openapi import (
Externalv1LightningappInstance,
V1LightningappInstanceArtifact,
V1ListCloudSpacesResponse,
V1ListLightningappInstanceArtifactsResponse,
V1ListLightningappInstancesResponse,
V1ListMembershipsResponse,
V1Membership,
)
from lightning.app.cli.commands import cd, ls, rm
@pytest.mark.skipif(sys.platform == "win32", reason="not supported on windows yet")
def test_rm(monkeypatch):
"""This test validates rm behaves as expected."""
if os.path.exists(cd._CD_FILE):
os.remove(cd._CD_FILE)
client = MagicMock()
client.projects_service_list_memberships.return_value = V1ListMembershipsResponse(
memberships=[
V1Membership(name="project-0", project_id="project-id-0"),
V1Membership(name="project-1", project_id="project-id-1"),
V1Membership(name="project 2", project_id="project-id-2"),
]
)
client.lightningapp_instance_service_list_lightningapp_instances().get.return_value = (
V1ListLightningappInstancesResponse(
lightningapps=[
Externalv1LightningappInstance(
name="app-name-0",
id="app-id-0",
),
Externalv1LightningappInstance(
name="app-name-1",
id="app-id-1",
),
Externalv1LightningappInstance(
name="app name 2",
id="app-id-1",
),
]
)
)
client.cloud_space_service_list_cloud_spaces().get.return_value = V1ListCloudSpacesResponse(cloudspaces=[])
clusters = MagicMock()
clusters.clusters = [MagicMock()]
client.projects_service_list_project_cluster_bindings.return_value = clusters
def fn(*args, prefix, **kwargs):
splits = [split for split in prefix.split("/") if split != ""]
if len(splits) == 2:
return V1ListLightningappInstanceArtifactsResponse(
artifacts=[
V1LightningappInstanceArtifact(filename="file_1.txt"),
V1LightningappInstanceArtifact(filename="folder_1/file_2.txt"),
V1LightningappInstanceArtifact(filename="folder_2/folder_3/file_3.txt"),
V1LightningappInstanceArtifact(filename="folder_2/file_4.txt"),
]
)
elif splits[-1] == "folder_1":
return V1ListLightningappInstanceArtifactsResponse(
artifacts=[V1LightningappInstanceArtifact(filename="file_2.txt")]
)
elif splits[-1] == "folder_2":
return V1ListLightningappInstanceArtifactsResponse(
artifacts=[
V1LightningappInstanceArtifact(filename="folder_3/file_3.txt"),
V1LightningappInstanceArtifact(filename="file_4.txt"),
]
)
elif splits[-1] == "folder_3":
return V1ListLightningappInstanceArtifactsResponse(
artifacts=[
V1LightningappInstanceArtifact(filename="file_3.txt"),
]
)
client.lightningapp_instance_service_list_project_artifacts = fn
client.lightningapp_instance_service_delete_project_artifact = MagicMock()
monkeypatch.setattr(rm, "LightningClient", MagicMock(return_value=client))
monkeypatch.setattr(ls, "LightningClient", MagicMock(return_value=client))
assert ls.ls() == ["project-0", "project-1", "project 2"]
assert "/project-0" == cd.cd("project-0", verify=False)
assert f"/project-0{os.sep}app-name-1" == cd.cd("app-name-1", verify=False)
assert f"/project-0{os.sep}app-name-1{os.sep}folder_1" == cd.cd("folder_1", verify=False)
rm.rm("file_2.txt")
kwargs = client.lightningapp_instance_service_delete_project_artifact._mock_call_args.kwargs
assert kwargs["project_id"] == "project-id-0"
assert kwargs["filename"] == "/lightningapps/app-id-1/folder_1/file_2.txt"
os.remove(cd._CD_FILE)