|
36 | 36 | OAuthError, |
37 | 37 | ServerError, |
38 | 38 | TableAlreadyExistsError, |
| 39 | + ViewAlreadyExistsError, |
39 | 40 | ) |
40 | 41 | from pyiceberg.io import load_file_io |
41 | 42 | from pyiceberg.partitioning import PartitionField, PartitionSpec |
@@ -1621,3 +1622,65 @@ def test_drop_view_204(rest_mock: Mocker) -> None: |
1621 | 1622 | request_headers=TEST_HEADERS, |
1622 | 1623 | ) |
1623 | 1624 | RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN).drop_view(("some_namespace", "some_view")) |
| 1625 | + |
| 1626 | + |
| 1627 | +def test_rename_view_204(rest_mock: Mocker) -> None: |
| 1628 | + from_identifier = ("some_namespace", "old_view") |
| 1629 | + to_identifier = ("some_namespace", "new_view") |
| 1630 | + rest_mock.post( |
| 1631 | + f"{TEST_URI}v1/views/rename", |
| 1632 | + json={ |
| 1633 | + "source": {"namespace": ["some_namespace"], "name": "old_view"}, |
| 1634 | + "destination": {"namespace": ["some_namespace"], "name": "new_view"}, |
| 1635 | + }, |
| 1636 | + status_code=204, |
| 1637 | + request_headers=TEST_HEADERS, |
| 1638 | + ) |
| 1639 | + catalog = RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN) |
| 1640 | + catalog.rename_view(from_identifier, to_identifier) |
| 1641 | + assert ( |
| 1642 | + rest_mock.last_request.text |
| 1643 | + == """{"source": {"namespace": ["some_namespace"], "name": "old_view"}, "destination": {"namespace": ["some_namespace"], "name": "new_view"}}""" |
| 1644 | + ) |
| 1645 | + |
| 1646 | + |
| 1647 | +def test_rename_view_404(rest_mock: Mocker) -> None: |
| 1648 | + from_identifier = ("some_namespace", "non_existent_view") |
| 1649 | + to_identifier = ("some_namespace", "new_view") |
| 1650 | + rest_mock.post( |
| 1651 | + f"{TEST_URI}v1/views/rename", |
| 1652 | + json={ |
| 1653 | + "error": { |
| 1654 | + "message": "View does not exist: some_namespace.non_existent_view", |
| 1655 | + "type": "NoSuchViewException", |
| 1656 | + "code": 404, |
| 1657 | + } |
| 1658 | + }, |
| 1659 | + status_code=404, |
| 1660 | + request_headers=TEST_HEADERS, |
| 1661 | + ) |
| 1662 | + catalog = RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN) |
| 1663 | + with pytest.raises(NoSuchViewError) as exc_info: |
| 1664 | + catalog.rename_view(from_identifier, to_identifier) |
| 1665 | + assert "View does not exist: some_namespace.non_existent_view" in str(exc_info.value) |
| 1666 | + |
| 1667 | + |
| 1668 | +def test_rename_view_409(rest_mock: Mocker) -> None: |
| 1669 | + from_identifier = ("some_namespace", "old_view") |
| 1670 | + to_identifier = ("some_namespace", "existing_view") |
| 1671 | + rest_mock.post( |
| 1672 | + f"{TEST_URI}v1/views/rename", |
| 1673 | + json={ |
| 1674 | + "error": { |
| 1675 | + "message": "View already exists: some_namespace.existing_view", |
| 1676 | + "type": "ViewAlreadyExistsException", |
| 1677 | + "code": 409, |
| 1678 | + } |
| 1679 | + }, |
| 1680 | + status_code=409, |
| 1681 | + request_headers=TEST_HEADERS, |
| 1682 | + ) |
| 1683 | + catalog = RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN) |
| 1684 | + with pytest.raises(ViewAlreadyExistsError) as exc_info: |
| 1685 | + catalog.rename_view(from_identifier, to_identifier) |
| 1686 | + assert "View already exists: some_namespace.existing_view" in str(exc_info.value) |
0 commit comments