4
4
import logging
5
5
import platform
6
6
import subprocess
7
+ from unittest import TestCase
7
8
from unittest .mock import MagicMock , Mock , PropertyMock , call , mock_open , patch , sentinel
8
9
9
10
import pytest
37
38
38
39
CREATE_CLUSTER_CONF_PATH = "/etc/postgresql-common/createcluster.d/pgcharm.conf"
39
40
41
+ # used for assert functions
42
+ tc = TestCase ()
43
+
40
44
41
45
@pytest .fixture (autouse = True )
42
46
def harness ():
@@ -165,7 +169,9 @@ def test_patroni_scrape_config_tls(harness):
165
169
166
170
167
171
def test_primary_endpoint (harness ):
168
- with patch (
172
+ with patch ("charm.stop_after_delay" , new_callable = PropertyMock ) as _stop_after_delay , patch (
173
+ "charm.wait_fixed" , new_callable = PropertyMock
174
+ ) as _wait_fixed , patch (
169
175
"charm.PostgresqlOperatorCharm._units_ips" ,
170
176
new_callable = PropertyMock ,
171
177
return_value = {"1.1.1.1" , "1.1.1.2" },
@@ -174,6 +180,10 @@ def test_primary_endpoint(harness):
174
180
_patroni .return_value .get_primary .return_value = sentinel .primary
175
181
assert harness .charm .primary_endpoint == "1.1.1.1"
176
182
183
+ # Check needed to ensure a fast charm deployment.
184
+ _stop_after_delay .assert_called_once_with (5 )
185
+ _wait_fixed .assert_called_once_with (3 )
186
+
177
187
_patroni .return_value .get_member_ip .assert_called_once_with (sentinel .primary )
178
188
_patroni .return_value .get_primary .assert_called_once_with ()
179
189
@@ -547,6 +557,9 @@ def test_enable_disable_extensions(harness, caplog):
547
557
@patch_network_get (private_address = "1.1.1.1" )
548
558
def test_on_start (harness ):
549
559
with (
560
+ patch (
561
+ "charm.PostgresqlOperatorCharm._set_primary_status_message"
562
+ ) as _set_primary_status_message ,
550
563
patch (
551
564
"charm.PostgresqlOperatorCharm.enable_disable_extensions"
552
565
) as _enable_disable_extensions ,
@@ -622,7 +635,7 @@ def test_on_start(harness):
622
635
assert _postgresql .create_user .call_count == 4 # Considering the previous failed call.
623
636
_oversee_users .assert_called_once ()
624
637
_enable_disable_extensions .assert_called_once ()
625
- assert isinstance ( harness . model . unit . status , ActiveStatus )
638
+ _set_primary_status_message . assert_called_once ( )
626
639
627
640
628
641
@patch_network_get (private_address = "1.1.1.1" )
@@ -2256,16 +2269,21 @@ def test_update_new_unit_status(harness):
2256
2269
handle_read_only_mode .assert_not_called ()
2257
2270
assert isinstance (harness .charm .unit .status , WaitingStatus )
2258
2271
2259
- @patch ("charm.Patroni.member_started" , new_callable = PropertyMock )
2260
- @patch ("charm.PostgresqlOperatorCharm.is_standby_leader" , new_callable = PropertyMock )
2261
- @patch ("charm.Patroni.get_primary" )
2262
- def test_set_active_status (self , _get_primary , _is_standby_leader , _member_started ):
2272
+
2273
+ def test_set_primary_status_message (harness ):
2274
+ with (
2275
+ patch ("charm.Patroni.member_started" , new_callable = PropertyMock ) as _member_started ,
2276
+ patch (
2277
+ "charm.PostgresqlOperatorCharm.is_standby_leader" , new_callable = PropertyMock
2278
+ ) as _is_standby_leader ,
2279
+ patch ("charm.Patroni.get_primary" ) as _get_primary ,
2280
+ ):
2263
2281
for values in itertools .product (
2264
2282
[
2265
2283
RetryError (last_attempt = 1 ),
2266
2284
ConnectionError ,
2267
- self .charm .unit .name ,
2268
- f"{ self .charm .app .name } /2" ,
2285
+ harness .charm .unit .name ,
2286
+ f"{ harness .charm .app .name } /2" ,
2269
2287
],
2270
2288
[
2271
2289
RetryError (last_attempt = 1 ),
@@ -2275,34 +2293,34 @@ def test_set_active_status(self, _get_primary, _is_standby_leader, _member_start
2275
2293
],
2276
2294
[True , False ],
2277
2295
):
2278
- self .charm .unit .status = MaintenanceStatus ("fake status" )
2296
+ harness .charm .unit .status = MaintenanceStatus ("fake status" )
2279
2297
_member_started .return_value = values [2 ]
2280
2298
if isinstance (values [0 ], str ):
2281
2299
_get_primary .side_effect = None
2282
2300
_get_primary .return_value = values [0 ]
2283
- if values [0 ] != self .charm .unit .name and not isinstance (values [1 ], bool ):
2301
+ if values [0 ] != harness .charm .unit .name and not isinstance (values [1 ], bool ):
2284
2302
_is_standby_leader .side_effect = values [1 ]
2285
2303
_is_standby_leader .return_value = None
2286
- self .charm ._set_active_status ()
2287
- self .assertIsInstance (self .charm .unit .status , MaintenanceStatus )
2304
+ harness .charm ._set_primary_status_message ()
2305
+ tc .assertIsInstance (harness .charm .unit .status , MaintenanceStatus )
2288
2306
else :
2289
2307
_is_standby_leader .side_effect = None
2290
2308
_is_standby_leader .return_value = values [1 ]
2291
- self .charm ._set_active_status ()
2292
- self .assertIsInstance (
2293
- self .charm .unit .status ,
2309
+ harness .charm ._set_primary_status_message ()
2310
+ tc .assertIsInstance (
2311
+ harness .charm .unit .status ,
2294
2312
ActiveStatus
2295
- if values [0 ] == self .charm .unit .name or values [1 ] or values [2 ]
2313
+ if values [0 ] == harness .charm .unit .name or values [1 ] or values [2 ]
2296
2314
else MaintenanceStatus ,
2297
2315
)
2298
- self .assertEqual (
2299
- self .charm .unit .status .message ,
2316
+ tc .assertEqual (
2317
+ harness .charm .unit .status .message ,
2300
2318
"Primary"
2301
- if values [0 ] == self .charm .unit .name
2319
+ if values [0 ] == harness .charm .unit .name
2302
2320
else ("Standby" if values [1 ] else ("" if values [2 ] else "fake status" )),
2303
2321
)
2304
2322
else :
2305
2323
_get_primary .side_effect = values [0 ]
2306
2324
_get_primary .return_value = None
2307
- self .charm ._set_active_status ()
2308
- self .assertIsInstance (self .charm .unit .status , MaintenanceStatus )
2325
+ harness .charm ._set_primary_status_message ()
2326
+ tc .assertIsInstance (harness .charm .unit .status , MaintenanceStatus )
0 commit comments