|
6 | 6 | # |
7 | 7 |
|
8 | 8 | import unittest |
| 9 | +import mock |
| 10 | +from juju.model import Model |
| 11 | +from juju.controller import Controller |
9 | 12 |
|
10 | 13 | from juju.offerendpoints import (LocalEndpoint, OfferEndpoints, OfferURL, |
11 | 14 | ParseError, maybe_parse_offer_url_source, |
@@ -90,3 +93,59 @@ def test_parse_local_endpoint_failures(self): |
90 | 93 | self.assertEqual(e.message, case) |
91 | 94 | except Exception: |
92 | 95 | 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