Skip to content

Commit 01982c9

Browse files
committed
Add unit test
1 parent da81293 commit 01982c9

3 files changed

Lines changed: 68 additions & 5 deletions

File tree

juju/model.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2539,10 +2539,7 @@ async def consume(self, endpoint, application_alias="", controller_name=None, co
25392539
controller name must be included in the endpoint. The controller_name
25402540
argument is being deprecated.
25412541
"""
2542-
if controller_name:
2543-
log.warning(
2544-
'controller_name argument will soon be deprecated, controller '
2545-
'should be specified in endpoint url')
2542+
25462543
if controller and controller_name:
25472544
raise JujuError("cannot set both controller_name and controller")
25482545
try:
@@ -2556,6 +2553,13 @@ async def consume(self, endpoint, application_alias="", controller_name=None, co
25562553
offer.user = self.info.username
25572554
endpoint = offer.string()
25582555

2556+
if controller_name:
2557+
log.warning(
2558+
'controller_name argument will soon be deprecated, controller '
2559+
'should be specified in endpoint url')
2560+
if offer.source == "":
2561+
offer.source = controller_name
2562+
25592563
if offer.source:
25602564
source = await self._get_source_api(offer)
25612565
else:

tests/integration/test_crossmodel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,4 @@ async def test_add_bundle():
188188
await model_2.deploy('local:{}'.format(tmp_path))
189189
await model_2.wait_for_idle(status="active")
190190

191-
await model_1.remove_offer("admin/{}.influxdb".format(model_1.name), force=True)
191+
await model_1.remove_offer("admin/{}.influxdb".format(model_1.name), force=True)

tests/unit/test_offerendpoint.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
#
77

88
import unittest
9+
import mock
10+
from juju.model import Model
11+
from juju.controller import Controller
912

1013
from juju.offerendpoints import (LocalEndpoint, OfferEndpoints, OfferURL,
1114
ParseError, maybe_parse_offer_url_source,
@@ -90,3 +93,59 @@ def test_parse_local_endpoint_failures(self):
9093
self.assertEqual(e.message, case)
9194
except Exception:
9295
raise
96+
97+
98+
class TestConsume(unittest.IsolatedAsyncioTestCase):
99+
@mock.patch.object(Model, 'connection')
100+
@mock.patch.object(Controller, 'disconnect')
101+
@mock.patch('juju.model._create_consume_args')
102+
@mock.patch('juju.client.client.ApplicationFacade.from_connection')
103+
async def test_external_controller_consume(self, mock_from_connection,
104+
mock_controller, mock_connection, mock_create_consume_args):
105+
""" Test consuming an offer from an external controller. This would be
106+
better suited as an integration test however pylibjuju does not allow
107+
for bootstrapping of extra controllers.
108+
"""
109+
110+
mock_create_consume_args.return_value = None
111+
mock_connection.return_value = None
112+
113+
mock_consume_details = mock.MagicMock()
114+
mock_consume_details.offer.offer_url = "user/offerer.app"
115+
mock_controller.get_consume_details = mock.AsyncMock(return_value=mock_consume_details)
116+
mock_controller.disconnect = mock.AsyncMock()
117+
118+
mock_facade = mock.MagicMock()
119+
mock_from_connection.return_value = mock_facade
120+
121+
mock_results = mock.MagicMock()
122+
mock_results.results = [mock.MagicMock()]
123+
mock_results.results[0].error = None
124+
mock_facade.Consume = mock.AsyncMock(return_value=mock_results)
125+
126+
m = Model()
127+
m._get_source_api = mock.AsyncMock(return_value=mock_controller)
128+
129+
# Test with an external controller.
130+
offer_url = "externalcontroller:user/offerer.app"
131+
await m.consume(offer_url)
132+
m._get_source_api.assert_called_once_with(parse_offer_url(offer_url))
133+
mock_controller.get_consume_details.assert_called_with("user/offerer.app")
134+
135+
# Test with an external controller and controller_name arg.
136+
offer_url = "externalcontroller:user/offerer.app"
137+
await m.consume(offer_url, controller_name="externalcontroller")
138+
m._get_source_api.assert_called_with(parse_offer_url(offer_url))
139+
mock_controller.get_consume_details.assert_called_with("user/offerer.app")
140+
141+
# Test with a local (mocked) controller.
142+
offer_url = "user/offerer.app"
143+
await m.consume(offer_url, controller=mock_controller)
144+
mock_controller.get_consume_details.assert_called_with("user/offerer.app")
145+
146+
# Test with an external controller with just controller_name. This will
147+
# soon be deprecated.
148+
offer_url = "user/offerer.app"
149+
await m.consume(offer_url, controller_name="externalcontroller")
150+
m._get_source_api.assert_called_with(parse_offer_url("externalcontroller:user/offerer.app"))
151+
mock_controller.get_consume_details.assert_called_with("user/offerer.app")

0 commit comments

Comments
 (0)