Skip to content

Commit 7b2f764

Browse files
authored
Merge pull request #1 from utking/Switch-to-working-with-Confluence-Cloud
Switch to work with Confluence Cloud
2 parents 3e45f1a + a20d257 commit 7b2f764

File tree

2 files changed

+63
-28
lines changed

2 files changed

+63
-28
lines changed

src/confluence/confluence.py

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from enum import Enum
22
from datetime import datetime
33
from .confluence_elements import ConfluenceElements
4-
from atlassian import Confluence
4+
import requests
55

66

77
class HeaderSize(Enum):
@@ -25,12 +25,6 @@ def __init__(self, url: str, api_username: str, api_password: str, page_id: str,
2525
self.__page_id = page_id
2626
self.__page_title = page_title
2727

28-
self.app = Confluence(
29-
url=self.__url,
30-
username=self.__api_username,
31-
password=self.__api_password,
32-
)
33-
3428
def append_string(self, content: str) -> None:
3529
"""
3630
Appends a single string to the content
@@ -51,14 +45,44 @@ def append_block(self, title_size: HeaderSize, title_text: str,
5145

5246
def update_page(self):
5347
"""
54-
Publishes the prepared content. If you want to test the content first,
48+
Publishes the prepared content to Confluence Cloud. If you want to test the content first,
5549
please check printContent()
5650
"""
57-
return self.app.update_page(
58-
page_id=self.__page_id,
59-
title=self.__page_title,
60-
body=self.__content
61-
)
51+
try:
52+
if self.__page_id:
53+
try:
54+
# Make GET request to retrieve current page info and version number
55+
page_info = requests.get(self.__url, auth=(self.__api_username, self.__api_password)).json()
56+
current_version = page_info['version']['number']
57+
# Prepare update payload
58+
update_payload = {
59+
"id": self.__page_id,
60+
"status": "current",
61+
"title": self.__page_title,
62+
"body": {
63+
"representation": "storage",
64+
"value": self.__content,
65+
},
66+
"version": {
67+
"number": current_version + 1,
68+
},
69+
}
70+
# Make PUT request to update the page
71+
response = requests.put(self.__url, json=update_payload, auth=(self.__api_username, self.__api_password))
72+
response.raise_for_status()
73+
except Exception as e:
74+
raise Exception(f"An error occurred during page update: {e}")
75+
else:
76+
raise Exception("Page ID is not specified!")
77+
78+
except Exception as e:
79+
print(f"An error occurred: {e}")
80+
81+
def get_content(self) -> str:
82+
"""
83+
Returns the prepared content as a string. Can be used for test purposes
84+
"""
85+
return self.__content
6286

6387
def printContent(self) -> None:
6488
"""

tests/test_confluence.py

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import unittest
22

3-
from unittest.mock import patch
3+
from unittest.mock import patch, MagicMock
44
from src.confluence import HeaderSize, ConfluenceGenerator, ConfluenceElements
5-
from atlassian import Confluence
65
from freezegun import freeze_time
76

87

@@ -22,11 +21,7 @@ def test_H4(self):
2221
def test_H5_fail(self):
2322
self.assertRaises(AttributeError)
2423

25-
def confluence_app(self, url: str, username: str, password: str):
26-
return None
27-
2824
@freeze_time("2012-01-01")
29-
@patch.object(Confluence, '__init__', confluence_app)
3025
def test_append_string(self):
3126
confluence = ConfluenceGenerator("url", "api_username", "api_password", "page_id", "page_title")
3227
confluence.append_string("test")
@@ -44,9 +39,8 @@ def test_append_string(self):
4439

4540
def confluence_elements_render(title_text: str, title_size: int, table_headers: list, table_data: list):
4641
return "TestRender"
47-
42+
4843
@freeze_time("2012-01-01")
49-
@patch.object(Confluence, '__init__', confluence_app)
5044
@patch.object(ConfluenceElements, 'render', confluence_elements_render)
5145
def test_append_block(self):
5246
confluence = ConfluenceGenerator("url", "api_username", "api_password", "page_id", "page_title")
@@ -68,18 +62,35 @@ def test_append_block(self):
6862
confluence._ConfluenceGenerator__content
6963
)
7064

71-
def confluence_update_page(self, page_id, title, body):
72-
return True
73-
7465
@freeze_time("2012-01-01")
75-
@patch.object(Confluence, '__init__', confluence_app)
76-
@patch.object(Confluence, 'update_page', confluence_update_page)
77-
def test_update_page(self):
66+
@patch('src.confluence.confluence.requests.put')
67+
@patch('src.confluence.confluence.requests.get')
68+
def test_update_page(self, mock_get, mock_put):
69+
mock_get.return_value.json.return_value = {'version': {'number': 5}}
70+
mock_put.return_value.raise_for_status = MagicMock()
71+
7872
confluence = ConfluenceGenerator("url", "api_username", "api_password", "page_id", "page_title")
7973

8074
self.assertEqual(
8175
"<ac:structured-macro ac:name=\"toc\"><ac:parameter ac:name=\"levels\">2</ac:parameter></ac:structured-macro><p>Automatically generated at 01/01/2012 00:00:00</p>",
8276
confluence._ConfluenceGenerator__content
8377
)
8478

85-
self.assertTrue(confluence.update_page())
79+
confluence.update_page()
80+
81+
mock_get.assert_called_once_with("url", auth=("api_username", "api_password"))
82+
mock_put.assert_called_once_with(
83+
"url",
84+
json={
85+
"id": "page_id",
86+
"status": "current",
87+
"title": "page_title",
88+
"body": {
89+
"representation": "storage",
90+
"value": confluence._ConfluenceGenerator__content,
91+
},
92+
"version": {"number": 6},
93+
},
94+
auth=("api_username", "api_password"),
95+
)
96+
mock_put.return_value.raise_for_status.assert_called_once()

0 commit comments

Comments
 (0)